new []キーワード(またはnew-operator)を使用すると、メモリを連続して割り当てますか?私が意味new []はメモリを連続して割り当てますか?
int* arr = new int[10];
、いかなる保証ARR [0]とARR [1]は密接に配置され、そしてIは、ポインタの増分を用いARRを反復することができることは、ありますか?もしそうなら、この動作はintではなくstructsとclassで節約できますか?
new []キーワード(またはnew-operator)を使用すると、メモリを連続して割り当てますか?私が意味new []はメモリを連続して割り当てますか?
int* arr = new int[10];
、いかなる保証ARR [0]とARR [1]は密接に配置され、そしてIは、ポインタの増分を用いARRを反復することができることは、ありますか?もしそうなら、この動作はintではなくstructsとclassで節約できますか?
C++標準絶対にがこれを保証します。
arr[0]
からarr[9]
は、要素間のパディングなしで連続しています。ポインタ演算は、割り当てられた領域で有効です。あなたはarr + 10
へのポインタを設定することができますが、はを逆参照しません。
これはのいずれかのクラスに適用されます。要素ごとに割り当てられるメモリの量は、sizeof(Y)
です。ここで、Y
は、クラスまたは通常の古いデータ型です。
はいはい、これらの要素は、(タイプに関係なく)コンプリメントメモリに配置されていることが保証されています。 new[]
に電話すると、配列が得られます。実際に要素にアクセスする唯一の方法は、ポインタ算術演算によるものです。
が実際に何を意味するのか考えてみましょうarr[i]
:
arr[i]
は本当に
*((arr) + (i))
本の風変わりなsideeffectの単なる短縮形である、である配列arr
とインデックスのためのi
i[arr]
は、とまったく同じです(ただし、あなたの同僚を混乱させたい場合にのみこれを書いてください)。
ただし、[]
はオーバーロードすることができ、その場合は実装が選択したものをすべて実行できます。それにもかかわらず、oeprator[]
がオーバーロードされたnew[]
で割り当てられた配列の要素は、連続したメモリに格納されます。
物理メモリは散在したページから割り当てることができますが、割り当てられたメモリの仮想アドレス空間は連続しています。 – rcgldr
@ DOUGLASO.MOEN:最近、私が言っているばかげたことだが、私は抵抗できません: 'std :: vector'の連続性はC++ 03以降でしか保証されていません。 – Bathsheba