4

私は 64 ビット プラットフォームを使用しているため、すべてのメモリ アドレスは 8 バイトです。

したがって、配列のメモリ使用量を見積もるには、配列内の各エントリの sizeof(DATATYPE) に 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 メガバイトを使用しますか?

ありがとう

4

2 に答える 2

33

いいえ、すべての配列インデックスのポインターを取得することはできません。メモリの連続ブロックである配列を指す単一のポインターを取得します。これが、インデックス自体と配列アドレスから任意のインデックスのアドレスを計算できる理由です。

たとえば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]  |
            +-------------+

nindex のアドレスが であることがわかります0x76543210 + n * 2

したがって、実際には 1 つの 8 バイト ポインターと 100 万の 2 バイト ショートがあり、この場合は合計 2,000,008 バイトになります。

これはmalloc、ポインター自体と同様に、実際の配列と比較してごくわずかなハウスキーピング オーバーヘッドの上にあります。

于 2010-01-02T05:11:58.190 に答える
3

いいえ、ここには単一のポインターしかありません。エントリごとのポインターではありません。サイズの見積もりは 1000000*2 + 8 です。

于 2010-01-02T05:12:51.737 に答える