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»?

4

Решение

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

3

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

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

1

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