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);
...创建*messWithAliasAnalysis
和i_
是相同整数的情况。
【讨论】:
*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 是不是利用引用限制进行别名分析的主要内容,如果未能解决你的问题,请参考以下文章