1

非常に頻繁に実行されるコードには、次の計算があります。

long *lp
char *ep, *cp
...
tlen = (ep - cp) / sizeof (*lp);

これを次のように変更します。

long *lp
char *ep, *cp
...
tlen = (ep - cp) / sizeof (long);

コンパイル時に sizeof が計算されるため、効率が向上するか、最新のコンパイラがコンパイル時にこれを処理します。gcc は何をしますか?

4

4 に答える 4

9

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: プラットフォームによってサイズが異なります

于 2012-04-25T05:36:42.300 に答える
2

sizeof()コンパイル時に常に計算されるため、違いはありません。

于 2012-04-25T05:33:53.980 に答える
0

書くことで分割を完全に省くことができます

tlen = ((long*)ep - (long*)cp);

ただし、これの実装がより効率的かどうかはわかりません。私の小さな実験は決定的ではありませんでした。テスト!

編集:コメントで述べたように、ポインターが実際に long を指している場合 (または long を保持するのに適したメモリ位置を指している場合) にのみ機能します。しかし、元のコードに含まれていない場合、元の結果も意味をなさないため、そうであると推測しました。

于 2012-04-25T05:45:50.060 に答える
0

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

于 2012-04-25T11:59:40.080 に答える