C/C ++のポインターのメモリオーバーヘッド
質問
私は64ビットプラットフォームにいるので、すべてのメモリADRは8バイトです。
したがって、配列のメモリ使用量の推定値を取得するには、配列の各エントリのサイズ(データ型)に8バイトを追加する必要があります。
例:
short unsigned int *ary = new short unsigned int[1000000]; //length 1mio
//sizeof(short unsinged int) = 2bytes
//sizeof(short unsinged int*) = 8 bytes
それでは、各エントリは10バイトを取りますか?したがって、私の1mioの長さアレイは、少なくとも10メガバイトを使用しますか?
ありがとう
解決
いいえ、すべての配列インデックスにポインターが表示されません。アレイを指す単一のポインターを取得します。これは、隣接するメモリブロックです。そのため、インデックスのアドレスをインデックス自体と配列アドレスから計算できます。
たとえば、変数の場合 a
メモリの場所で知られています 0xffff0012
に設定されています 0x76543210
, 、その後、彼らは次のように記憶に置かれる可能性があります。
+-------------+ This is on the stack or global.
0xffff0012 | 0x76543210 |
+-------------+
+-------------+ This is on the heap (and may also
0x76543210 | a[ 0] | have some housekeeping information).
+-------------+
0x76543212 | a[ 1] |
+-------------+
0x76543214 | a[ 2] |
+-------------+
0x76543216 | a[ 3] |
+-------------+
: :
+-------------+
0x7672B68E | a[999999] |
+-------------+
そして、あなたはインデックスのアドレスを見ることができます n
は 0x76543210 + n * 2
.
したがって、実際には、8バイトのポインターと100万の2バイトのショートパンツがあり、あなたの場合は合計2,000,008バイトです。
これは何よりも上にあります malloc
ポインター自体のように、実際の配列と比較して非常に極小であるハウスキーピングオーバーヘッド。
他のヒント
いいえ、ここには1つのポインターのみがあり、エントリごとのポインターはありません。サイズの見積もりは1000000*2 + 8です。
所属していません StackOverflow