gpt4 book ai didi

c++ - "static initialization"到底是什么意思?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:04:36 25 4
gpt4 key购买 nike

我一直在阅读有关 C++11 中的 POD 的文章,我读过的几个地方都提到了支持静态初始化的 POD。例如:

On StackOverflow :

The idea of a POD is to capture basically two distinct properties:
1. It supports static initialization, and
2. Compiling a POD in C++ gives you the same memory layout as a struct compiled in C.

(只有粗体部分是相关的)

On Wikipedia :

A type that is trivial can be statically initialized.

显然我不明白什么是静态初始化。我认为制作全局变量是静态初始化的一个示例,但我可以执行以下操作,但 Foo 不是 POD:

#include <type_traits>
#include <iostream>

struct Foo {
Foo() : x(0), y(0) {}
int x;
int y;
};

struct Bar {
Bar() = default;
int x;
int y;
};

// Apparently the following two lines are not "static initialization" because
// Foo is non-POD yet we can still do this:
Foo f;
Bar b;

int main()
{
if (std::is_pod<Foo>::value) std::cout << "Foo is a POD" << std::endl;
else std::cout << "Foo is *not* a POD" << std::endl;

if (std::is_pod<Bar>::value) std::cout << "Bar is a POD" << std::endl;
else std::cout << "Bar is *not* a POD" << std::endl;
}

Output :

Foo is *not* a POD
Bar is a POD

那么到底什么是静态初始化,它与普通类有什么关系呢?例子会很棒。

最佳答案

静态初始化是使用编译时值初始化某些变量,这样该值最终被“烘焙到”可执行镜像中(不需要实际运行代码):

struct Foo {
int x;
int y;
};

Foo foo = { 0, 1 };

在上面的例子中,struct Foo 是 POD,所以编译器知道它的内存布局只是两个相邻的整数。它还知道 foo.x 应该初始化为 0foo.y 应该初始化为 1。这些信息足以生成foo 在编译时应该如何显示的“内存镜像”,并将其写入可执行镜像。

当图像稍后运行时,操作系统加载器将其内容映射到内存地址,并以这种方式使 foo“活着”。重要的是 foo 的“初始化”实际上已经在进程(包括您的代码以及来自 C/C++ 运行时的代码,它们首先运行)有时间执行之前完成甚至是单个 CPU 指令。

关于c++ - "static initialization"到底是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15094514/

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