【问题标题】:How much size is used on dynamically creating a 2d array动态创建二维数组使用多少大小
【发布时间】:2019-01-22 15:13:52
【问题描述】:

我想知道动态创建二维数组时分配了多少大小

假设如果我在 c++ 中动态创建一维数组,它会像

int* p = new int[10];

这意味着堆内存中有 40 个字节,堆栈内存中有 8 个字节(根据我的编译器) 但我很困惑如果我制作二维数组将分配多少内存 喜欢(对于 10*10 二维数组)

int** p = new int*[10];
for(int i = 0; i < 10; i++) {
    p[i] = new int[10];
}

将在我的堆栈和堆中分配多少内存 堆栈中是 80 字节,堆中是 400 字节吗 或者别的什么

【问题讨论】:

  • 请注意,动态分配的数组可能有未指定的内存开销,sizeof 数组对象没有反映出来。
  • 不要像那样写二维数组。使用具有 2D 访问权限的 1D 数组。
  • 如果指针为8字节,int为4字节,则栈上为8字节,堆中为8*10 + 4*10*10字节
  • @IłyaBursov 不止于此。
  • @MatthieuBrucher 对,但我认为实现细节在这个问题中并不重要

标签: c++


【解决方案1】:

您有一个指针类型的自动变量(不包括循环变量)。因此,您使用 8 个字节的堆栈(在您的系统上)。

您动态分配一个包含 10 个指针的数组,因此堆上有 80 个字节。然后分配 10 个 10 个整数的数组,因此堆上多出 400 个字节,堆上总共有 480 个字节。

请注意,每个单独的动态分配必须与alignof(std::max_align_t) 对齐,因此可能需要为每个分配最多填充alignof(std::max_align_t) - 1 字节。分配器本身将使用一些内存进行内部表示,以允许以任意顺序有效地释放内存。自动变量可能需要填充到 alignof(int**) - 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-22
    • 2011-08-14
    • 2019-02-10
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多