如何在此指针上应用限制限定符

时间:2018-11-08 21:28:32

标签: c++ class this restrict-qualifier

如何将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永远不会具有限制限定符?

1 个答案:

答案 0 :(得分:3)

GCC's documentation for __restrict__(以及链接的问题)提到您实际上可以限制this

  

您还可以通过使用this作为成员函数限定符来指定是否对成员函数的__restrict__指针进行混叠。

void T::fn () __restrict__
{
    /* … */
}
     

T::fn的正文中,this具有有效的定义T *__restrict__ const this。请注意,__restrict__成员函数限定符的解释与constvolatile限定符的解释不同,因为它适用于指针而不是对象。这与其他实现受限指针的编译器一致。

但是请注意,这样标记this指针并不会阻止第二次加载。