エイリアス分析がclangまたはgccの内部で渡されるかどうか疑問に思っています.C++メンバー参照変数をポインター変数とは異なる方法で扱います。コンパイラーが参照に関するより制限的な規則のいくつかを利用できる場合、これはポインターよりも参照を優先するためのパフォーマンスベースの引数になります。
これを証明する 1 つの方法は、参照とポインターの間の変更によってアセンブリが変更されたビット コードです。
違いが生じる可能性のあるコードの例を次に示します。
struct FooRef {
FooRef(int &i) : i_(i) {}
int &i_;
int add(int a, int *messWithAliasAnalysis) { *messWithAliasAnalysis= 0; return i_ + a; }
};
struct FooPtr {
FooPtr(int *i) : i_(i) {}
int *i_;
int add(int a, int *messWithAliasAnalysis) { *messWithAliasAnalysis= 0; return *i_ + a; }
};
// These functions are here to force the compiler to compile the add functions.
int foo(FooPtr &fooPtr, int *messWithAliasAnalysis) {
return fooPtr.add(5, messWithAliasAnalysis);
}
int foo(FooRef &fooRef, int *messWithAliasAnalysis) {
return fooRef.add(5, messWithAliasAnalysis);
}
しかし、gcc 4.6 ではそうではありません。両方の foo 関数に対して同じアセンブリが出力されます。