int **arr_a;//4x268435456
arr_a = new int*[4];
for (int i = 0; i < 4; i++) {
arr_a[i] = new int[268435456];
for (int j = 0; j < 268435456; j++) {
arr_a[i][j] = j;
}
}
int **arr_b;//268435456x4
arr_b = new int*[268435456];
for (int i = 0; i < 268435456; i++) {
arr_b[i] = new int[4];
for (int j = 0; j < 4; j++) {
arr_b[i][j] = j;
}
}
理论上:
arr_a:
sizeof(int**) + 4 * sizeof(int**) + 4 * 268435456 * sizeof(int)
=4G
arr_b :
sizeof(int**) + 268435456 * sizeof(int*) + 268435456 * 4 * sizeof(int)
=6G
但在实践中:
arr_a = 4G
arr_b = 10.6G ???为什么......
环境:win10 64位 32G RAM VS2017
最佳答案
您会看到小对象分配开销的结果。除了数组本身的四个整数之外,new int[4]
还会在这两个区域产生开销:
- 最小分配大小 - 分配器返回的数据 block 具有最小大小,通常至少为 32 字节,您仅使用其中的 16 字节
- 簿记 - 除了为您提供内存之外,分配器还会存储一小块数据,以帮助它在您调用
delete[]
时执行正确的操作。
这两项开销会增加您所需的内存量:
268435456 * sizeof(int*)
在 64 位系统上为 2G- 假设最小分配量为 32 字节,
268435456 * 32
又是 8G
当您处理大型对象时,例如 arr_a 的元素,与分配大小相比,开销非常小,您可以安全地忽略它:我们正在谈论的只有五个分配4G总分配量约为几百字节。当对象较小时,额外的分配与“有效负载”的大小相当,在某些极端情况下甚至可能超过它。
关于c++ - 为什么行>列时数组的内存占用更大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43559494/