【问题标题】:Initialization of inline static data内联静态数据的初始化
【发布时间】:2020-05-18 16:03:51
【问题描述】:

我想知道如何以及何时在 C++ 中初始化静态内联数据(例如在 gcc 或 clang 中)。我知道这是特定于某些架构的问题,与 C++ 标准无关。

我知道对于静态/全局非内联数据 gcc 使用 .init.fini 部分来构造和破坏具有此类限定符的对象,但这不适用于内联静态数据,因为它可以在许多翻译单元,因此init 部分最终会为单个对象执行许多初始化,这是错误的。

有人知道这个实现是如何工作的吗?

需要明确的是,我对那些内联变量的初始化实现感兴趣。

【问题讨论】:

  • “有人检查过吗”相信我,标准委员会(和其他人)已经完成了很多很多次。该标准准确地定义了规则。您需要做的就是“阅读”。
  • @JesperJuhl OP 询问的是 GCC/Clang(大概在 Linux/x86-64 上)中的实现,而不是标准。
  • @walnut 是的,我想知道内联变量是如何在 gcc/clang 中实现的。我知道标准告诉他们什么
  • @walnut 我认为实现是基于弱符号的,所以每个目标文件中都会有一个定义,链接器只选择一个符号。我不明白这个变量是如何初始化的这要复杂得多,因为只需要初始化一个实例

标签: c++ gcc clang c++17 inline-variable


【解决方案1】:

实现等同于函数局部静态的实现,同样“风险”被重复初始化:创建并检查一个额外的保护变量以使初始化只发生一次。这个过程的assembly 非常简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 2014-08-05
    • 1970-01-01
    相关资源
    最近更新 更多