ima*_*ett 5 c++ restrict restrict-qualifier
我正在更新性能关键型库以使用限制,这是g ++和MSVC在C ++ 11中使用关键字实施的__restrict。这似乎是最标准的扩展,所以我将使用restrict和__restrict互换。
restrict 是C99关键字,但是编译器已经在C ++中定义了它的重要用法。
这篇文章打算成为一个“问题”,询问每种特定于C ++的用途及其含义,然后由CW回答。随时添加/检查/编辑。因此:“帮助!这些restrict关键字的C ++使用是什么意思?”
合格this(限制方法):
void Foo::method(int*__restrict a) __restrict { /*...*/ }
Run Code Online (Sandbox Code Playgroud)限制参考:
int&__restrict x = /*...*/;
Run Code Online (Sandbox Code Playgroud)限制在模板内:
std::vector<float*__restrict> x;
Run Code Online (Sandbox Code Playgroud)限制成员/字段。从技术上讲,这也适用于C语言struct,但是C ++中的问题要比C语言中的问题更多:
class Foo final { public: int*__restrict field; };
Run Code Online (Sandbox Code Playgroud)限定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没有使用任何别名。
限制引用:
它的意思似乎正是——引用受到限制。这到底是做什么的以及它是否有用是另一回事。此线程上的某人声称编译器可以静态确定引用的别名,因此该关键字据说是无用的。 这个问题还被问到是否应该使用它,但答案“特定于供应商”几乎没有帮助。
这个问题是有先例的。简而言之,在 function 中f,编译器知道a.field和b.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不需要(也不可能)应用该关键字。