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

Posted

技术标签:

【中文标题】clang 或 gcc 是不是利用引用限制进行别名分析【英文标题】:Does clang or gcc take advantage of referencing restrictions for alias analysisclang 或 gcc 是否利用引用限制进行别名分析 【发布时间】:2012-09-13 14:51:50 【问题描述】:

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

【问题讨论】:

int* const 进行比较会更有意义。我似乎记得作者曾告诫不要使用 const 作为优化提示,因为编译器足够聪明,这无关紧要(除非静态存储持续时间常量对象等)。 不知道。应该询问开发者(检查他们的网站、开发列表、作品)。做一些实验,看看你想要的东西是否正在完成。并且不要忘记对照标准检查您想要对编译器执行的操作是否合法。是的,所有这些工作只有在性能极其关键的代码时才有意义。 【参考方案1】:

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

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

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

【讨论】:

*i 可以在 FooPtr 的生命周期内更改,但对 i 的引用不能。 您将不得不更加具体。在此示例中,我没有看到任何内容可以让编译器为 FooRef 案例发出比 FooPtr 案例更短的代码。【参考方案2】:

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

【讨论】:

以上是关于clang 或 gcc 是不是利用引用限制进行别名分析的主要内容,如果未能解决你的问题,请参考以下文章

我的 Linux 开发项目的 Clang vs GCC

引用如何在 gcc 中转换为 asm?

C++学习(三四八)CLang GCC

在 MacOS 上使用 gcc-8 而不是 clang 编译 Qt5

gcc或clang中消除特定警告的方法

FreeBSD 为啥要废弃 GCC 改用 Clang/LLVM