__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 修飾子を決して持たないようにするものはありますか?