C++ 限制语义

2024-06-28

我正在更新性能关键库以使用限制,如 g++ 和 MSVC 在 C++11 中使用关键字实现的那样__restrict。这似乎是最标准的扩展,所以我将使用restrict and __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. 限制成员/字段。这在技术上也适用于 Cstruct,但它在 C++ 中比在 C 中更频繁地出现:

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

  1. 资格赛this(限制方法):

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

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

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

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

    • 注:是okay访问或更改对象,甚至通过字段。原因是以下功能在功能上是相同的:

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

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

  2. 限制引用:

    它的意思似乎正是——引用受到限制。这到底是什么does而它是否有用则是另一回事。有人在这个线程 http://www.gamedev.net/topic/569075-__restrict-on-c-references/声称编译器可以静态地确定引用的别名,因此该关键字应该是无用的。这个问题 https://stackoverflow.com/questions/12841279/should-i-use-restrict-on-references还被问及是否应该使用它,但答案“特定于供应商”几乎没有帮助。

  3. 有先例这个问题 https://stackoverflow.com/questions/13307190/restrict-keyword-and-pointers-inside-structs。简而言之,在功能上f,编译器知道a.field and b.field没有别名:

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

    经常会出现这种情况,假设a!=b--例如,如果字段由 Foo 的构造函数/析构函数分配和销毁。请注意,如果 field 是原始数组,则它将始终为 true,因此restrict关键字是不必要的(并且不可能 https://stackoverflow.com/questions/25929162/restrict-in-g-and-msvc-with-array-syntax) 申请。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 限制语义 的相关文章

随机推荐