我总是不确定,在C++中,restrict关键字是什么意思?
是否意味着赋予函数的两个或更多指针不重叠?还有什么意思?
在此Stack Overflow答案中 ,证明了C++中的别名可能会降低代码速度.并且C++中的别名不仅适用于指针,它也适用于引用,更一般地适用于标准指定的这些类型.特别是有
一种聚合或联合类型,包括其成员中的上述类型之一(包括递归地,子聚合或包含联合的成员)
所以根据我的理解,如果我有如下代码,
class A{
public:
int val;
};
void foo(vector<A> & array, int & size, A & a0) {
for(int i=0;i<size;++i) {
array[i].val = 2*a0.val;
}
}
Run Code Online (Sandbox Code Playgroud)
和可能的是,a0可以别名中的元素中的一个array,也可能是别名size由于上述引用的,所以a0和size必须装载对于每次迭代导致性能下降.
const &将无济于事,因为它不会避免标准规定的混叠.通过a0按值?但这会使a0我不喜欢的复制,因为在实践中,类A可能非常复杂,复制是一个非常昂贵的选择.我正在更新性能关键型库以使用限制,这是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)