Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MSVC++ restrict keyword and local variables

I've read a number of posts on the restrict keyword. But virtually every example I can find seem to refer to input parameters only to a function and, perhaps a single value. I need to clarify my understanding.

I've found a function that looks like it totally violates the rules of the keyword with both an input parameter and a local variable.

This function is called with a void* to a buffer and the pointer is declared as __restrict (this is Microsoft Visual C++). Yet later in the function, a local variable pointer of type UCHAR* is declared and made to point to that same restricted input parameter buffer.

Here is a seriously chopped down version of the function I'm talking about:

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);
}

Does the above example violate the rules of restrict?

like image 913
user2057722 Avatar asked Oct 15 '13 22:10

user2057722


2 Answers

The restrict keyword only means that the pointers should point to unique portions of memory. In the above code, pBuffer points to something, let's call it A, pBufferPtr points to A+10, PData points to something completely different, B, so there's no violations.

like image 151
AndyG Avatar answered Oct 16 '22 12:10

AndyG


C++ has no such keyword as restrict. Moreover in your example there are two different words: __restrict and RESTRICT. I think that the first word is implementation defined and the second word denotes a macro. It is C that has the keyword restrict.

like image 22
Vlad from Moscow Avatar answered Oct 16 '22 14:10

Vlad from Moscow