gpt4 book ai didi

c++ - 除非引用,否则不会创建模板类的静态成员

转载 作者:行者123 更新时间:2023-12-05 06:55:14 24 4
gpt4 key购买 nike

#include <iostream>

template <typename T>
class Temp {
public:
static Temp temp;
Temp() { std::cout << "hi!"; }
};

// Definition.
template <typename T>
Temp<T> Temp<T>::temp;

我创建了一个简单的模板类。我认为实例化 Temp 对象足以在 Temp 中构造静态 temp

int main() {
Temp<int> t;
}

但这只返回了一个“嗨!”。

而如果我显式引用 temp

int main() {
Temp<int> t;
Temp<int>::temp;
}

它打印出“嗨!”两次,我可以确认静态对象是在其通常的初始化时间(调用 main 之前)创建的。编译器省略静态对象构造的标准是什么?另外,除了引用它之外,我该如何强制执行它?

最佳答案

您可以显式实例化该类,使其更有可能包含 static 成员而不引用它:

template class Temp<int>;

但是请注意,根据编译器/链接器选项,未引用的代码不一定包含在最终二进制文件中。特别是,任何使用对象注册某些东西的尝试都注定要失败!例如,对于大型构建,为函数和对象使用专用部分是很常见的,而 ELF 链接器将只包含引用的部分。

模板通常只在需要时实例化。通常这意味着它们被引用(标准中的“ODR-used”)。您可以使用显式实例化强制实例化,如上所示。但是,即使在编译器实例化之后,链接器也可以丢弃未使用的代码。当然,从您的角度来看,将对象注册到某个注册表的东西不是“未使用的代码”,但从链接器的角度来看它是未使用的代码。链接器通常根据部分工作,而这些部分又通常基于文件,但可以选择指定部分或强制编译器生成更细粒度的部分以减小可执行文件的大小。

关于c++ - 除非引用,否则不会创建模板类的静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65419337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com