我有以下简单的功能
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;
}
当我以这种方式使用它时编译和运行就好了
double v[] = {1, 2, 3};
minVec(v, v, 3);
我一直认为在这种情况下使用restrict
只会告诉编译器循环的每次迭代都独立于其他迭代,因此可以积极地优化循环。这是正确的做法吗?还是我在这里尝试一些实现定义的行为?
答案 0 :(得分:5)
restrict
关键字纯粹是一个优化提示:它允许编译器对所有其他内存访问的受限指针重新排序读/写。如果编译器无法证明指针后面的内存只能通过该指针访问,则无法完成此操作。
所以,如果你说restrict
,你有效地告诉编译器:&#34;我向你保证这个指针是唯一一个指向这个内存的指针,请随时重新排序。我充分意识到,如果我错了,可能会出现蓝色大象,但我是人类,我可能会出错,在我面前鞠躬。&#34;
这个关键字是为了编译器,不是为了你自己!
答案 1 :(得分:3)
使用restrict
关键字表示副本的来源和目标不应重叠。 不保证副本和目标的来源重叠。如果它发生,程序会调用未定义的行为,这就是你的情况。