MSVC++ ограничить ключевое слово и локальные переменные

Я прочитал несколько постов по ключевому слову 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"?

2 ответа

restrict Только ключевое слово означает, что указатели должны указывать на уникальные части памяти. В приведенном выше коде, pBuffer указывает на что-то, давайте назовем это A, pBufferPtr указывает на A+10, PData указывает на что-то совершенно другое, Bтак что никаких нарушений нет.

В C++ нет такого ключевого слова, как restrict. Более того, в вашем примере есть два разных слова: __restrict и RESTRICT. Я думаю, что первое слово определяется реализацией, а второе слово обозначает макрос. Именно C имеет ключевое слово restrict.

Другие вопросы по тегам