Я прочитал несколько постов по ключевому слову restrict. Но практически каждый пример, который я могу найти, кажется, относится к входным параметрам только к функции и, возможно, к одному значению. Мне нужно уточнить мое понимание.
Я нашел функцию, которая выглядит так, как будто она полностью нарушает правила ключевого слова как с входным параметром, так и с локальной переменной.
Эта функция вызывается с буфером void *, а указатель объявляется как _restrict (это Microsoft Visual C ++). Еще позже в функции объявлен указатель локальной переменной типа UCHAR *, который указывает на тот же самый ограниченный буфер входных параметров.
Вот серьезно вырубленная версия функции, о которой я говорю
void Foo(int nVersion, int nX, int nY, int nWidth, void * __restrict pBuffer) const
{
// ... blah blah blah
UCHAR * __restrict pBufferPtr = ((UCHAR *) pBuffer) + 10; // Isn't this aliasing?
const void * __restrict pData = (blah blah blah); //... Get from some function call;
memcpy(pBufferPtr, pData, nWidth);
}
Приведенный выше пример нарушает правила «restrict»?
restrict
Только ключевое слово означает, что указатели должны указывать на уникальные части памяти. В приведенном выше коде, pBuffer
указывает на что-то, давайте назовем это A
, pBufferPtr указывает на A+10
, PData указывает на что-то совершенно другое, B
так что никаких нарушений нет.
В C ++ нет такого ключевого слова, как restrict. Более того, в вашем примере есть два разных слова: __restrict и RESTRICT. Я думаю, что первое слово определяется реализацией, а второе слово обозначает макрос.
Именно C имеет ключевое слово restrict.