Рассмотрим эту функцию, предназначенную для векторизации:
void AddSqr(float* restrict dst, float* restrict src, int cnt)
{
for (int i=0; i<cnt; i++) dst[i] = src[i] * src[i];
};
Это будет работать, если src и dst, конечно, не имеют псевдонима. Но что, если src == dst? Крайние случаи, такие как src == dst+1, конечно, не допускаются. Но если указатели одинаковые, проблем быть не должно, или я что-то упускаю?
Изменить: ограничение — это ключевое слово компилятора Intel C++, MSVC имеет __restrict.
Моя точка зрения на этот вопрос заключается в том, что я не вижу способа, как любая векторизация может пойти не так: поскольку каждое значение dst зависит от одного значения src либо по совершенно другому (без псевдонимов), либо ТОЧНО по одному и тому же адресу, когда dst изменен, значение src больше никогда не понадобится, потому что тот факт, что оно было записано, означает, что вывод был рассчитан. Единственным случаем было бы, если бы компилятор использовал сам dst в качестве временного буфера, что я даже не думаю, что это правильно.
restrict
. - person Angew is no longer proud of SO   schedule 01.04.2015a[7]
никогда не изменяется, даже после записи вb[7]
. Есть ли причина выдавать этот код? Нет, но все еще действительный вывод. - person Yakk - Adam Nevraumont   schedule 01.04.2015restrict
не является ключевым словом C++. OP, если вы не согласны, отметьте его обратно, но, пожалуйста, также отредактируйте объяснение того, как вы используете функциональность C в C ++. - person Angew is no longer proud of SO   schedule 01.04.2015restrict
— это квалификатор типа в C11. Черновик n1570 - person Leonard Michlmayr   schedule 01.04.2015