这种类型的内存是否被分配到堆或栈上?

在C ++的上下文中(并不重要):

class Foo{
    private:
        int x[100];
    public:
        Foo();
}

我学到的东西告诉我,如果你像这样创建Foo的实例:

Foo bar = new Foo();

然后数组x被分配到堆上,但是如果您创建了Foo的实例,如下所示:

Foo bar;

然后它在堆栈上创建。

我无法在网上找到资源来确认这一点。


鉴于您的示例稍作修改:

class Foo{
    private:
        int x[100];
        int *y;
    public:
        Foo()
        {
           y = new int[100];
        }
        ~Foo()
        { 
           delete[] y; 
        }

}

例1:

Foo *bar = new Foo();
  • x和y在堆上:
  • sizeof(Foo *)在堆栈上创建。
  • sizeof(int)* 100 * 2 + sizeof(int *)在堆上

  • 例2:

    Foo bar;
    
  • x在栈上,y在堆上
  • sizeof(int)* 100在堆栈上(x)+ sizeof(int *)
  • sizeof(int)* 100在堆(y)上
  • 由于类/结构对齐,实际大小可能略有不同,具体取决于您的编译器和平台。


    严格地说,根据标准,对象不需要存在于堆栈或堆上。 该标准定义了3种类型的“存储时间”,但没有详细说明存储必须如何实现:

  • 静态存储时间
  • 自动存储时间
  • 动态存储时间
  • 自动存储持续时间通常(几乎总是)使用堆栈实现。

    动态存储持续时间通常使用堆实现(最终通过malloc() ),但即使编译器的用户也可以覆盖它。

    静态存储持续时间就是它通常所说的全局变量(或静态存储)。

    这个标准对这些事情有这样的说法(下面是摘录3.7节的各个位 - 存储持续时间):

    静态和自动存储持续时间与声明(3.1)引入的对象相关联,并由实现(12.2)隐式创建。 动态存储持续时间与用new new(5.3.4)创建的对象相关联。

    ...

    所有既没有动态存储时间也没有本地存储的对象具有静态存储持续时间。 这些对象的存储应该在程序的持续时间内持续(3.6.2,3.6.3)。

    ...

    显式声明自动或注册或不显式声明静态或外部的局部对象具有自动存储持续时间。 这些对象的存储会一直存在,直到它们所在的块退出。

    ...

    可以在程序执行期间(1.9),使用new-expressions(5.3.4)动态创建对象,并使用delete-expressions(5.3.5)销毁对象。 AC ++实现通过全局分配函数操作符new和operator new []以及全局释放函数操作符delete和operator delete []提供对动态存储器的访问和管理。

    ...

    该库为全局分配和释放函数提供默认定义。 一些全球分配和释放功能是可替换的(18.4.1)

    最后(关于你的例子中的数组):

    3.7.4子对象的持续时间[basic.stc.inherit]

    成员子对象,基类子对象和数组元素的存储持续时间是其完整对象(1.8)的存储持续时间。


    一个Foo类型的对象需要依次存储100个整数的大小。 如果你在堆栈上创建它,你将在堆栈中获得它。 如果你用新的做,它会作为对象的一部分堆在堆上。

    这是语言规范的一部分,我不确定你的问题是什么。

    链接地址: http://www.djcxy.com/p/14527.html

    上一篇: Does this type of memory get allocated on the heap or the stack?

    下一篇: PermGen Space in Java 6 was not a part of Heap Memory?