类成员的内存分配

seg*_*ara 2 c++ memory memory-management dynamic-memory-allocation

我的问题主要是理论上的。假设我们有一堂课

class A{
private:
    int * a;
    int b;
private:
    A(){
      a = new int[100];
      b = 100;
    }
   ~A(){
      delete [] a;
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,如果我们动态创建类型A的对象(A * a = new A()),该对象的内存将在堆中分配,如果我使用(A a),它将在堆栈中创建(A a)。如果在堆栈上为变量创建对象,则在堆上a分配变量;如果在堆栈上为对象分配对象,则在堆栈上分配对象b。我要确定的第一个问题是:我正确吗?

第二个问题是,将类的所有成员存储在堆内存或堆栈内存中会更有效吗?

class A{
    private:
        int * a;
        int * b;
    private:
        A(){
          a = new int[100];
          b = new int(100);
        }
       ~A(){
          delete [] a;
          delete b;
        }
    }
Run Code Online (Sandbox Code Playgroud)

当我说有效时,我的意思是所有关于类成员的数据都将彼此靠近地存储在堆或堆栈的内存中(实际上,我不确定它们将彼此靠近存储是正确的)。

Nat*_*ica 5

首先,C ++中没有堆或堆栈。相反,我们有自动存储时间和动态存储时间。具有自动存储持续时间的对象是作用域对象。当超出范围时,它将自动清除。另一方面,具有动态存储持续时间的对象不受其范围限制。它的生存期仅在由程序显式结束时结束(通常意味着调用delete)。

现在,A您将拥有一个具有自动存储期限的对象b,以及一个具有动态存储期限的对象a。这意味着bA实例将生活在任何实例中。 a也位于A实例中,但是它指向的内存将驻留在内存中的某个位置,但我们不知道在哪里。实例销毁后,b将自动清除它,但a需要在析构函数中进行特殊处理,否则内存将泄漏。您可以将其形象化

    A
+------+   +----------+
|   a->+---| 100 ints |
|   b  |   +----------+
+------+
Run Code Online (Sandbox Code Playgroud)

就效率而言,有些程序员花花公子提到过,您不必为此担心。您应该使用适合自己的类型。一旦启动并运行,就可以对其进行概要分析,以找到瓶颈所在的位置。如果由于使用指针而导致太多的高速缓存未命中,那么您可以尝试将数据本地化到类本身。

我也想提及一下,如果您发现自己在写作,some_type* name = new/new[]那么应该考虑使用std:unique_ptr<some_type>/std:unique_ptr<some_type[]>or std::vector<some_type>