次のコードがあるとしましょう:
int f() {
int foo = 0;
int bar = 0;
foo++;
bar++;
// many more repeated operations in actual code
foo++;
bar++;
return foo+bar;
}
繰り返されるコードを別の関数に抽象化すると、次のようになります。
static void change_locals(int *foo_p, int *bar_p) {
*foo_p++;
*bar_p++;
}
int f() {
int foo = 0;
int bar = 0;
change_locals(&foo, &bar);
change_locals(&foo, &bar);
return foo+bar;
}
コンパイラーが関数をインライン化し、結果のコードのchange_locals
ようにを最適化することを期待します。*(&foo)++
foo++
私の記憶が正しければ、ローカル変数のアドレスを取得すると、通常、一部の最適化が妨げられます(たとえば、レジスタに格納できません)が、アドレスに対してポインタ演算が行われず、関数からエスケープされない場合、これは適用されますか?が大きい場合、 (MSVCで)change_locals
宣言された場合に違いがありますか?inline
__inline
特にGCCおよびMSVCコンパイラの動作に興味があります。