2012-04-03 8 views
6

L'aggiornamento di un'applicazione da 32 a 64 bit aumenta la dimensione del puntatore e il footprint di memoria degli oggetti.Ottimizzazione del layout di memoria delle istanze di classe in C++

Sto cercando metodi per ridurre il più possibile l'impronta di memoria degli oggetti. Per le strutture POD, scarico il layout di memoria della struttura per capire come impacchettare i membri e ridurre il riempimento del compilatore.

C'è un modo per capire il layout di memoria degli oggetti non POD come le istanze di classe? Come posso ottenere qualcosa di simile al confezionamento di oggetti di classe?

Grazie, Dan

+1

in generale ci sarà essere i flag e le direttive specifiche del compilatore e i campi di riordino possono avere un effetto. Tuttavia, tutto ciò può influire sulle prestazioni e sull'interoperabilità – sehe

+0

Quale compilatore stai utilizzando? –

+0

@dbbd btw perché sei preoccupato delle dimensioni della memoria di processo nell'architettura a 64 bit? un'architettura a 64 bit può supportare un'enorme dimensione di memoria virtuale. a differenza dell'arco a 32 bit – weima

risposta

1

Non so su specifici non-POD oggetti di dati (vale a dire vtable), anche se suppongo che è dettata dalla dimensione del puntatore. In ogni caso, è possibile controllare l'allineamento dei membri con la direttiva del compilatore #pragma pack supportata sia da GCC sia da Visual Studio.

È inoltre possibile leggere il paragrafo 7.18 sulla splendida Agner Fog C++ optimize guide:

I dati membro di una classe o di una struttura sono memorizzati consecutivamente nell'ordine in cui essi sono dichiarati ogni volta che viene creata un'istanza della classe o della struttura . Non c'è penalità di prestazioni per l'organizzazione dei dati in classi o strutture. L'accesso a un dato membro di una classe o di un oggetto struttura non richiede più tempo rispetto all'accesso a una variabile semplice. maggior parte dei compilatori si allineeranno membri di dati agli indirizzi rotonde al fine di ottimizzare l'accesso

4

È possibile utilizzare GCC di -Wpadded di informarvi dove si aggiunge imbottitura, quindi riordinare sulla base di tali informazioni, la riduzione delle dimensioni in alcuni casi.

Forza: il riempimento dei dati non è una buona idea per le rappresentazioni in memoria.

0

Regola empirica: dal più grande al più piccolo; questo dà un perfetto allineamento quando le dimensioni degli elementi sono di due potenze, altrimenti sono possibili ottimizzazioni manuali.

Si noti che il corretto allineamento è di solito essenziale per la velocità, anche se la CPU recupera da violazioni. Mentre la x86 e la (AFAIK) x64 CPU hanno disallineato l'accesso della mano internamente con una seconda lettura, il tempo "sprecato" in una lettura di disallineamento è di solito molto più grande del tempo risparmiato a causa di un set di lavoro più piccolo. Quindi "confeziono strettamente" solo quando esegui confronti su più CPU.

Per i non POD, è necessario controllare gli sizeof(element).
(Se ci sono tonnellate di oggetti, probabilmente sarei andare con un semplice parser generare il C++ per eseguire il dump queste dimensioni)

In alternativa, PVS-Studio ha un'analisi delle dimensioni struct e dà suggerimenti riordino. Non li ho ancora considerati molto, ma potresti usare la valutazione per scoprire se funziona per te.

+0

Il riordino dei membri non è un'opzione facile poiché ci sono molti codificatori/decodificatori e altre cose su RPC che sono sempre un grosso problema. Inoltre, per un'applicazione legata all'IO, le prestazioni della CPU non sono importanti. Preferirei impacchettare e perdere la CPU piuttosto che ottenere prestazioni e memoria insufficiente, in particolare per questo tipo di applicazioni legate all'IO. – dbbd

0

In relazione agli oggetti non POD, penso che dovresti leggere di più su vTable, funzione virtuale, ereditarietà virtuale per sapere quali cose conducono le dimensioni della classe o dell'oggetto.In effetti, l'allineamento di classe che riempie, l'allineamento dei membri della classe solo uno dei fattori determina la dimensione della classe.

Qui ci sono alcuni siti Web correlati, penso che possa esserti utile.

  1. Determinare la dimensione di oggetto di classe: il layout http://www.cprogramming.com/tutorial/size_of_class_object.html

  2. Memoria: http://www.phpcompiler.org/articles/virtualinheritance.html

E, se si utilizza MVSC, è possibile scaricare tutto il layout di memoria di tutte le classi nella soluzione con -d1reportAllClassLayout in questo modo:

cl -d1reportAllClassLayout main.cpp 
Problemi correlati