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.