C ++限制语义

ima*_*ett 5 c++ restrict restrict-qualifier

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

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

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

  1. 合格this(限制方法):

    void Foo::method(int*__restrict a) __restrict { /*...*/ }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 限制参考:

    int&__restrict x = /*...*/;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 限制在模板内:

    std::vector<float*__restrict> x;
    
    Run Code Online (Sandbox Code Playgroud)
  4. 限制成员/字段。从技术上讲,这也适用于C语言struct,但是C ++中的问题要比C语言中的问题更多:

    class Foo final { public: int*__restrict field; };
    
    Run Code Online (Sandbox Code Playgroud)

ima*_*ett 5

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

    这意味着this指针受到限制。这一个主要后果是:

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

      void Foo::method(Foo*__restrict other) __restrict { /*...*/ }
      
      Run Code Online (Sandbox Code Playgroud)

      在该示例中,this否则可能会别名other. restrict是说你不能用它自己作为参数来调用这个方法。

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

      void Foo::method1(void) __restrict { field=6; }
      void Foo::method2(void) __restrict { this->field=6; }
      
      Run Code Online (Sandbox Code Playgroud)

      在该示例中,this没有使用任何别名。

  2. 限制引用:

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

  3. 这个问题是有先例的。简而言之,在 function 中f,编译器知道a.fieldb.field没有别名:

    class Foo final {
        int*__restrict field;
    };
    int f(Foo a, Foo b) { /*...*/ }
    
    Run Code Online (Sandbox Code Playgroud)

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