动态创建二维数组使用多少大小
Posted
技术标签:
【中文标题】动态创建二维数组使用多少大小【英文标题】: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 对,但我认为实现细节在这个问题中并不重要
【参考方案1】:
您有一个指针类型的自动变量(不包括循环变量)。因此,您使用 8 个字节的堆栈(在您的系统上)。
您动态分配一个包含 10 个指针的数组,因此堆上有 80 个字节。然后分配 10 个 10 个整数的数组,因此堆上多出 400 个字节,堆上总共有 480 个字节。
请注意,每个单独的动态分配必须与alignof(std::max_align_t)
对齐,因此可能需要为每个分配最多填充alignof(std::max_align_t) - 1
字节。分配器本身将使用一些内存进行内部表示,以允许以任意顺序有效地释放内存。自动变量可能需要填充到 alignof(int**) - 1
。
【讨论】:
以上是关于动态创建二维数组使用多少大小的主要内容,如果未能解决你的问题,请参考以下文章