问题标签 [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 投票
2 回答
358 浏览

c++ - 在给定的翻译单元中,文件级静态变量的顺序是否始终相同?

我有一个程序分成两个源文件:

例子.cpp

示例__ main.cpp

该程序的输出是否保证为:

在所有平台和编译器上?如果是这样,它在标准中的什么地方这么说?如果我使用命名空间firstsecond出现在不同的命名空间中,这有关系吗?如果它们不是静态的并且我使用的是匿名命名空间呢?

0 投票
1 回答
910 浏览

c++ - 静态初始化命令惨败:同一个编译单元?

所以我正在用 ANTLR 构建一个语法编译器,一些生成的代码如下所示:

如您所见,这符合“静态初始化顺序惨败”的描述。

问题是这个项目的目标之一是生成的 C++ 代码可以作为基础,尽可能容易地进行进一步的语法编译。

这就是为什么“首次使用时构造”范式在这种情况下可能会出现问题:区分静态变量或静态函数会更加困难。

现在我已经多次阅读,如果这些静态变量在单个编译单元中初始化,则不存在问题。

所以我有这个想法,将所有这些冲突的情况移到一个单独的.cpp 文件中,这些文件由它们的依赖项排序。

为这些冲突情况生成的代码如下所示:

我的问题是:这行得通吗?

0 投票
3 回答
2239 浏览

c++ - 使用对象引用正确初始化对象的静态数组而不会遇到初始化顺序惨败

我试图通过简单地使用其成员是键和值的元素数组来实现轻量级映射。地图内容在编译时是已知的,因此我考虑使用固定大小的数组,如下所示:

现在我的问题是:代码片段按预期工作,但我不知何故有一种感觉,我依赖初始化顺序让 ITEM1 到 ITEM4 在使用 ItemMapUser::map 之前对其内容进行初始化。我搜索了许多与此主题相关的问题(尤其是那些带有 static-order-fiasco 标签的问题),但找不到与数组使用相关的任何问题。

  • 会不会遇到初始化命令惨败?
  • 如果不是,是什么阻止它在这里发生?
  • 我使用数组是否重要?const Item anotherItem = ITEM1;如果我尝试使用例如初始化一个简单的变量会是什么样子?
0 投票
3 回答
157 浏览

c++ - 为什么静态初始化顺序惨败会这样称呼?

由于静态初始化涉及零初始化和使用常量表达式的初始化,根据 C++03 标准,我看不出那里可能会出现哪些惨败。

那么,为什么要使用这样的名称,而不是例如“[Dynamic] Initialization Order Fiasco”?

编辑:

这实际上是一个反问,但我发现我的英语太弱了,无法自我回答。我也松散地使用“静态初始化”作为“所有初始化发生之前”的捷径main()。但是由于“静态”术语已经超载,我写下了这个问题:

  • 提醒一下,“静态初始化”在标准中有一个正式的定义。
  • 收集此措辞的任何历史或轶事原因。
  • 对于任何真正被看似悖论弄糊涂的人。
0 投票
2 回答
1185 浏览

c++ - c++静态初始化命令惨败

我目前正在学习 C++,但遇到了一些麻烦。

我已经通过使用大量开发了一个程序#define,但我想static const改用(碰撞/类型/范围......)。

所以,我现在有类似的东西:

file1.hpp

file1.cpp

file2.cpp

我的代码编译时没有警告/错误(使用 -W -Wall -Wextra -Werror 标志编译)。

但是,当我尝试运行它时,会导致段错误。

我用 valgrind 运行它,它给了我以下输出:

因此,段错误发生在 arrayOfString 实例化期间。我认为问题在于 arrayOfInt 是在常量之前分配的。但在那种情况下,是否可以为此目的使用 static const ?

我不知道如何修补这个问题。我做错了吗?有更好的方法吗?如何解决这个问题?

0 投票
1 回答
1370 浏览

c++ - 对从静态实例引用的类模板的静态成员的未定义引用

请看以下内容:

所以看起来Blob Blob::prototype;崩溃是因为Factory<0>::map尚未实例化,所以我尝试用以下行实例化它:

但它不会编译(使用 GCC 4.8.1):

0 投票
3 回答
6893 浏览

c++ - 防止静态初始化命令“惨败”,C++

一旦我阅读了一个很棒的C++ 常见问题解答(真的很好!!)并阅读了有关如何防止静态初始化命令“惨败”的主题。所以作者建议将静态变量包装成函数,从而通过维护变量的创建顺序来防止“惨败”。但这在我看来是一个粗鲁的解决方法。所以我的问题是,是否有任何现代的、更面向模式的方法来防止这种“惨败”,而是将“静态的东西”包装到函数中???

0 投票
1 回答
79 浏览

linker-errors - 静态初始化命令惨败:我们如何确保只有在 Protobuf 完成后才能链接库 X?

我们有 2 个库 - Google Protobuf(4.2 版)和一个库“X”.. X 的特定对象在初始化时使用 protobuf 的某些功能,从而导致我们的应用程序崩溃,因为库 X 首先被链接,然后Protobuf .. 我们如何确保只有在 Protobuf 完成后才能链接库 X?我们是否有一些链接器选项/标志来做同样的事情?

0 投票
1 回答
561 浏览

c++ - 在程序中显示静态 C++ 对象的初始化顺序?

我试图让对象转储打印静态 C++ 对象的构造顺序。我找到-h了标题,但我似乎无法让 objdump 更进一步。

没有编译的程序init_priority

用编译的程序init_priority

我很确定我的下一步是检查.initand .init_array,但我似乎无法让对象转储来做到这一点:

如何在编译的程序中显示静态 C++ 对象的初始化顺序?


如何验证 C++ 静态对象初始化顺序的 init_priorty?我知道我可以使用objdump -hor获取有关它的一些信息readelf -S

例如,我可以看到init_priority与目标文件关联的值:

上面,我看到init_priority它的值存在于目标文件 ( .init_array.00275) 中,但它并没有告诉我任何关于变量或链接到程序中的最终顺序的信息。


我们最近切换到 GCC's init_priority,所以我尝试添加一个 QA 步骤以确保对象的顺序在它生效时是指定的。我还想查看对象在init_priority不生效时的顺序。


这对我们来说仍然是一个问题;由于添加了新的自测试,我们无法在正确的时间初始化特定的字符串,即使init_priority目标文件按照它们应该被初始化的确切顺序进行布局(请参阅如何强制链接器遵守目标文件顺序?)。

现在在 Binutils 邮件列表中显示库或程序中静态 C++ 对象的初始化顺序有一个悬而未决的问题?

0 投票
0 回答
397 浏览

c++ - 如何强制链接器遵守目标文件顺序?

我在未初始化的阅读中发现了 Valgrind 的发现。我确切地知道它的来源——它是在具有存储类的文件中std::string声明的空。cppstatic

具有std::string的存储分配的目标文件在静态存档中首先列出。

此外,我将链接配方修改为以下内容(我知道它看起来很傻):

上面library.a列出了第一次以确保std::string静态初始化程序是第一个运行的初始化程序。library.a再次列出以确保可以找到测试对象的所有符号,因为这些是单通道链接器。

从 OS X 和 Linux 上的 Valgrind 结果来看,链接器似乎不尊重目标文件顺序和静态初始化。

我有两个问题。首先,如何强制 Apple 的链接器尊重目标文件的顺序?其次,我如何强制 GNU 的链接器尊重目标文件的顺序?


我们不能使用链接器脚本。GCC 的人特别告诉人们不要使用它们。另外,我不确定 Apple 平台上的格式。


对于它的价值,这是一个后备,以防万一init_priority不可用。不幸的是,它在许多平台上都不可用。只有现代 GNU 链接器拥有它,而 Apple 完全没有它。

(我们的测试可以追溯到很长一段时间,从带有 GCC 3.2 的 Fedora 1 到 Windows 2000)。