知られているように:
ptr = malloc(size);
またはC++で
ptr = new Klass();
size バイトをヒープに割り当てます。スタックよりも効率が悪い。
しかし、割り当て後、アクセスすると:
foo(*ptr);
また
(*ptr)++;
スタック上のデータと同じパフォーマンスですか、それともさらに遅いですか?
知られているように:
ptr = malloc(size);
またはC++で
ptr = new Klass();
size バイトをヒープに割り当てます。スタックよりも効率が悪い。
しかし、割り当て後、アクセスすると:
foo(*ptr);
また
(*ptr)++;
スタック上のデータと同じパフォーマンスですか、それともさらに遅いですか?
この質問に明確に答える唯一の方法は、両方のバージョンをコード化し、複数のシナリオ (異なる割り当てサイズ、異なる最適化設定など) でそれらのパフォーマンスを測定することです。この種のことは、最適化設定、オペレーティング システムがメモリを管理する方法、割り当てられるブロックのサイズ、アクセスの局所性など、多くのさまざまな要因に 大きく依存します。あらゆる状況で他よりも。
それでも、結果は特定のシステムにのみ適用されます。
それは、何をどのように比較しているかに大きく依存します。
あなたが意味するなら
ptr = malloc(10 * sizeof(int));
より遅い:
int arr[10]
ptr = arr;
そして、ptr
それが指す整数にアクセスするために使用しますか?
それからいいえ。
arr[0]
2 番目のケースの代わりに使用することを参照している場合は、コンパイラが実際の変数のアドレスを見つけるために*ptr
値を読み取る必要があるためです。ptr
ただし、多くの場合、内部の値を「認識」するptr
ため、ポインター自体を読み取る必要はありません。
比べfoo(ptr)
てfoo(arr)
も全然変わらない。
[最初の使用時にメモリを「コミット」する必要があるという点で、実際にヒープに割り当てると、何らかのペナルティが生じる場合があります。しかし、それは 4KB ごとにせいぜい 1 回であり、ほとんどの場合、おそらく無視できます]。