gpt4 book ai didi

c++ - C++中用户定义类型的静态初始化

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

我知道有很多关于什么是静态变量和初始化顺序的内容,这更进一步。

假设在 1 CPP 中,以下几行:

struct A
{
void* a;
size_t b;
};

static bool bMyBoolean = true;
static std::vector<A> myVector;

这里保证bMyBooleanmyVector之前被初始化。它们也在 main() 被调用之前被初始化。
但是,myVector 具有有效值和内存地址,但会在 _initterm 期间初始化,而 bMyboolean 会更早初始化,并且在 initterm 期间不需要初始化调用。

这是因为它看起来是原生类型,但我找不到关于此行为的任何引用或信息。

一些上下文:例如,当我重载 malloc 时,并且为用户定义的类型调用构造函数时,它将进入 malloc,但是您的一些静态这里的数据还没有准备好(这是预期的,因为不能保证翻译单元之间的静态变量)但这意味着我可以安全地访问和更改它,然后它会被重新初始化。

这让我想到了下一个问题,那么这段内存存放在哪里?
是否就地重建?
由于正在进行 malloc 调用,因此它会被初始化。这是否意味着 native 变量位于程序启动时分配的静态堆中,而用户定义的类型位于堆中?

如果是这样,您如何跟踪声明为静态的用户定义类型?

最佳答案

那是因为C++标准区分了三种类型的初始化:

  • 零初始化
  • 常量初始化
  • 动态初始化。

§ 3.6.2

  1. Variables with static storage duration or thread storage duration shall be zero-initialized before any other initialization takes place.

    Constant initialization is performed:

    • if each full-expression (including implicit conversions) that appears in the initializer of a reference with static or thread storage duration is a constant expression and the reference is bound to an lvalue designating an object with static storage duration or to a temporary
    • if an object with static or thread storage duration is initialized by a constructor call, if the constructor is a constexpr constructor, if all constructor arguments are constant expressions (including conversions), and if, after function invocation substitution, every constructor call and full-expression in the mem-initializers and in the brace-or-equal initializers for non-static data members is a constant expression
    • if an object with static or thread storage duration is not initialized by a constructor call and if every full-expression that appears in its initializer is a constant expression.

    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.

你说的是常量初始化(静态初始化的一部分),它不限于内置类型。

如果您想了解更多信息,请熟悉标准的 3.6.2 部分:“非局部变量的初始化”


[...] but it means I can access and alter it safely, and then it gets re-initialized.

当然 - 只要操作系统允许,您始终可以修改特定内存位置下的内容。把它想象成 placement new - 为这样的对象分配了内存,但是在初始化阶段会调用构造函数。所以它是“就地”初始化的。

Does it mean the native variables live in a static heap that is allocated at boot of the program, and the user defined types live on the heap?

没有。变量类型与其位置之间没有直接联系。局部变量放在堆栈上,动态变量(通过 malloc()/new 分配)位于堆内,静态变量位于镜像内(例如 MyApp .exe). app执行后加载到内存中,包括所有静态存储的对象,此时预留内存。只要 main() 正在运行,您就可以认为此类对象有效。

关于c++ - C++中用户定义类型的静态初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29853235/

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