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[]
的数组也将在连续内存中拥有其元素。
当我使用 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[]
的数组也将在连续内存中拥有其元素。