c++ - 动态创建二维数组时使用了多少大小

标签 c++

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

假设如果我在 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 字节吗 或者别的什么

最佳答案

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

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

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

关于c++ - 动态创建二维数组时使用了多少大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54311242/

相关文章:

c++ - 体系结构 x86_64 : Compiling in C++ 的 undefined symbol

c++ - Windows API 和 GetClassName()?另一个名字?

c++ - 如何修复命名空间 "std"在 VSCode 中没有成员 "sqrt"?

c++ - 结构原型(prototype)?

c++ - 如果双重注册,如何从 boost 树中删除 child ?

c++ - 使用 Android NDK 在 C++ 中对 gnuradio 的 undefined reference

c++ - reverse_iterator 是否继承自迭代器?

c++ - 与应用程序的链接错误

c++ - 如何在 Visual Studio 中正确设置 exe 的入口点?

c++ - 对签名数据进行逻辑右移