Рассмотрим эту функцию, предназначенную для векторизации:Является ли указатель на C++ наложением угрозы, если указатели точно такие же?
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 + 1, не допускаются, конечно. Но если указатели одинаковые, не должно быть проблем, или я что-то упускаю?
Редактировать: ограничить ключевое слово компилятора Intel C++, MSVC имеет __restrict.
Я считаю, что я не вижу способа, каким образом любая векционализация может пойти не так: поскольку каждое значение dst зависит от единственного значения src либо совершенно другого (без какого-либо наложения псевдонимов), либо ТОЧНО, тот же адрес, когда dst изменен, значение src больше никогда не понадобится, потому что тот факт, что он был записан, означает, что результат был рассчитан. Единственным случаем было бы, если бы компилятор использовал сам dst в качестве временного буфера, который, я думаю, не верен.
Я думаю [Можете ли вы использовать ограниченные указатели для доступа к одному и тому же объекту в некоторых случаях?] (Http://stackoverflow.com/q/18059205/1708801) отвечает на ваш вопрос –
Разве это не вопрос C? У C++ нет 'ограничения'. – Angew
Я не знаю, C, но под моим чтением стандарта, выше UB. Компилятор может свободно испускать патологический код, предполагающий, что 'a [7]' никогда не изменяется, даже после того, как написано 'b [7]'. Есть ли причина испускать этот код? Нет, но все еще допустимый вывод. – Yakk