0

構造体の配列を含む構造体がある場合....そして

config.data.item[3].userFunction();

でアクセスしたほうがいいですか

itemType * item = &config.data.item;

item[3].userFunction();
item[4].userFunction();

それともこれと同じですか

config.data.item[3].userFunction();
config.data.item[4].userFunction();

または、効率が失われるレベルの数に制限があり、コンパイラの最適化は何らかの効果がありますか?

提供された洞察に事前に感謝します。

4

2 に答える 2

1

間接性のレベルは、CPU サイクルと可読性の両方の点で影響を与えます。ただし、あなたの場合、間接化のレベルは 1 つだけです (関数ポインター)。ドット演算子は、configコンパイル時の位置へのオフセットを生成します。

これに関係なく、共通部分式の結果を保持する変数を作成することは、特にその変数に意味のある名前を付ける場合に有効です。ただし、CPU に関しては、影響は見られないはずです。最近の最適化コンパイラは、一般的な部分式の検出と最適化に非常に優れているため、この特定のコード フラグメントをどの方法でコーディングしても同じパフォーマンスが得られるはずです。

于 2014-08-22T18:37:59.550 に答える
-1

a->b のようにキャッシュやパフォーマンスに影響を与える可能性のある直接レベルの間接化を行ったとしても、無害に見える abc[x].d であっても、[x] によって追い出される可能性があるため、慎重に調べる必要があります。キャッシュの。

答えは、キャッシュの内容、キャッシュの大きさ、および構造のサイズに依存するということです。

実際に判断する唯一の方法は、使用される状況でコードをテストすることです。キャッシュの使用率で誤った結果が得られるため、単独でテストすることさえできません。

要するに、問題があることをテストして証明し、構造体フィールドを再編成するか、逆参照を回避することが役立つかどうかを確認するまで、最適化について心配する必要はありません...

于 2014-08-22T18:53:09.377 に答える