Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译器如何为类分配内存?_C++_Class_Memory Management - Fatal编程技术网

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

C++ 编译器如何为类分配内存?,c++,class,memory-management,C++,Class,Memory Management,当我使用类指针创建一个类时,如下所示: class A{ B* p_b1; B* p_b2; A(){} } 我假设编译器为每个实例生成至少2个指针大小的空间。我的问题是,如果它们不是指针,而是像这样的直向对象: class A{ B b1; B b2; A(){} } 编译器会在类的内存空间中为b1和b2分配空间吗?或者它会在堆栈的其他地方声明实际的B类 我问这个问题的原因是因为我试图减少代码中的内存分配,并且怀疑这是否会产生任何影响 编译器

当我使用类指针创建一个类时,如下所示:

class A{
    B* p_b1;
    B* p_b2;
    A(){}
}
我假设编译器为每个实例生成至少2个指针大小的空间。我的问题是,如果它们不是指针,而是像这样的直向对象:

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

我问这个问题的原因是因为我试图减少代码中的内存分配,并且怀疑这是否会产生任何影响

编译器会在类的内存空间中为b1和b2分配空间吗

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

没有

我问这个问题的原因是因为我试图减少代码中的内存分配,并且怀疑这是否会产生任何影响


是的,这会有所不同。在堆栈上分配内存要比从堆中分配内存有效得多。如果可以,当性能成为问题时,最好使用堆栈而不是堆来分配内存。

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


另一方面,如果您希望简单地减少所使用的堆栈的大小,那么在构造函数中对堆进行分配,在析构函数()中取消分配。

堆栈上的其他位置是什么意思?在您的示例中,b1、b2是在堆栈上创建的。若您想减少内存分配,那个么使用更少的对象(包括在堆上创建的对象),而且编译器从不分配空间。运行时间可以@Nandu是的,但机器需要为每个对象在堆栈上分配内存。因此,我不得不问,它是否会将分配推广到覆盖所有对象。本质上是“共享”堆栈分配。x86机器不需要为每个对象在堆栈上分配内存。静态分配和使用堆是可选的。您的体系结构是什么?内存必须分配到某个位置,因此如果不减少内存中所需的内容量,就无法减少分配。也许你指的是动态内存分配?或者你说的是内核分配的内存页的数量?这不取决于问题吗?ex:vector of objects Vs vector of pointers-stack Vs heap第二个示例即使在堆上创建类A的对象也更有效,因为它将导致一个堆分配,而不是三个。@Nandu,当您有一个vector of object时,堆栈上没有多少。大部分内存都在堆上。如果您有一个指针向量,那么您有两个级别的堆内存,一个用于为向量的“数据”分配的内存,另一个用于对象本身。true。但您提到当性能成为问题时,更喜欢堆栈而不是堆。这如何适应不断增长的向量(或STL容器)的上下文??在这些情况下,堆上有对象难道不能提供更好的性能吗???@Nandu,当使用向量时,您没有选择“数据”分配到哪里的权利,它总是在堆上。这并没有比使用堆栈内存创建的数组提供更好的性能。它还为您带来了其他好处--动态调整大小、创建更大阵列的能力,让您想起。但它的性能不会比在堆栈上创建数组更好。