关于c ++:对象的内存分配

memory allocation for objects

当我们在函数中实例化一个变量,如EDCOX1,0,(x是一个局部变量)时,它被分配在进程的栈顶上。但是,如果我们执行int *x= new int,空间将以堆的形式提供。

所以,我的问题是:

  • 不同类的对象(C++提供的类还是用户定义的)呢?他们的对象在哪里被实例化?例如:让Employee是一个类,我们声明Employee emp;emp给定的空间在哪里?>堆栈上还是堆中?

  • 如果声明int a[4]在一个函数中,那么a的所有四个单元在堆栈上都有空间吗?


  • 所有局部变量,无论是来自类的内置类型,还是它们是数组,都在堆栈上。所有动态分配都在堆中。

    当然,像static这样的局部变量修饰符会使变量被放在其他地方,所以在函数调用之间保留它。

    另外,为了进一步混淆,当您创建一个本地指针变量,并使它指向一个动态分配的对象时,例如。

    1
    Class* a = new Class;

    实际变量a在堆栈上,但它指向的内存在堆栈上。

    附录:C++规范实际上没有提到堆栈或堆的任何东西,只是不同类型变量的行为。


    它和普通类型完全一样。

    1
    2
    Class a; //stack. Usage: a.somethingInsideOfTheObject
    Class *a = new Class(); //heap. Usage: a->somethingInsideOfTheObject

    请注意,如果类本身正在堆上分配某些内容,则该部分将始终位于堆上,例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class MyClass
    {
    public:
        MyClass()
        {
            a = new int();
        }
    private:
        int * a;
    };

    void foo()
    {
        MyClass bar;
    }

    在这种情况下,将在堆栈上分配bar变量,但其中的a将在堆上分配。


  • 这要看情况而定。如果Employee有只在堆栈上分配的成员,那么整个对象是。但是,Employee可能有指针成员,Employee的构造函数可以在堆上为它们分配内存。然后一些成员在堆上,一些在堆上。

  • 对。


  • 用户定义的类(和类型)与内置类型没有区别。所以

    1
    2
    Employee emp; // allocated in stack
    Employee* emp = new Employee(); // allocated in heap

    至于第二个问题,本地数组是在堆栈上分配的

    1
    Employee emp[4]; // 4 instances on stack

    通常,如果编译器在编译时知道它(即局部变量),那么它就在堆栈中。如果编译器在编译时不知道它(即通过newmalloc等进行动态分配),它就在堆中。

    本文有一个详细的解释:global-memory-management-in-c-in-stack-or-heap