4

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

4

1 回答 1

4

GCC 的文档__restrict__(以及链接的问题)提到您实际上可以限制this

this您还可以通过__restrict__用作成员函数限定符来指定成员函数的指针是否为非别名。

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

体内T::fnthis有着有效的定义T *__restrict__ const this。请注意,__restrict__成员函数限定符的解释与constorvolatile限定符的解释不同,因为它应用于指针而不是对象。这与实现受限指针的其他编译器一致。

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

于 2018-11-08T22:54:47.837 回答