-2

次のコードを実行した後:

#include <stdio.h>
class Nil
{
};

int main()
{
    Nil* A[20];
    char* B[20];
    for (int i=0;i!=20;i++)
    {
        A[i]=new Nil;
    }

    for (int i=0;i!=19;i++)
    {
        printf("A:%i\n",((int)A[i+1])-((int)A[i]));
    }
    printf("------------------------------------\n",5);
    for (int i=0;i!=20;i++)
    {
        B[i]=new char;
    }

    for (int i=0;i!=19;i++)
    {
        printf("B:%i\n",((int)B[i+1])-((int)B[i]));
    }
    getchar();
}

出力:

A:7112
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
------------------------------------
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64

割り当てサイズが常に64であるのはなぜですか?

4

2 に答える 2

0

そこにポインタの配列を保持しています。ポインタのサイズは固定されているため、常に同じです。

割り当てられたメモリに対して、コンパイラはいくつかの最適化を行います。通常、1ビットまたは1バイトを検索することはできなかったため、ほとんどのコンパイラは、最適なアクセスパターンがあるように注意します。

于 2012-10-16T16:59:45.300 に答える
0

C ++メモリマネージャは、必要に応じて割り当てを処理します。マネージャーは、どのメモリーが使用され、何が空いているかを知るために追加情報を必要とするため、ギャップはオブジェクトよりも大きくなります。効率を高めるために、メモリパディングのおかげですべてのチャンクのサイズが同じになります。大きなオブジェクトを割り当てようとすると、ギャップが広がることに注意してください。おそらく64の倍数になります。割り当てられたオブジェクト間のギャップは同じです。これは、オブジェクトを順番に割り当てたためです。新しいオブジェクトをスタックすることが最も簡単な割り当て戦略です。割り当てが順番に行われていなかった場合、または空きメモリの「穴」があった場合、ギャップはそれほど均等ではないことに注意してください。

覚えておくべき重要なことは、これらはすべて実装とプラットフォームに依存するものであり、信頼すべきではないということです。

于 2012-10-16T17:23:07.613 に答える