编译器如何为类分配内存?

时间:2015-11-07 02:22:41

标签: c++ class memory-management

当我使用类指针创建类时:

class A{
    B* p_b1;
    B* p_b2;
    A(){}
}

我假设编译器为每个A实例生成至少2个指针大小的空间。我的问题是,如果它们不是指针而是直接的对象,如:

class A{
    B b1;
    B b2;
    A(){}
}

编译器是否会在A类的内存空间中为b1和b2分配空间?或者它会在堆栈的其他地方声明实际的B类吗?

我问这个的原因是因为我试图减少我的代码中的内存分配,并且如果它会产生任何不同,就会徘徊。

2 个答案:

答案 0 :(得分:4)

  

编译器是否会在A类的内存空间中为b1和b2分配空间?

  

或者它会在堆栈的其他地方声明实际的B类吗?

没有

  

我问这个的原因是因为我试图减少我的代码中的内存分配,并且如果它会产生任何不同,就会徘徊。

是的,它会有所作为。在堆栈上分配内存比从堆中分配内存更有效。如果可以的话,当性能成为一个问题时,更喜欢堆栈堆内存分配。

答案 1 :(得分:0)

实际上取决于。作为对象字段的任何内容都将以与对象相同的方式(在堆栈上或堆上的两者上)进行分配。如果您希望减少分配,可以考虑重用对象。您可以手动调用析构函数,然后调用placement new表达式来重用对象的内存。

另一方面,如果您希望简化减少所用堆栈的大小,则在构造函数中分配堆并在析构函数(RAII)中释放。