我想知道别名分析是否通过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函数都会发出相同的程序集。
答案 0 :(得分:0)
你指的是什么“参考限制性规则”?在您的示例中:
int x;
FooRef r(x);
foo(r, &x);
...创建*messWithAliasAnalysis
和i_
是相同整数的情况。
答案 1 :(得分:0)
C ++没有对restrict的标准支持,但是许多编译器具有通常在C ++和C中工作的等价物,例如GNU Compiler Collection restrict 和Visual C ++ __restrict和__declspec(restrict)。
http://gcc.gnu.org/onlinedocs/gcc/Restricted-Pointers.html
http://msdn.microsoft.com/en-us/library/5ft82fed.aspx
gcc和VC ++在C ++上都支持__restrict指针,但只有gcc在引用上支持它 - 因为没有未定义的行为就不能重新引用引用,所以编译器可以静态地确定别名。