4

__restrict__GCC/Clang の修飾子をthisクラスのポインターに適用するにはどうすればよいですか?
この質問は、Richard Powell の CppCon 2018 講演「How to Argue(ment)」に触発されたものです。同様の質問「restrict qualifier on member functions (restrict this pointer)」を見ました (すべてのコードはCompiler Explorerにあります) 。

void bar();

class Foo {
 public:
  int this_example() const {
    if (value > 0) {
      bar();
      return value;
    } else {
      return value;
    }
  }

 private:
  int value;
};

上記のコードは、次のアセンブリを生成します。その中で、ポインタvalueを介して 2 回ロードする必要があることがわかります。thisこれは理にかなっています。これは、C から継承された C++ と制限修飾子により、プログラマーが動作をオフにできることの結果です。ポインターのrestrict機能を有効にする方法が見つかりません。this

Foo::this_example() const:               # @Foo::this_example() const
        push    rbx
        mov     eax, dword ptr [rdi]
        test    eax, eax
        jle     .LBB2_2
        mov     rbx, rdi
        call    bar()
        mov     eax, dword ptr [rbx]
.LBB2_2:
        pop     rbx
        ret

コンパイラ エクスプローラーのページで、__restrict__2 番目のロードを回避するために使用するメソッド引数の例を示します。__restrict__構造体参照を関数に渡し、使用して 2 番目のロードを省略した例もあります。

thisコンパイラーが、プログラマーがメソッドの引数で暗黙のポインターに言及できるようにする世界を想像できます。コンパイラは、thisポインターへの修飾子の適用を許可することができます。例については、以下のコードを参照してください。

class Foo {
 public:
  int unrestricted(Foo *this);
  int restricted(Foo *__restrict__ this);
};

フォローアップの質問として、C++ 標準または C++ ガイドラインにthis、restrict 修飾子を決して持たないようにするものはありますか?

4

1 に答える 1