2017-09-15 18 views
8

new []キーワード(またはnew-operator)を使用すると、メモリを連続して割り当てますか?私が意味new []はメモリを連続して割り当てますか?

int* arr = new int[10]; 

、いかなる保証ARR [0]ARR [1]は密接に配置され、そしてIは、ポインタの増分を用いARRを反復することができることは、ありますか?もしそうなら、この動作はintではなくstructsとclassで節約できますか?

+4

物理メモリは散在したページから割り当てることができますが、割り当てられたメモリの仮想アドレス空間は連続しています。 – rcgldr

+0

@ DOUGLASO.MOEN:最近、私が言っているばかげたことだが、私は抵抗できません: 'std :: vector'の連続性はC++ 03以降でしか保証されていません。 – Bathsheba

答えて

11

C++標準絶対にがこれを保証します。

arr[0]からarr[9]は、要素間のパディングなしで連続しています。ポインタ演算は、割り当てられた領域で有効です。あなたはarr + 10へのポインタを設定することができますが、を逆参照しません。

これはのいずれかのクラスに適用されます。要素ごとに割り当てられるメモリの量は、sizeof(Y)です。ここで、Yは、クラスまたは通常の古いデータ型です。

+0

struct/classの最後にパディングがあり、正しい整列が得られます。しかし、sizeofにはパディングが含まれるので、配列は連続しています。 – Sergei

+0

@ DOUGLASO.MOEN 'sizeof()'でパディングの有無を検出する方法を提案しますか? –

+0

sizeof(YourClass)とsizeofの合計(各データメンバー) – Sergei

2

はいはい、これらの要素は、(タイプに関係なく)コンプリメントメモリに配置されていることが保証されています。 new[]に電話すると、配列が得られます。実際に要素にアクセスする唯一の方法は、ポインタ算術演算によるものです。

が実際に何を意味するのか考えてみましょうarr[i]

arr[i] 

は本当に

*((arr) + (i)) 

本の風変わりなsideeffectの単なる短縮形である、である配列arrとインデックスのためのi

i[arr] 

は、とまったく同じです(ただし、あなたの同僚を混乱させたい場合にのみこれを書いてください)。

ただし、[]はオーバーロードすることができ、その場合は実装が選択したものをすべて実行できます。それにもかかわらず、oeprator[]がオーバーロードされたnew[]で割り当てられた配列の要素は、連続したメモリに格納されます。

+1

私の答えからテキストを借りることに害はありません - それは複数の答えがある場合に最もよく働きます。 – Bathsheba

+0

また、 '[]'表記に集中しているのであれば、それが過負荷になる可能性があることを指摘したいかもしれません。 – Bathsheba

+0

素敵なメモのためのTy。私はちょうど実際の実装なしに、簡単な質問をしようとした –

関連する問題