clang或gcc是否利用引用限制进行别名分析

时间:2012-09-13 14:51:51

标签: c++ gcc clang alias compiler-optimization

我想知道别名分析是否通过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函数都会发出相同的程序集。

2 个答案:

答案 0 :(得分:0)

你指的是什么“参考限制性规则”?在您的示例中:

int x;
FooRef r(x);
foo(r, &x);

...创建*messWithAliasAnalysisi_是相同整数的情况。

答案 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在引用上支持它 - 因为没有未定义的行为就不能重新引用引用,所以编译器可以静态地确定别名。