Does new[] allocate memory contiguously?

时间:2017-09-15 14:23:01

标签: c++ new-operator

When I use the new[] keyword (or new-operator), does it allocate memory contiguously?

int* arr = new int[10];

I mean, is there any guarantee, that arr[0] and arr[1] are closely placed, and I can iterate through the arr using pointer increments? If so, does this behavior save with structs and classes instead of int?

2 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:2)

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

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

arr[i]

实际上只是

的简短形式
*( ( arr ) + (i) )

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

i[arr]

arr[i]完全相同(但如果你想混淆你的同事,你只会这样写。)

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