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?
答案 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[]
的数组也会将其元素放在连续的内存中。