问题标签 [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++ - c ++ Schwarz计数器与thread_local
我可以使用Schwarz counter(又名 Nifty counter)成语thread_local
吗?(假设我全部替换static
为thread_local
)
我需要这个(java jni 线程的助手):
在每个线程中首先构造,最后销毁。我可以this_thread->getEnv()
从其他静态或 thread_local 对象的析构函数/构造函数中调用。
更新
https://stackoverflow.com/a/30200992 - 在这里,标准说 thread_local 析构函数在静态之前调用,我需要这个之后。
c++ - 存储指向静态变量的指针
我已经为 c++ 创建了一个单元测试框架,我想稍后将其移植到 C 中,但我遇到了一个单元测试根本无法运行的问题。单元测试在 .cpp 文件中创建,并且只有一个 .cpp 文件应该运行所有测试。
为了简化一点,这是通常创建测试的方式:
主文件
unit_test.hpp
测试.cpp
问题是:为什么它不运行 test.cpp 中定义的测试(如果我在 main.cpp 文件中创建测试,它们运行得很好)?我的猜测是问题出在我存储基指针的方式上,但我不知道。编译器是g++ 6.4.0
autotools - 在 Autoconf 测试中编译多个源文件
我正在为 GCCinit_priority
和 MSC进行测试init_seg
。我想制作一个测试以按特定顺序编译和链接两个源文件。
我无法找到有关使用AC_COMPILE_IFELSE
or编译和链接两个源文件的信息AC_LINK_IFELSE
。Autoconf 文档似乎没有讨论用例。搜索“带有两个源文件的 Autoconf 测试”之类的术语会返回不相关的结果。我想我可能错过了好的搜索词。
在 Autoconf 测试期间是否可以使用两个源文件?如果是这样,那我该怎么做?
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 单例)在主线程中构造和销毁。如果我能理解排序规则,那么我就可以尝试解决“真正的”问题,而不必只是随机尝试。
c++ - 静态初始化惨败只发生在 C++ 中吗?
刚刚发现c++中有静态初始化惨败的问题,我只是好奇,这只是c++的问题吗?或者这个问题甚至在 C++ 中已经解决了?
c++ - 内联初始化的静态 const 类成员的初始化顺序保证
假设我有一个static const int
类成员变量。它直接在类定义中初始化,但在 a 中没有定义.cpp
(这没关系,因为它没有被 odr 使用)。
此外,假设这个常量在另一个类的构造函数初始化列表中使用,并且创建了另一个类的全局实例。
构造是否myType2GlobalInstance
明确?换句话说:C++ 对static const
类成员变量的静态初始化顺序有什么保证?
由于没有定义该常量,因此可能没有需要初始化的内存,并且该变量的行为更像是预处理器宏..但这可以保证吗?常量是否定义有区别吗?
如果成员变量是 ,它会改变什么static constexpr
吗?
c++ - 调用另一个翻译单元的函数会导致静态初始化命令惨败
a.cpp
b.cpp
这是构造函数Bar
这会导致静态初始化订单惨败吗?如果是,我该如何解决。我想到了下面的东西:
但由于我不支持 C++11,静态本地初始化不是线程安全的。因此,这是行不通的。
另外如果barobj
是非静态的怎么办。那我就不用担心这场惨败了吧?对于依赖于不同翻译单元中的另一个非静态对象初始化的非静态对象初始化来说,这不是问题。对?
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 为您解答。
c++ - 显式实例化模板的静态成员和另一个静态变量的初始化顺序
这是我的问题的简化形式(基于一个真实的库):
我的问题是,在这种情况下(单个翻译单元)是否可以保证——按照定义和实例化的顺序——在函数被调用X<int>::v_
之前被初始化。init()
AFAIK,静态变量按其定义的顺序在单个翻译单元中初始化,但是模板和显式实例化可以改变它吗?如果那个显式实例化被移除了怎么办?或者,放在源代码的末尾?