1

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

4

2 回答 2

0

你的意思是什么“关于引用的限制性规则”?在您的示例中:

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

...创建一个情况,其中*messWithAliasAnalysisi_是相同的整数。

于 2012-09-13T14:58:38.027 回答
0

C++ 没有对限制的标准支持,但许多编译器具有通常在 C++ 和 C 中都可以工作的等价物,例如 GNU 编译器集合限制和 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 支持引用上的它 - 因为引用不能在没有未定义行为的情况下重新安装,所以编译器可以静态确定别名。

于 2014-04-24T19:45:21.830 回答