2015-01-08 3 views
0

Когда у нас есть постоянные данные, например. в видеИмеет ли указатель на const тот же эффект, что и __restrict?

  • double const * const или
  • double const *

это дает компилятору ту же информацию, __restrict/это имеет тот же эффект?

Насколько я понимаю, __restrict в основном обещает, что указанные данные не будут изменены другим указателем. Итак, указатель на значение const делает одно и то же обещание, не так ли?

__restrict здесь относится к ключевому слову в Visual Studio. Я предполагаю, что значение похоже на GCC.

+0

'__restrict', начинающийся с двух символов подчеркивания, по свойству архитектуры, зависящему от архитектуры, и должен быть использован тщательно, если вообще. Вам не рекомендуется использовать его как программиста, поскольку он имеет этот префикс, чтобы указать, что он использовался при реализации какой-либо функции компилятора/языка/реализации и не должен использоваться клиентским программным обеспечением. С другой стороны, 'const' - это стандартная функция языка, которая позволяет компилятору обнаруживать попытки изменить значение константы и предупреждать пользователя о неправильном использовании ценности. –

ответ

5

Нет, __restrict означает, что указатель в вопросе является единственным указателем в текущей области, что указывает на тот конкретный кусок данных, то есть, что указатель не псевдонимами. Это не то же самое, что и const, хотя я думаю, что это более интересно для изменяемых данных.

+0

'ограничение' по-прежнему интересен для указателей на' const', когда он используется в сочетании с другими ограничивающими указателями на неконстантные, например. в 'memcpy()'. –

1

Указатель на const ничего не сообщает компилятору, он запрашивает предупреждения для некоторых неявных преобразований. Только если сам объект объявлен const, компилятор может считать его неизменным (даже если const отброшен).

__restrict, с другой стороны, это обещание компилятора, а именно о том, что объект ссылки не совмещенное другой указатель в текущей области.

я не мог найти __restrict в документации GCC, но gcc -std=c99 -pedantic принимает int *__restrict foo; и int *restrict foo;, как совместимые заявления, указывая они имеют ту же семантику; подразумевая, что это не то же самое, что и MSVC's __restrict.

Для C99 restrict (но не MSVC __restrict), как я прочитал стандартный, restrict -qualified указателя const -qualified типа это обещание ссылочного объекта не изменяется (если указатель используется для доступа к объекту) , ср. C11 (n1570) 6.7.3.1 p4.

 Смежные вопросы

  • Нет связанных вопросов^_^