我想知道别名分析是否在 clang 或 gcc 内部传递,将 C++ 成员引用变量与指针变量区别对待。如果编译器可以利用一些关于引用的更严格的规则,这将是一个基于性能的参数,用于首选引用而不是指针。
证明这一点的一种方法是在引用和指针之间更改更改程序集的位代码。
以下是可能产生差异的代码示例:
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 函数都发出相同的程序集。