new[] 是否连续分配内存?

Does new[] allocate memory contiguously?

当我使用 new[] 关键字(或 new-operator)时,它是否连续分配内存?

int* arr = new int[10];

我的意思是,是否可以保证 arr[0]arr[1] 位置很近,我可以使用指针增量遍历 arr?如果是这样,这种行为是否使用结构和 类 而不是 int 来保存?

C++ 标准绝对保证这一点。

arr[0]arr[9] 是连续的,元素之间不允许填充。指针算法在分配的区域中有效。您可以设置指向 arr + 10 的指针,但 不要 取消引用它。

这适用于任何 class。每个元素分配的内存量是 sizeof(Y),其中 Y 是 class 或普通旧数据类型。

是的,元素保证位于连续内存中(与其类型无关)。当您调用 new[] 时,您会得到一个数组,实际上访问元素的唯一方法是通过指针算法。

考虑一下 arr[i] 的实际含义:

arr[i]

实际上只是

的缩写形式
*( ( arr ) + (i) )

一个奇怪的副作用是,对于数组 arr 和索引 i

i[arr]

arr[i] 完全相同(尽管只有当你想混淆你的同事时才会这样写)。

但是,请注意 [] 可以重载,在这种情况下它可以执行实现选择的任何操作。尽管如此,分配有 new[] 且具有重载 oeprator[] 的数组也将在连续内存中拥有其元素。