2013-06-18 28 views
4

我想了解POD类型以及它们如何在堆栈中分配和初始化。 鉴于用户定义的类对象的堆栈分配

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

class B { 
public: 
    int x; 
}; 

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

我是在说B分配之后,但之前的初始化正确?我的意思是 的空间分配为A和B的顺序,他们已宣告但在空间分配,当它被宣布为初始化b的初始化 ?

我读到荚一个很好的常见问题,在这里汇总 What are Aggregates and PODs and how/why are they special?

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

所以我想了解POD如何分配和初始化的细节以及 与非POD不同的细节。

+0

其实这没有链接,因为你没有一个定义为'A :: A()',如果你做了,'A'不会POD因为它有一个用户提供的默认构造函数。 –

+0

是的,它的伪代码。 B是一个吊舱,A不是。 –

+0

哦,对,我明白了。那么,在对象被定义之前,生命期不能开始......“获得存储”隐含在对象定义中。在此之前内存可能已经存在的事实并不重要。 –

回答

9

a被分配和第一初始化,并且b被分配和第二初始化。 C++程序按语句执行。由于内存是自动,无论如何都没有明确的分配 - 这一切都是自动处理的。

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

2

你必须为零内存中分配A和B的订单的任何形式的保证。

如果A和B都具有构造函数,一个的会前B的调用。但是你所问的POD类型(以及哪个B)并没有使用这种语法初始化,所以问题是没有意义的。

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

0

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

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