非常に頻繁に実行されるコードには、次の計算があります。
long *lp
char *ep, *cp
...
tlen = (ep - cp) / sizeof (*lp);
これを次のように変更します。
long *lp
char *ep, *cp
...
tlen = (ep - cp) / sizeof (long);
コンパイル時に sizeof が計算されるため、効率が向上するか、最新のコンパイラがコンパイル時にこれを処理します。gcc は何をしますか?
非常に頻繁に実行されるコードには、次の計算があります。
long *lp
char *ep, *cp
...
tlen = (ep - cp) / sizeof (*lp);
これを次のように変更します。
long *lp
char *ep, *cp
...
tlen = (ep - cp) / sizeof (long);
コンパイル時に sizeof が計算されるため、効率が向上するか、最新のコンパイラがコンパイル時にこれを処理します。gcc は何をしますか?
sizeof
演算子は常にコンパイル時に評価されるコンストラクト0であるため、違いはありません。
フラグメント...
tlen = (ep - cp) / sizeof (*lp);
したがって、似ていないものに変換されます...
tlen = (ep - cp) / 4;
sizeof(long)==4
( 1と仮定します。)、最適化を適用すると、次の変換はおそらく ...
tlen = (ep - cp) >> 2;
もちろん、さらに多くの最適化が行われます。これは、コンパイル時のコンストラクト0である可能性のある結果のデモンストレーションにすぎません。
より一般的であり、変数の型を変更するときに手動で調整する必要がないため(配列からポインターに変更する場合を除く)、私は常に よりも優先"sizeof(_var-name_)"
します。sizeof(_typename_)
0: 可変長配列を除く。
1: プラットフォームによってサイズが異なります
sizeof()
コンパイル時に常に計算されるため、違いはありません。
書くことで分割を完全に省くことができます
tlen = ((long*)ep - (long*)cp);
ただし、これの実装がより効率的かどうかはわかりません。私の小さな実験は決定的ではありませんでした。テスト!
編集:コメントで述べたように、ポインターが実際に long を指している場合 (または long を保持するのに適したメモリ位置を指している場合) にのみ機能します。しかし、元のコードに含まれていない場合、元の結果も意味をなさないため、そうであると推測しました。
Would not result in performance difference but would result in behaviour differences depending on the platform. eg: on Win x64 sizeof(long) will be 4 but sizeof(*lp) is 8