2010-06-05 4 views
11

Есть ли способ распечатать макет объекта C++ с помощью компилятора g ++ или любым другим способом. Упрощенный пример (предполагая, что ИНТ занимает 4 байта)Макет печати объекта C++ с компилятором g ++

class A{ 
    int a; 
}; 

class B:public A{ 
    int b; 
} 

поэтому выход будет

A- 
0  4 
+ a + 

B- 
0  4  8 
+ A.a + b + 

Было бы полезно, чтобы понять расположение объектов (в моем случае виртуальный машинный код).

Заранее спасибо.

С уважением, Zaheer

ответ

0

C++ не имеет самоанализ. Как только ваш код будет скомпилирован, каждая часть информации о классах будет потеряна, за исключением того, что могут дать вам typeid и std::type_info.

+2

Я не думаю, что он говорит об интроспекции времени выполнения, но о некоторой опции компилятора, которая может рассказать ему о макете памяти, выбранной компилятором для объектов в его коде. –

10

Возможно, посмотрите на страницы руководства, -fdump-class-hierarchy?

2

Информация, которую вы ищете, требуется отладчиками и испускается для них при компиляции с помощью -g. На ELF/DWARF платформах (например, Linux), вы можете увидеть, что там, выполнив:

g++ -g -c foo.cc 
readelf -w foo.o 

На других платформах objdump -g foo.o может работать.

Для ELF/DWARF, pahole выглядит как хорошее место для начала.