1

エイリアス分析がclangまたはgccの内部で渡されるかどうか疑問に思っています.C++メンバー参照変数をポインター変数とは異なる方法で扱います。コンパイラーが参照に関するより制限的な規則のいくつかを利用できる場合、これはポインターよりも参照を優先するためのパフォーマンスベースの引数になります。

これを証明する 1 つの方法は、参照とポインターの間の変更によってアセンブリが変更されたビット コードです。

違いが生じる可能性のあるコードの例を次に示します。

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);

*messWithAliasAnalysis...とi_が同じ整数の場合を作成します。

于 2012-09-13T14:58:38.027 に答える
0

C++ には restrict の標準サポートがありませんが、多くのコンパイラには、GNU Compiler Collection のrestrictや Visual C++ の __restrict および __declspec(restrict) など、通常は C++ と C の両方で機能する同等の機能があります。

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 に答える