2015-12-27 6 views
1

Чтобы ограничить pointer aliasing, я использовал до сих пор классификатор типа __restrict__, как описано here, в разделе о расширениях C++, предоставляемых компилятором GNU GCC. Например, следующая функция:Ограниченное сглаживание с использованием класса `ограничения` и` unique_ptr` в C++

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

принимает в качестве аргументов ограниченный указатель и ограниченную ссылку.

С введением unique_ptr в стандарт C++ мне интересно, предоставит ли компилятор GCC тот же оптимизированный (или лучший) машинный код, используя unique_ptr.

Следует ли использовать такие расширения, как __restrict__? Есть ли лучший способ в более поздних стандартах C++ производить ту же оптимизацию (для указателей и ссылок)?

ответ

2

__restrict__ и unique_ptr делать разные вещи. __restrict__ обещает, что ничто иное не относится к этому объекту (поэтому компилятор может оптимизировать). unique_ptr управляет временем жизни выделенного кучи объекта. Это не позволит оптимизатору делать какие-либо предположения.

Было бы неплохо, если бы был способ сказать: «этот unique_ptr является единственным способом обращения к этому объекту», но я не знаю, поддерживает ли GCC это еще.

+0

Но, например, Марк Нельсон говорит в [Dr. Dobb's] (http://www.drdobbs.com/cpp/c11-uniqueptr/240002708): «Так в чем же смысл слова уникально в [контексте' unique_ptr']? ... Когда вы создаете объект unique_ptr, вы заявляете, что у вас будет __ точно одна копия этого указателя__. «Так что это очень близко к тому, что делает« __restrict__ », насколько я понимаю. – AlQuemist

+2

Статья неправильная. Вы заявляете, что у вас будет ровно одна копия *, ответственная за право собственности *. Нет ничего плохого в передаче необработанного указателя на принадлежащий ему объект при условии, что функция не пытается и не сохраняет указатель в любом месте, –