Встроенный конструктор C ++ и таблицы символов - PullRequest
0 голосов
/ 30 января 2020

Попытка понять, что происходит с таблицей символов, когда конструктор / деструктор класса встроен по сравнению с реализованным в. 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)?

(также компиляция с использованием конструктора / деструктора по умолчанию дает результаты, как в случае с встроенным конструктором).

...