如何将GCC / Clang的__restrict__
限定符应用于类的this
指针?
这个问题的灵感来自理查德·鲍威尔(Richard Powell)的CppCon 2018演讲,“ https://user:password@host/”,我看到了类似的问题“ How to Argue(ment).”(所有代码都可以在restrict qualifier on member functions (restrict this pointer).上找到)
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的结果,并且Compiler Explorer允许程序员关闭该行为。我找不到方法为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 qualifier页面上,我显示了使用__restrict__
来消除第二个负载的方法参数的示例。还有一个将结构引用传递给函数并使用__restrict__
来消除第二个负载的示例。
我可以想象一个世界,在这个世界中,编译器将允许程序员在方法的参数中提及隐式this
指针。然后,编译器可以允许将限定符应用于this
指针。有关示例,请参见下面的代码。
class Foo {
public:
int unrestricted(Foo *this);
int restricted(Foo *__restrict__ this);
};
作为后续问题,C ++标准或C ++准则中是否有某些内容可以使this
永远不会具有限制限定符?
答案 0 :(得分:3)
GCC's documentation for __restrict__
(以及链接的问题)提到您实际上可以限制this
:
您还可以通过使用
this
作为成员函数限定符来指定是否对成员函数的__restrict__
指针进行混叠。void T::fn () __restrict__ { /* … */ }
在
T::fn
的正文中,this
具有有效的定义T *__restrict__ const this
。请注意,__restrict__
成员函数限定符的解释与const
或volatile
限定符的解释不同,因为它适用于指针而不是对象。这与其他实现受限指针的编译器一致。
但是请注意,这样标记this
指针并不会阻止第二次加载。