我有以下简单的功能
static inline void
minVec(const double *restrict v, double *restrict vmin, unsigned length){
for (unsigned i = 0; i < length; ++i)
vmin[i] = -v[i];
return;
}
Run Code Online (Sandbox Code Playgroud)
当我以这种方式使用它时编译和运行就好了
double v[] = {1, 2, 3};
minVec(v, v, 3);
Run Code Online (Sandbox Code Playgroud)
我一直认为restrict在这种情况下使用只会告诉编译器循环的每次迭代都独立于其他迭代,因此可以积极地优化循环.这是正确的做法吗?还是我在这里讨论一些实现定义的行为?
该restrict关键字纯粹是一个优化提示:它允许编译器对所有其他内存访问的受限指针重新排序读/写.如果编译器无法证明指针后面的内存只能通过该指针访问,则无法执行此操作.
所以,如果你说restrict,你有效地告诉编译器:"我向你保证,这个指针指向这个内存,请随时重新安排我充分意识到,如果我错了蓝色大象可能会出现只有一个,但我. "在人类面前,我不能错,在我面前低头."
这个关键字是为了编译器而不是为了你!