Должен ли я использовать __restrict на ссылки?

В программе, которую я пишу, одно из моих объявлений функций выглядит так:

bool parse( const sentence & __restrict sentence )
{
// whatever
}

Когда я компилирую код с помощью Microsoft Visual Studio 2010 Express, компилятор жалуется:

предупреждение C4227: использовался анахронизм: квалификаторы по ссылке игнорируются

Тем не мение, эта страница Документация GCC гласит:

Помимо разрешения ограниченных указателей, вы можете указать ограниченные ссылки, которые указывают, что ссылка не является псевдонимом в локальном контексте.

И та же страница дает очень явный пример:

 void fn (int *__restrict__ rptr, int &__restrict__ rref)
{
/* ... */
}

Я неправильно понял предупреждение MVSC? или я должен преобразовать все мои ссылки в указатели так, чтобы __restrict применяется?

6

Решение

C ++ не имеет понятия restrict как С99.

Тем не менее, несколько поставщиков компиляторов предлагают расширения для своих компиляторов C ++, которые они называют __restrict (обратите внимание на зарезервированное имя!). Учитывая, что это расширения, их поведение определяется поставщиком компилятора. Вам нужно будет прочитать документацию и узнать, что делает это расширение в каждом компиляторе отдельно.

То, что два поставщика выбрали одно и то же имя, не означает, что расширения имеют что-то общее.

8

Другие решения

Предположительно, так как начинается с __ __restrict является специфичным для реализации расширением, которое может вести себя так, как того требует каждая реализация. Я думаю, что оба компилятора верны в этом случае.

Вместо того, чтобы менять ссылки на указатели, почему бы не избежать restrict В целом, вместо того, чтобы использовать профилировщик для поиска «горячих точек», и только если он показывает, что такой псевдоним, на который не распространяются правила строгого псевдонима C ++, требует значительного времени процессора, я бы подумал об изменении одной конкретной ссылки на указатель.

0

По вопросам рекламы [email protected]