4

我试图了解 POD 类型以及它们是如何在堆栈上分配和初始化的。给定

class A {
public:
  A();
  int x;
};

class B {
public:
    int x;
};

int func()
{
    A a;
    B b;
}

我是否正确地说 b 在 a 之后分配但在 a 之前初始化?我的意思是按照声明的顺序为 a 和 b 分配空间,但是在分配空间时初始化 b 并在声明时初始化 a?

我在这里阅读了关于 POD 和聚合的非常好的常见问题解答 什么是聚合和 POD 以及它们如何/为什么特别?

他说的其中一件事是:非 POD 类类型的对象的生命周期从构造函数完成时开始,到析构函数完成时结束。对于 POD 类,生命周期从对象的存储被占用时开始,并在该存储被释放或重用时结束。

所以我试图了解如何分配和初始化 POD 的细节,以及它与非 POD 的不同之处。

4

3 回答 3

9

编号a先分配初始化,后b分配初始化。C++ 程序是逐语句执行的。由于内存是自动的,因此无论如何都不会发生显式分配——这一切都是自动处理的。

(例如,在桌面操作系统上使用的典型调用堆栈实现中,内存一直存在,并且根本不需要分配,只需处理。)

于 2013-06-18T16:31:25.440 回答
2

对于分配 A 和 B 的内存顺序,您有任何形式的零保证。

如果 A 和 B 都有构造函数,则 a 将在 b 之前调用。但是您要询问的 POD 类型(以及 B 是哪个)根本没有使用这种语法进行初始化,所以这个问题没有实际意义。

无论如何,与何时分配存储相关的对象初始化问题没有多大意义。例如,这里的大多数编译器将在单个堆栈指针移动中为 A 和 B 分配空间。鉴于符合标准的 C++ 程序无法检测到这样的事情(这甚至意味着什么?),但编译器几乎可以做任何它想做的事情。

于 2013-06-18T16:31:45.757 回答
0

这些是局部变量,它们不是常识中的“分配”,你可以认为它们在那里。(如何实现;常见的方法是使用处理器支持的堆栈。在这种情况下,所有本地对象的所有存储都在函数入口处的堆栈上获取)。

初始化总是按照声明的顺序发生。这里的意思是 A::A() 被 a 调用,然后 B::B() 被 b 调用。

于 2013-06-18T16:42:46.150 回答