堆栈分配用户定义的类对象

时间:2013-06-18 16:27:21

标签: c++

我正在尝试了解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和聚合的非常好的常见问题解答 What are Aggregates and PODs and how/why are they special?

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

所以我正在尝试了解如何分配和初始化POD以及如何进行POD的细节 与非POD不同。

3 个答案:

答案 0 :(得分:9)

没有。首先分配并初始化a,然后分配b并初始化第二个。 C ++程序是逐语句执行的。由于内存是自动,因此无论如何都没有明确的分配 - 它都是自动处理的。

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

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

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