当我使用new[]关键字(或new运算符)时,它是否会连续分配内存?
int* arr = new int[10];
我的意思是,是否有保证arr[0]和arr[1]紧密放置,并且我可以使用指针增量迭代arr?如果是这样,那么结构体和类行为是否与int相同?
int* arr = new int[10];
我的意思是,是否有保证arr[0]和arr[1]紧密放置,并且我可以使用指针增量迭代arr?如果是这样,那么结构体和类行为是否与int相同?
C++标准绝对保证了这一点。
arr[0]
到arr[9]
是连续的,在元素之间不允许有填充。在分配的区域中,指针算术运算是有效的。您可以将指针设置为arr + 10
,但是不要对其进行解引用。
这适用于任何类。每个元素分配的内存量为sizeof(Y)
,其中Y
是类或普通数据类型。
sizeof()
来检测填充的存在? - François Andrieux是的,这些元素保证在连续内存中(与它们的类型无关)。当您调用new[]
时,您会得到一个数组,实际上访问元素的唯一方法是通过指针算术。
考虑一下arr[i]
实际上意味着什么:
arr[i]
实际上只是的缩写形式
*( ( arr ) + (i) )
arr
和一个索引i
。i[arr]
arr[i]
与[]
完全相同(尽管您只会写这个代码来困惑您的同事)。
但是,请注意,[]
可以被重载,在这种情况下,它可以执行任何实现选择的操作。然而,使用new[]
分配的数组,如果有重载的oeprator[]
,其元素也将在连续的内存中。
[]
符号,你可能想指出它可以被重载。 - Bathsheba
std::vector
的连续性才得到保证。 - Bathsheba