我一直在阅读有关 C++11 中的 POD 的文章,我读过的几个地方都提到了支持静态初始化的 POD。例如:
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.
(只有粗体部分是相关的)
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
应该初始化为 0
,foo.y
应该初始化为 1
。这些信息足以生成foo
在编译时应该如何显示的“内存镜像”,并将其写入可执行镜像。
当图像稍后运行时,操作系统加载器将其内容映射到内存地址,并以这种方式使 foo
“活着”。重要的是 foo
的“初始化”实际上已经在进程(包括您的代码以及来自 C/C++ 运行时的代码,它们首先运行)有时间执行之前完成甚至是单个 CPU 指令。
关于c++ - "static initialization"到底是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15094514/