Попытка понять, что происходит с таблицей символов, когда конструктор / деструктор класса встроен по сравнению с реализованным в. cpp файле. Вот код:
class.hpp
class Class
{
public:
#ifdef CUSTOM_CTOR
#ifdef HEADER_IMPL
Class(){ }
virtual ~Class(){}
#else
Class();
virtual ~Class();
#endif
#endif
private:
void init();
};
class. cpp
#include "class.hpp"
#ifdef CUSTOM_CTOR
#ifndef HEADER_IMPL
Class::Class () {}
Class::~Class() {}
#endif
#endif
void Class::init(){ }
Я компилирую код в объектный файл, а затем проверить его с помощью nm
. Вот результаты:
$ clang++ class.cpp -c -DCUSTOM_CTOR -DHEADER_IMPL -o class.o
$ nm class.o
0000000000000000 T __ZN5Class4initEv
$ clang++ class.cpp -c -DCUSTOM_CTOR -o class.o
$ nm class.o
00000000000000cc s GCC_except_table4
U __Unwind_Resume
00000000000000c0 T __ZN5Class4initEv
0000000000000020 T __ZN5ClassC1Ev
0000000000000000 T __ZN5ClassC2Ev
0000000000000070 T __ZN5ClassD0Ev
0000000000000050 T __ZN5ClassD1Ev
0000000000000040 T __ZN5ClassD2Ev
00000000000000f8 S __ZTI5Class
0000000000000108 S __ZTS5Class
00000000000000d8 S __ZTV5Class
U __ZTVN10__cxxabiv117__class_type_infoE
U __ZdlPv
U ___gxx_personality_v0
Таблица символов для кода, когда конструктор и деструктор встроены, не имеет ни typeinfo
, ни vtable
. Почему это происходит (платформа macOS)?
(также компиляция с использованием конструктора / деструктора по умолчанию дает результаты, как в случае с встроенным конструктором).