LINUX.ORG.RU

Разъясните по G++...


0

0

Доброе время суток...

Есть вот такая програмка:
class Papa {
public:
~Papa();
};

Papa::~Papa() {}

int main()
{
Papa papa;
return 0;
}

После компиляции:
c++ tst.cc

Дизасемблирую с помощью objdump:
objdump -Cd a.out

...
0804837c <Papa::~Papa()>:
804837c: 55 push %ebp
804837d: 89 e5 mov %esp,%ebp
804837f: c9 leave
8048380: c3 ret
8048381: 90 nop
8048382: 89 f6 mov %esi,%esi

08048384 <Papa::~Papa()>:
8048384: 55 push %ebp
8048385: 89 e5 mov %esp,%ebp
8048387: c9 leave
8048388: c3 ret
8048389: 90 nop
804838a: 89 f6 mov %esi,%esi
...

Внимание, вопрос: почему деструктор встречается 2 раза?...
Проверял на GCC 3.4.4 и GCC 4.0.1 из FC3 и FC4.

anonymous

Да уж кривизна.... Более того если деструктор объявить как виртуальный, то деструкторов станет аж 3!!!!

aton
()
Ответ на: комментарий от Selecter

А вот мои результаты расследования :)

Метод вида
Papa::myMethod() {}
сам по себе появляется в исполняемом файле, даже если не создавать объект класса.

Встроенный метод класса появляется только, если вызвать функцию объекта класса.

Selecter ★★★★
()
Ответ на: комментарий от Selecter

Фигня, посмотри в самы конец листинга, или покажи всем

aton
()
Ответ на: комментарий от Selecter

Selecter : Метод вида Papa::myMethod() {} сам по себе появляется в исполняемом файле, даже если не создавать объект класса.

Добавляю в фортунки..

MKuznetsov ★★★★★
()

>Дизасемблирую с помощью objdump:

а нахрена?
не проще ли попросить gcc сгенерировать ассемблерный листинг?
да не забудь посмотреть с -O2 и -O0

fghj ★★★★★
()
Ответ на: комментарий от fghj

>> -O2 и -O0 тут не причем, читай выше по ссылке - это как оказалось извесная проблема

aton
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.