问题标签 [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 回答
469 浏览

c++ - c ++ Schwarz计数器与thread_local

我可以使用Schwarz counter(又名 Nifty counter)成语thread_local吗?(假设我全部替换staticthread_local

我需要这个(java jni 线程的助手):

在每个线程中首先构造,最后销毁。我可以this_thread->getEnv()从其他静态或 thread_local 对象的析构函数/构造函数中调用。

更新

https://stackoverflow.com/a/30200992 - 在这里,标准说 thread_local 析构函数在静态之前调用,我需要这个之后。

0 投票
2 回答
204 浏览

c++ - 存储指向静态变量的指针

我已经为 c++ 创建了一个单元测试框架,我想稍后将其移植到 C 中,但我遇到了一个单元测试根本无法运行的问题。单元测试在 .cpp 文件中创建,并且只有一个 .cpp 文件应该运行所有测试。

为了简化一点,这是通常创建测试的方式:

主文件

unit_test.hpp

测试.cpp

问题是:为什么它不运行 test.cpp 中定义的测试(如果我在 main.cpp 文件中创建测试,它们运行得很好)?我的猜测是问题出在我存储基指针的方式上,但我不知道。编译器是g++ 6.4.0

0 投票
1 回答
98 浏览

autotools - 在 Autoconf 测试中编译多个源文件

我正在为 GCCinit_priority和 MSC进行测试init_seg。我想制作一个测试以按特定顺序编译和链接两个源文件。

我无法找到有关使用AC_COMPILE_IFELSEor编译和链接两个源文件的信息AC_LINK_IFELSE。Autoconf 文档似乎没有讨论用例。搜索“带有两个源文件的 Autoconf 测试”之类的术语会返回不相关的结果。我想我可能错过了好的搜索词。

在 Autoconf 测试期间是否可以使用两个源文件?如果是这样,那我该怎么做?

0 投票
1 回答
401 浏览

c++ - 主线程中块范围静态与命名空间范围 thread_local 的初始化和销毁​​顺序

我试图了解在主线程上下文中具有静态存储持续时间和线程本地存储持续时间的命名空间范围和块范围对象的初始化和销毁​​的排序规则。考虑这两个类:

instance除了它们的静态成员函数的实现之外,它们是相同的:

Bar是一个 Meyers 单例,一个具有静态存储持续时间的块范围对象。

Foo的实例是具有线程本地存储持续时间的命名空间范围对象。

现在的main功能:

这是 GCC 8.1.0 和 Clang 5.0.0 的输出:

现场试用:https ://coliru.stacked-crooked.com/a/f83a9ec588aed921

我曾预计Foo会首先构建它,因为它在命名空间范围内。我想允许实现将初始化推迟到对象的第一次 odr 使用。我不知道它可以推迟到块作用域静态初始化之后,但我可以忍受。

现在我颠倒函数调用的顺序main

这是输出:

现在我已经将Foo实例的第一个 odr-use 移到了第一次调用 to 之前Bar::instance,并且初始化的顺序与我预期的一样。

但我认为对象应该按照初始化的相反顺序被销毁,这似乎没有发生。我错过了什么?

关于静态和线程本地存储持续时间的对象的初始化和销毁​​,cppreference 和标准说诸如“程序何时启动”、“线程何时启动”、“程序何时结束”和“何时线程结束”,但是这些概念在主线程的上下文中如何相互关联?或者更准确地说,第一个线程和最后一个线程?

在我的“真实”问题中,Foo记录器使用(线程本地),而基类的析构函数Bar使用记录器,所以这是一个静态破坏顺序惨败。产生了其他线程,但是Bar(Meyers 单例)在主线程中构造和销毁。如果我能理解排序规则,那么我就可以尝试解决“真正的”问题,而不必只是随机尝试。

0 投票
1 回答
87 浏览

c++ - 静态初始化惨败只发生在 C++ 中吗?

刚刚发现c++中有静态初始化惨败的问题,我只是好奇,这只是c++的问题吗?或者这个问题甚至在 C++ 中已经解决了?

0 投票
1 回答
600 浏览

c++ - 内联初始化的静态 const 类成员的初始化顺序保证

假设我有一个static const int类成员变量。它直接在类定义中初始化,但在 a 中没有定义.cpp(这没关系,因为它没有被 odr 使用)。

此外,假设这个常量在另一个类的构造函数初始化列表中使用,并且创建了另一个类的全局实例。

构造是否myType2GlobalInstance明确?换句话说:C++ 对static const类成员变量的静态初始化顺序有什么保证?

由于没有定义该常量,因此可能没有需要初始化的内存,并且该变量的行为更像是预处理器宏..但这可以保证吗?常量是否定义有区别吗?

如果成员变量是 ,它会改变什么static constexpr吗?

0 投票
1 回答
87 浏览

c++ - 调用另一个翻译单元的函数会导致静态初始化命令惨败

a.cpp

b.cpp

这是构造函数Bar

这会导致静态初始化订单惨败吗?如果是,我该如何解决。我想到了下面的东西:

但由于我不支持 C++11,静态本地初始化不是线程安全的。因此,这是行不通的。

另外如果barobj是非静态的怎么办。那我就不用担心这场惨败了吧?对于依赖于不同翻译单元中的另一个非静态对象初始化的非静态对象初始化来说,这不是问题。对?

0 投票
1 回答
160 浏览

c++ - C++20 `constinit` 可以免除对漂亮反制成语的需要吗?

引入 C++20constinit以避免静态初始化顺序惨败。

可以constinit放弃对漂亮的反习用语的需要(例如初始化std::cout)吗?

0 投票
0 回答
65 浏览

c++ - 模板类构造函数中外部常量的奇怪问题

我有以下三个源文件:

主.cc:

常量.cc:

常量.h:

当我编译并链接所有内容并运行可执行文件时,我得到:

是什么赋予了?Foo<42> 的构造函数怎么看不到 pi 的正确值?这似乎只在 Foo 是模板时才会发生,并且只有在 pi 定义在不同的文件中时才会发生。

值得我使用 g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0。所有都--std={c++,gnu++}{98,03,11,14,17}给出相同的结果。

TIA 为您解答。

0 投票
1 回答
70 浏览

c++ - 显式实例化模板的静态成员和另一个静态变量的初始化顺序

这是我的问题的简化形式(基于一个真实的库):

我的问题是,在这种情况下(单个翻译单元)是否可以保证——按照定义和实例化的顺序——在函数被调用X<int>::v_之前被初始化。init()


AFAIK,静态变量按其定义的顺序在单个翻译单元中初始化,但是模板和显式实例化可以改变它吗?如果那个显式实例化被移除了怎么办?或者,放在源代码的末尾?