7

我正在更新性能关键库以使用限制,正如 g++ 和 MSVC 在 C++11 中使用关键字实现的那样__restrict。这似乎是最标准的扩展,所以我将使用restrict__restrict互换。

restrict是一个 C99 关键字,但是编译器已经在 C++ 中定义了它的重要用途。

这篇文章打算成为一个“问题”,询问每个 C++ 特定用途是什么以及它的含义,然后是一个 CW 答案来回答它。随意添加/检查/编辑。所以:“帮助!这些 C++ 使用的restrict关键字是什么意思?”

  1. 限定this(限制方法):

    void Foo::method(int*__restrict a) __restrict { /*...*/ }
    
  2. 限制引用:

    int&__restrict x = /*...*/;
    
  3. 限制在模板内:

    std::vector<float*__restrict> x;
    
  4. 限制成员/字段。这在技术上也适用于 C struct,但它在 C++ 中比在 C 中更频繁地出现:

    class Foo final { public: int*__restrict field; };
    
4

1 回答 1

5
  1. 限定this(限制方法):

    这意味着this指针受到限制。这一重大后果:

    • 该方法不能将自身作为数据进行操作,例如:

      void Foo::method(Foo*__restrict other) __restrict { /*...*/ }
      

      在该示例中,this可能会别名为other. restrict是说您不能以自身作为参数来调用此方法。

    • 注意:即使通过字段也可以访问或更改对象。原因是以下功能在功能上相同:

      void Foo::method1(void) __restrict { field=6; }
      void Foo::method2(void) __restrict { this->field=6; }
      

      在那个例子中,this没有任何别名。

  2. 限制引用:

    这似乎意味着——引用受到限制。这到底是什么的以及它是否有用是另一回事。该线程上的某人声称编译器可以静态确定引用的别名,因此该关键字被认为是无用的。 这个问题也被问到是否应该使用它,但“供应商特定”的答案几乎没有帮助。

  3. 这个问题有先例。简而言之,在 functionf中,编译器知道a.field并且b.field没有别名:

    class Foo final {
        int*__restrict field;
    };
    int f(Foo a, Foo b) { /*...*/ }
    

    这通常是这种情况,假设a!=b——例如,如果字段被 Foo 的构造函数/析构函数分配和销毁。请注意,如果 field 是原始数组,它将始终为 true,因此不需要(并且不可能)应用该restrict关键字。

于 2014-09-19T19:20:56.047 回答