问题标签 [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.
c++ - std::thread::hardware_concurrency 和静态初始化
这个全局函数可能会遭受静态初始化失败吗?
c++ - 当涉及单例对象时克服静态初始化顺序失败
我在文件 xh 中定义了一个单例类
在 x.cpp 我有以下内容:
在 y.cpp 中,在另一个单例类的构造函数中,我有
我得到一个段错误,因为 y 在 x 之前被初始化。解决这个问题的正确方法是什么?我已经阅读了很多关于此的文章,但我仍然感到困惑。
gnu-make - 为目标制定目标
我有一个 C++ 库,它有一些 C++ 静态对象。该库可能会遭受 C++ 静态初始化失败。我试图通过*.o
在构建过程中随机化文件的顺序来审查不可预见的翻译单元依赖关系。
我访问了 GNU 手册中的2.3 How make Processes a Makefile,它告诉我:
目标是努力最终更新的目标。您可以使用命令行覆盖此行为(请参阅指定目标的参数)...
我也跟着9.2 Arguments to Specify the Goals,但没有提供治疗。这并不让我感到惊讶。
是否可以让 Make 随机化其目标?如果是这样,那我该怎么做?
如果没有,是否有任何替代方案?这是在测试环境中,所以我有更多可用的工具,而不仅仅是 GNUmake。
提前致谢。
c++ - 静态订单初始化惨败,iostream和C++11
根据 C++11 规范:
包含
<iostream>
在翻译单元中的结果应如同<iostream>
定义ios_base::Init
具有静态存储持续时间的实例一样。同样,整个程序的行为就好像至少有一个ios_base::Init
具有静态存储持续时间的实例
这意味着如果我的代码看起来像这样:
和
那么我应该可以安全地调用cerr
,而不会有静态初始化失败的风险。
不幸的是,该代码段错误......为什么?我不认为 gcc 6.2.1 决定忽略 C++11 规范,我将其包含<iostream>
在 A.cpp 中。根据规范应该足够了。
c++ - 使用 init_seg 时如何为三个 C++ 对象命名节/组?
我init_seg
用来控制三个 C++ 类对象的创建。每个对象位于不同的源文件/翻译单元中。调试显示在 CRT 初始化期间正在按预期创建对象。
对象按其源文件的字母顺序进行初始化。我想更改它,因为它不太正确。我访问了 MSDN 上的页面init_seg
,它指出用途是:
看起来lib
and的使用section-name
是互斥的,所以我不清楚如何使用init_seg(lib)
和提供部分/组名称来获得按字母顺序排列的权利。
当我尝试使用按字母顺序排列的字符串来控制顺序时:
它会导致警告,我猜这意味着事情不会按预期工作:
".CRT$XCB"
当我尝试直接使用、".CRT$001"
和".CRT$XCB001"
(以及使用字母顺序的其他变体)直接插入 CRT 启动代码时:
它导致另一个警告,我猜这意味着事情不会按预期工作:
我在 Stack Overflow 上发现了一个关于它的问题,但答案是猜测,它不包括多个翻译单元。我还在 Wayback Machine 上找到了KB104248的存档,但它也没有太大帮助,因为它只显示了compiler
,lib
和user
.
所以我的问题是,我如何利用init_seg
来控制在三个不同的源文件中创建三个对象的精确顺序?
c++ - 在 C++ 中,内置类型的简单初始化是否不受静态初始化顺序失败的影响?
我知道C++ 中
的静态初始化顺序失败以及第一次使用惯用语的构造来避免它。因此,在下面的代码中,全局赋值a
可能发生在 of 之前,foo::a
因此值a
未定义。另一方面,全局赋值b
是可以的,因为它调用了函数foo::b()
。
(想象一下,我在这里组合了foo.hpp
、foo.cpp
和main.cpp
。)但是作为内置类型或它们的数组的变量呢?因此,此代码中的c
、d
、e
和的全局分配是否安全?f
链接器似乎可以为这些变量设置内存,因此在运行时不需要进行初始化。但是我可以依靠这个吗?
我知道我不应该使用全局变量。但是,我是一个库(foo.cpp 和 foo.hpp)的作者,我无法控制我的库的用户(main.cpp 的作者)做什么。
c++ - 谷歌测试自动注册是否避免了静态初始化订单惨败?
使用带有 c++11 的 Google Test,如果测试是在不同的编译单元中定义的,那么自动注册机制是否容易受到静态初始化命令失败的影响?
如果不是,为什么不呢?
编辑添加:
具体来说:据我了解,该标准允许在进入main()
.
该UnitTest::GetInstance()
方法保证UnitTest
在第一次访问时创建注册表。但是,在注册任何测试之前,是什么阻止了第一次访问是调用 mainRun()
方法?main()
也许关键是它们是静态类成员,而不是静态自由变量?
c++ - C++11 中的延迟初始化顺序
考虑以下代码,分为三个编译单元:
a.h
:
a.cpp
:
b.cpp
:
c.cpp
:
代码使用 gcc (-std=c++11) 构建并运行良好,产生输出:
现在,参考cppreference.com:
延迟动态初始化
动态初始化是发生在主函数的第一条语句(对于静态)还是线程的初始函数(对于线程局部变量)之前,或者推迟到之后发生,这是实现定义的。
如果非内联变量的初始化延迟发生在主/线程函数的第一条语句之后,它发生在任何变量的第一次 odr 使用之前,该变量在与该变量相同的翻译单元中定义为静态/线程存储持续时间被初始化。如果给定的翻译单元没有使用任何变量或函数,则该翻译单元中定义的非局部变量可能永远不会被初始化(这模拟了按需动态库的行为)。但是,只要 TU 中的任何东西被 odr-used,所有初始化或销毁有副作用的非局部变量都将被初始化,即使它们没有在程序中使用。
请注意,a.cpp
不知道 and 的存在,B
并且& withC
的唯一交互是在它们各自实例的构造过程中的调用和。B
C
A
GetA()
A::Register()
据我所知,B
&C
实例不是 ODR 使用的,当然也不是来自main()
的翻译单元。他们的初始化显然有副作用,但在我看来,不能保证这种初始化会在进入之前发生main()
,或者在main()
打印注册的字符串之前发生 - 或者根本不发生。
所以 - 最后 -我的问题是:B
andC
实例在main()
打印注册字符串之前被初始化不是因为标准,而是因为 gcc 的实现定义的行为吗?
如果有标准保证,怎么保证?
c++ - 在 C++ 中,我可以使用来自不同文件的值安全地初始化 unordered_map 吗?
想象一下这样的代码:
如果我现在要在另一个文件中编写这样的代码:
还有一个:
在这种情况下, registerFoo 在程序初始化时被调用,但是 FooFactory 然后被清零,所以注册的函数消失了。
有没有办法让这项工作以一种安全、独立于编译器的方式工作(对于 c++14)?
c++ - IBM XL C/C++ 是否提供 init_priority?
我们使用 C++ 静态初始化顺序来控制 C++ 库中多个对象的构造。GCC 提供init_priority
,Microsoft 提供init_seg()
。
我正在寻找与 IBM 的 XL C/C++ 编译器类似的东西,但我的搜索结果没有显示有用的结果。编译器可在 Linux 和 AIX 上运行。显然 Linux 提供了该功能,但我不确定 AIX 运行时支持。
我的第一个问题是,AIX 平台是否支持初始化优先级?
我的第二个问题是,IBM 的 XL C/C++ 是否提供了一种通过源代码控制它的方法?