编译的程序是否有可能不包含实例化的模板类
Is it possible that a compiled program does not contain an instantiated template class?
请考虑以下代码:
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()
(?
类将被实例化,但编译器不得实例化任何成员函数定义 [temp.inst]/1:
[...] 当在需要完全定义的对象类型的上下文中引用专用化时,类模板专用化是隐式实例化的 [...]
[温度]/2:
类模板专用化的隐式实例化会导致声明的隐式实例化,但不会导致类成员函数的定义、默认参数或 noexcept-specier 的隐式实例化,[...]
编译的程序是否有可能不包含相关的
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;
}
允许编译器优化该代码。
是的,sizeof(( 不需要成员函数,因此它们很可能不会生成。所有大小的需求都是数据成员。
我构建了这段代码:
#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
我们可以看到没有生成与构造函数/析构函数关联的符号。
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 使用包含互斥锁的类的方法实例化 cpp11 线程
- 无法编译包含"if constexpr"的函数模板实例化
- 编译的程序是否有可能不包含实例化的模板类
- 在头文件中包含std::vector会导致模板实例化错误
- 如何在给定包含类的实例的情况下实例化嵌套类
- 包含自身实例化的模板,C++中的递归
- 在使用包含类的动态实例化后调用 c++ 重载运算符 [] 似乎不起作用
- 如何重定向头文件(到库)以在实例化中包含一些代码