Возможно ли, что скомпилированная программа не содержит экземпляра класса шаблона?

Рассмотрим этот код:

template <typename T>
class A {
T x;
// A bunch of functions
};

std::size_t s = sizeof(A<double>);

Предположим, sizeof Оператор является единственным местом, где создание экземпляров A<double> необходимо. Возможно ли, что скомпилированная программа не содержать соответствующий код для A<double> (например. A<double>::~A())?

11

Решение

Будет создан экземпляр класса, но компилятор не должен создавать экземпляр какого-либо определения функции-члена, [temp.inst] / 1:

[…] специализация шаблона класса неявно создается, когда на специализацию ссылаются в контексте, требует полностью определенного типа объекта[…]
[Temp.inst] / 2:

Неявная реализация специализации шаблона класса вызывает неявная реализация деклараций, но не определений, аргументы по умолчанию или noexcept-speciers функций-членов класса, […]

12

Другие решения

Возможно ли, что скомпилированная программа не содержит соответствующего кода для A<double> (например. A<double>::~A())?

Конечно, это возможно.

std::size_t s = sizeof(A<double>);

это просто операция времени компиляции, и не требует никакого экземпляра времени выполнения A<double>, так что нет необходимости в конструкторах, деструкторах или других соответствующий код.


Даже если бы были явные экземпляры кода функции шаблона следующим образом

 if(sizeof(A<double>) <= 4) {
A<double> a; // Instantiation of constructor and destructor
a.x = 3.5;
}

компилятору разрешено оптимизировать этот код.

2

Да, sizeof () не нуждается в функциях-членах, и поэтому они не могут быть сгенерированы. Все размеры потребностей являются членами данных.

0

Я построил этот код:

#include <cstddef>template <typename T>
class A {
T x;
// A bunch of functions
};int main(const int argc, const char* argv[])
{
std::size_t s = sizeof(A<double>);
}

И, запустив objdump, я получаю такой вывод:

$ objdump -t a.out

a.out:  file format Mach-O 64-bit x86-64

SYMBOL TABLE:
0000000100000000 g     F __TEXT,__text  __mh_execute_header
0000000100000f90 g     F __TEXT,__text  _main
0000000000000000         *UND*  dyld_stub_binder

Где мы можем видеть, что никакие символы, связанные с конструктором / деструктором, не были сгенерированы.

0
По вопросам рекламы [email protected]