gpt4 book ai didi

c++ - 在拥有的翻译单元发生静态初始化之前,文件范围的静态对象是否已初始化为零?

转载 作者:太空狗 更新时间:2023-10-29 20:04:29 25 4
gpt4 key购买 nike

在文件 maybe_use_foo.cpp 中:

namespace {
class Foo { /* ... */ };
Foo* const the_foo = new Foo;
}

void funtion_callable_from_another_tu_during_process_wide_initialization() {
// If we haven't yet run static initialization for this TU,
// but some other static initializer called us, ignore the request.
if (!the_foo)
return;

// OK, static initializers for this TU have run, foo exists, use it.
the_foo->doSomething();
}

那么,不管上面的方法是否可取,它总是有效吗?在我看来,它假设静态在 TU 运行的静态初始化之前被零初始化。 C++ 标准(C++03?C++11?)是否保证了这一点?

提出该问题的另一种方法是询问当被解释为 Foo* 时,在“the_foo”的存储中保存的值序列是什么。它绝对是 {NULL/nullptr, new Foo},还是 {undefined, new Foo},甚至是其他东西?

请不要建议其他组织方式:我不是在寻找如何更好地做到这一点的建议,我是在寻找对技术合法性的更深入理解。

最佳答案

C++11

[basic.start.init]/2

Variables with static storage duration (3.7.1) or thread storage duration (3.7.2) shall be zero-initialized (8.5) before any other initialization takes place.

[...]

Together, zero-initialization and constant initialization are called static initialization; all other initialization is dynamic initialization. Static initialization shall be performed before any dynamic initialization takes place.

也就是说,是的,变量是零初始化的,但不,它们不是在静态初始化之前进行零初始化(但作为静态初始化的一部分)。


OP 中的函数只会在动态初始化期间调用,因为它不会在零初始化期间调用,并且必须是 constexpr 函数才能成为常量初始化的一部分。

关于c++ - 在拥有的翻译单元发生静态初始化之前,文件范围的静态对象是否已初始化为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19658609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com