2017-09-15 124 views
8

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

int* arr = new int[10]; 

我的意思是,是否有任何保证,即ARR [0]ARR [1]紧密放置,我可以通过使用指针增量ARR迭代?如果是这样,这种行为保存与结构和类而不是int?

+4

物理内存可以从分散的页面分配,但分配的内存的虚拟地址空间将是连续的。 – rcgldr

+0

@ DOUGLASO.MOEN:对我来说这些天来说是一件愚蠢的事情,但我无法抗拒:自从C++ 03以来,'std :: vector'连续性才得到保证。 – Bathsheba

回答

11

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

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

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

+0

您将在结构/类的末尾获得填充以获得正确的对齐。但sizeof将包含填充,所以是的,数组将是连续的。 – Sergei

+0

@ DOUGLASO.MOEN你如何建议用'sizeof()'检测填充的存在? –

+0

sizeof(YourClass)vs sizeof(每个数据成员)的总和 – Sergei

2

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

考虑一下arr[i]实际上意味着:

arr[i] 

真是

*((arr) + (i)) 

的这种古怪的sideeffect只是一个缩写形式,是一个数组arr和索引i

i[arr] 

与完全相同(尽管如果你想混淆你的同事,你只会写这个)。

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

+1

从我的答案中借用文本没有什么坏处 - 如果有多个答案,那么最好的方法是最好的。 – Bathsheba

+0

另外,如果你专注于'[]'表示法,你可能想指出它可能被重载。 – Bathsheba

+0

Ty为漂亮的笔记。我只是试图提出一个简单的问题,而没有实际的实施 –