如何将 GCC/Clang 的__restrict__
限定符应用于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
必须通过this
指针加载两次。这是有道理的,这是 C++ 从 C 继承的结果,restrict 限定符允许程序员关闭该行为。我找不到启用指针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
在Compiler Explorer页面上,我展示了__restrict__
用于省略第二次加载的方法参数的示例。还有一个将结构引用传递给函数并__restrict__
用于省略第二次加载的示例。
我可以想象一个编译器允许程序员this
在方法的参数中提及隐式指针的世界。然后编译器可以允许对this
指针应用限定符。有关示例,请参见下面的代码。
class Foo {
public:
int unrestricted(Foo *this);
int restricted(Foo *__restrict__ this);
};
作为一个后续问题,C++ 标准或 C++ 指南中是否有一些东西可以使它this
永远不会有限制限定符?