当我使用类指针创建类时:
class A{
B* p_b1;
B* p_b2;
A(){}
}
我假设编译器为每个A实例生成至少2个指针大小的空间。我的问题是,如果它们不是指针而是直接的对象,如:
class A{
B b1;
B b2;
A(){}
}
编译器是否会在A类的内存空间中为b1和b2分配空间?或者它会在堆栈的其他地方声明实际的B类吗?
我问这个的原因是因为我试图减少我的代码中的内存分配,并且如果它会产生任何不同,就会徘徊。
答案 0 :(得分:4)
编译器是否会在A类的内存空间中为b1和b2分配空间?
是
或者它会在堆栈的其他地方声明实际的B类吗?
没有
我问这个的原因是因为我试图减少我的代码中的内存分配,并且如果它会产生任何不同,就会徘徊。
是的,它会有所作为。在堆栈上分配内存比从堆中分配内存更有效。如果可以的话,当性能成为一个问题时,更喜欢堆栈堆内存分配。
答案 1 :(得分:0)
实际上取决于。作为对象字段的任何内容都将以与对象相同的方式(在堆栈上或堆上的两者上)进行分配。如果您希望减少分配,可以考虑重用对象。您可以手动调用析构函数,然后调用placement new表达式来重用对象的内存。
另一方面,如果您希望简化减少所用堆栈的大小,则在构造函数中分配堆并在析构函数(RAII)中释放。