gpt4 book ai didi

c++ - 全局空间定义的类的构造函数代码什么时候运行?

转载 作者:行者123 更新时间:2023-11-28 02:25:28 25 4
gpt4 key购买 nike

class TestClass
{
public:
int x, y;
TestClass();

};

TestClass::TestClass()
{
cout << "TestClass ctor" << endl;
}

TestClass GlobalTestClass;

int main()
{

cout << "main " << endl;


return 0;
}

在这段已知的代码中,第一个输出将是 "TestClass ctor"

我的问题:ctor 函数调用代码是在 main() 之前运行(我的意思是,入口点是否改变?),还是在 main() 之后和之前运行可执行语句还是有不同的机制? (对不起英语)

最佳答案

这个问题意义不大,因为

  • main 不是程序的机器代码级入口点(main 由相同的代码调用,例如执行非局部静态类类型变量的构造函数) , 和
  • “在 main() 之后和可执行语句之前”的概念意义不大:可执行语句 main.

通常,在实践中,您可以指望在具体示例中 main 之前初始化静态变量,但标准并不保证这一点。

C++11 §3.6.2/4:

It is implementation-defined whether the dynamic initialization of a non-local variable with static storage duration is done before the first statement of main. If the initialization is deferred to some point in time after the first statement of main, it shall occur before the first odr-use (3.2) of any function or variable defined in the same translation unit as the variable to be initialized.

main 的自动调用是否符合 odr-use 的条件是一个很好的观点。我不这么认为,因为 main 的一个特殊属性是它不能被调用(在有效代码中),而且它的地址不能被获取。

显然上面的写法是支持动态加载的库,并且构成了对此类库的唯一支持。

特别是,我会谨慎使用带有动态加载库的线程本地存储,至少在我进一步了解标准在这方面提供的保证之前是这样。

关于c++ - 全局空间定义的类的构造函数代码什么时候运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30823696/

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