0

私のプログラムでは、各オブジェクトのサイズが約 500 バイトであるオブジェクトの大きな (〜 1000 万要素) リストを作成します。現在、割り当ては次のようになっています。

const int N = 10000000;
object_type ** list = malloc( N * sizeof * list );
for (int i=0; i < N; i++)
    list[i] = malloc( sizeof * list[i]);

これは問題なく動作しますが、多数の小さな割り当てがあると、実行時間のかなりの部分が malloc() とその後の free() 呼び出しに費やされることがわかりました。そのため、より大きなチャンクを割り当てるように実装を変更しようとしています。私にとって最も簡単なのは、すべてを 1 つの大きなチャンクとして割り当てることです。

これで、ユーザー空間のメモリ モデルと実際の物理メモリの間に少なくとも 1 レベルの仮想化があることがわかりましたが、非常に大きな「連続した」メモリ ブロックを取得する際に問題が発生するリスクはまだありますか?

4

1 に答える 1

1

連続した仮想は、連続した物理を意味しません。プロセスが N ページを個別に割り当てることができる場合、それらすべてを 1 回の呼び出しで割り当てることもできます (実際には、多くの観点から 1 回の呼び出しで行う方が適切です)。古い 32 ビット アーキテクチャでは、仮想メモリ アドレス空間のサイズの制限が問題でしたが、64 ビットでは問題がなくなりました。さらに、32 ビットでも、10MM を個別に割り当てることができれば、1 回の呼び出しで同じ 10MM を割り当てることができるはずです。

そうは言っても、おそらく設計を慎重に再検討し、メモリに 10MM 要素を割り当てる必要がある理由を再検討する必要があります。

于 2012-09-06T14:32:29.353 に答える