В программе, которую я пишу, одно из моих объявлений функций выглядит так:
bool parse( const sentence & __restrict sentence )
{
// whatever
}
Когда я компилирую код с помощью Microsoft Visual Studio 2010 Express, компилятор жалуется:
предупреждение C4227: использовался анахронизм: квалификаторы по ссылке игнорируются
Тем не мение, эта страница Документация GCC гласит:
Помимо разрешения ограниченных указателей, вы можете указать ограниченные ссылки, которые указывают, что ссылка не является псевдонимом в локальном контексте.
И та же страница дает очень явный пример:
void fn (int *__restrict__ rptr, int &__restrict__ rref)
{
/* ... */
}
Я неправильно понял предупреждение MVSC? или я должен преобразовать все мои ссылки в указатели так, чтобы __restrict
применяется?
C ++ не имеет понятия restrict
как С99.
Тем не менее, несколько поставщиков компиляторов предлагают расширения для своих компиляторов C ++, которые они называют __restrict
(обратите внимание на зарезервированное имя!). Учитывая, что это расширения, их поведение определяется поставщиком компилятора. Вам нужно будет прочитать документацию и узнать, что делает это расширение в каждом компиляторе отдельно.
То, что два поставщика выбрали одно и то же имя, не означает, что расширения имеют что-то общее.
Предположительно, так как начинается с __
__restrict
является специфичным для реализации расширением, которое может вести себя так, как того требует каждая реализация. Я думаю, что оба компилятора верны в этом случае.
Вместо того, чтобы менять ссылки на указатели, почему бы не избежать restrict
В целом, вместо того, чтобы использовать профилировщик для поиска «горячих точек», и только если он показывает, что такой псевдоним, на который не распространяются правила строгого псевдонима C ++, требует значительного времени процессора, я бы подумал об изменении одной конкретной ссылки на указатель.