Как сказать компилятору C или C++, что указатели не являются псевдонимами
У меня есть функция, которая получает массив указателей, например, так:
void foo(int *ptrs[], int num, int size)
{
/* The body is an example only */
for (int i = 0; i < size; ++i) {
for (int j = 0; j < num-1; ++j)
ptrs[num-1][i] += ptrs[j][i];
}
}
То, что я хочу донести до компилятора, это то, что указатели ptrs[i]
не псевдонимы друг друга и что массивы ptrs[i]
не перекрывать Как мне это сделать? Мой скрытый мотив - поощрять автоматическую векторизацию.
Также есть ли способ получить тот же эффект, что и __restrict__
на итераторе std::vector
?
4 ответа
restrict
в отличие от более распространенного const
, является свойством указателя, а не данных, на которые указывают. Поэтому он принадлежит на правой стороне*
'декларатор-модификатор. []
в объявлении параметра есть еще один способ записи *
, Собрав все это вместе, вы сможете получить желаемый эффект с помощью этого прототипа функции:
void foo(int *restrict *restrict ptrs, int num, int size)
{
/* body */
}
и не нужно новых имен. (Не проверено. Ваш пробег может отличаться. restrict
является чистой подсказкой по оптимизации и может на самом деле не делать ничего конструктивного с вашим компилятором.)
Что-то вроде:
void foo(int *ptrs[], int num, int size)
{
/* The body is an example only */
for (int i = 0; i < size; ++i) {
for (int j = 0; j < num-1; ++j) {
int * restrict a = ptrs[num-1];
int * restrict b = ptrs[j];
a[i] += b[i];
}
}
... должен сделать это, я думаю, в C99. Я не думаю, что есть какой-то способ в C++, но многие компиляторы C++ также поддерживают ограничение.
В C++ аргументы указателя предполагаются не псевдонимами, если они указывают на принципиально разные типы (правила "строгого алиасинга").
В C99 ключевое слово "restrict" указывает, что аргумент указателя не имеет псевдонима для любого другого аргумента указателя.
Вызовstd::memcpy
. Определение Memcpy будет иметьrestrict
настроить, если ваш язык/версия и компилятор поддерживают это, и большинство компиляторов снизят его до векторных инструкций, если размер копируемой области мал.