1

知られているように:

ptr = malloc(size);

またはC++で

ptr = new Klass();

size バイトをヒープに割り当てます。スタックよりも効率が悪い。

しかし、割り当て後、アクセスすると:

foo(*ptr);

また

(*ptr)++;

スタック上のデータと同じパフォーマンスですか、それともさらに遅いですか?

4

4 に答える 4

2

この質問に明確に答える唯一の方法は、両方のバージョンをコード化し、複数のシナリオ (異なる割り当てサイズ、異なる最適化設定など) でそれらのパフォーマンスを測定することです。この種のことは、最適化設定、オペレーティング システムがメモリを管理する方法、割り当てられるブロックのサイズ、アクセスの局所性など、多くのさまざまな要因に 大きく依存します。あらゆる状況で他よりも。

それでも、結果は特定のシステムにのみ適用されます。

于 2013-08-22T17:10:07.373 に答える
1

それは、何をどのように比較しているかに大きく依存します。

あなたが意味するなら

ptr = malloc(10 * sizeof(int)); 

より遅い:

int arr[10]
ptr = arr; 

そして、ptrそれが指す整数にアクセスするために使用しますか?

それからいいえ。

arr[0]2 番目のケースの代わりに使用することを参照している場合は、コンパイラが実際の変数のアドレスを見つけるために*ptr値を読み取る必要があるためです。ptrただし、多くの場合、内部の値を「認識」するptrため、ポインター自体を読み取る必要はありません。

比べfoo(ptr)foo(arr)も全然変わらない。

[最初の使用時にメモリを「コミット」する必要があるという点で、実際にヒープに割り当てると、何らかのペナルティが生じる場合があります。しかし、それは 4KB ごとにせいぜい 1 回であり、ほとんどの場合、おそらく無視できます]。

于 2013-08-22T16:46:47.617 に答える