问题标签 [static-order-fiasco]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
73 浏览

c++ - 在类内初始化变量时,我们是否有静态初始化顺序惨败

我正在尝试将我们的旧代码从 c++98 重构为 c++14。并且需要使用较旧的 gcc(c++98) 和较新的 gcc(c++14) 进行编译。这就是我们的旧代码的样子(这完全是我们复杂代码的示例。这个类的静态常量在另一个类中使用)。

看起来从 c++11 开始,只有 ints 和 enums 只允许在类声明中初始化。

问题:通过像上面那样在类声明中初始化静态 const 变量,是否可以避免静态初始化顺序惨败?看起来像上面的代码,我们从来没有观察到这个静态初始化顺序问题,如果我移动静态双精度并浮动到 .cpp 文件,我应该担心这个问题吗?

0 投票
0 回答
19 浏览

c++ - 如果所有静态变量都在编译时初始化,如何观察二进制文件

阅读了静态初始化命令惨败后,我才知道,

  1. 静态变量的初始值可能在编译期间被评估并烧入可执行文件的日期部分
  2. 如果静态变量的初始值不能在编译时计算,编译器将执行零初始化。

问题:

  1. 静态初始化顺序惨败问题是否会出现在 const 初始化中,即如果在编译期间评估变量?

  2. 我想知道是否有可能打开编译的二进制文件并验证初始化变量,从而确保避免静态初始化顺序惨败问题?

0 投票
0 回答
59 浏览

c++ - 是否保证在所有翻译单元中具有静态存储持续时间的所有对象之前初始化 std::cout?

类似于这个问题,但现在我有两个翻译单元:

如果我在本地使用 编译这两个g++ -std=c++17 a.cpp b.cpp,则会导致a.exe崩溃。我的编译器版本g++ (Rev2, Built by MSYS2 project) 10.3.0在 Windows 上。我也可以通过编译来重现这种g++ -std=c++17 b.cpp a.cpp行为g++-10 (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0

我相信这是因为b.cpp不包括在任何<iostream>东西static_object之前被构造,特别是a.cpp对应std::ios_base::Init的提供<iostream>。因此,当print_hello()被调用时,std::cout尚未初始化,因此崩溃。

最后一个问题是:C++17 是否保证std::cout在所有具有静态存储持续时间的“用户提供”(因为缺少更好的词)对象被初始化之前初始化?实验表明并非如此。

0 投票
0 回答
64 浏览

c++ - 关于静态初始化惨败的问题(isocpp常见问题解答中的混淆)

有一个很好的常见问题解答(isocpp)只是说明了为什么我们可能不能使用静态对象而不是静态指针来避免 Fiasco 问题。我在答案中遇到了一个让我头疼的句子

.... 通过将声明从 更改static X* xp = new X();static X xp;,我们仍然可以正确处理初始化情况,但我们不再处理取消初始化情况。例如,如果有 3 个静态对象,比如 a、b 和 c,在它们的析构函数中使用 ans,那么避免静态去初始化灾难的唯一方法是 ifxp在这三个对象之后都被销毁。

主文件

其他.cpp

然后他们继续:

要点很简单:如果有任何其他静态对象的析构函数可能xpxp被破坏后使用,砰,你就死定了。

我只是无法理解这个问题是如何发生的。我需要一个实际的例子来说明这个问题是如何发生的。

0 投票
2 回答
117 浏览

c++ - C++ Nifty Counter 成语如何保证静态初始化和静态反初始化

在学习 isocpp 时,我遇到了一个FAQ。其中说:“什么是保证静态初始化和静态反初始化的技术?” 简短的回答只是暗示:

简短的回答:使用 Nifty Counter Idiom(但请确保您了解重要的权衡!)。

到目前为止,我无法理解Nifty Counter Idiom是什么意思以及它如何解决 Fiasco 问题。我已经知道Construct On First Use Idiom及其在使用静态对象或静态指针时的副作用(包装在返回引用的全局函数中)

这是一个实际上容易出现 Fiasco 问题的简单示例:

这里,它提到了 Nifty Counter Idiom 的主要用途

意图:确保非本地静态对象在第一次使用前被初始化,并且仅在对象最后一次使用后被销毁。

现在我需要的是,Nifty Counter Idiom具体如何解决上述代码中的静态订单初始化和反初始化,而不管其他解决方法为constinit. 鉴于上述程序是这样编译的:

~$ g++ x.cpp y.cpp && ./a.out>> 10

~$ g++ y.cpp x.cpp && ./a.out>> 0

0 投票
1 回答
50 浏览

c++ - 关于静态初始化订单惨败的问题

我目前正在阅读旧版 Nicolai Josuttis 关于 C++ 模板的书。我的问题是关于这里SortTracer实现的静态数据成员的初始化。

具体来说,在 中tracer.hpp,我们有:

上述静态数据成员的初始化在tracer.cpp

测试代码在这里

我的问题/困惑是:这个程序不会遭受静态初始化命令的失败吗?(也就是说,即使程序目前产生了正确的结果,这是由于静态数据成员的tracer.cpp初始化与默认初始化相同)