c++ - 为什么行>列时数组的内存占用更大

标签 c++ c visual-c++

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

my result

最佳答案

您会看到小对象分配开销的结果。除了数组本身的四个整数之外,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/

相关文章:

c - 将文本文件中的字母存储到数组中

c++ - ''No such file or directory' 'cmake' 在 c++ 中从源代码生成 libssh 0.8.2 成功后?

visual-studio - 是否始终在 Visual Studio 中使用多核 (/MP) 标志?

C++虚类方法

c++ - C++中初始化列表的顺序

c++ - 如果另一个相同值的数组元素已经在 C++ 中回显,则防止循环回显

c++ - 如何劫持DLL来锁定Windows中的所有目录来验证

c++ - 是否可以从 FTP 地址添加到 visual studio 的包含路径?

c - 为什么指向函数的指针不强制执行该方法的签名

c++ - 微软 C/C++ : what is the definition of "strict conformance" w. r.t.执行?