Как сказать компилятору C или C ++, что указатели не являются псевдонимами - PullRequest
8 голосов
/ 07 сентября 2011

У меня есть функция, которая получает массив указателей, например:

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?

Ответы [ 3 ]

9 голосов
/ 07 сентября 2011

restrict, в отличие от более распространенного const, является свойством указателя , а не данных , указывающих на . Следовательно, он принадлежит правой стороне объявления-модификатора '*'. [] в объявлении параметра - это еще один способ записи *. Собрав все это вместе, вы сможете получить желаемый эффект с помощью прототипа этой функции:

void foo(int *restrict *restrict ptrs, int num, int size)
{
   /* body */
}

и не нужно новых имен. (Не проверено. Ваш пробег может отличаться. restrict - это чистый совет по оптимизации, и он может на самом деле не делать ничего конструктивного с вашим компилятором.)

7 голосов
/ 07 сентября 2011

Что-то вроде:

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 ++ также поддерживают ограничение.

4 голосов
/ 07 сентября 2011

В C ++ аргументы указателя считаются не псевдонимами, если они указывают на принципиально разные типы (правила "строгого алиасинга").

В C99 ключевое слово restrict указывает, что аргумент указателя не является псевдонимом.любой другой аргумент указателя.

...