MSVC++ 限制关键字和局部变量

use*_*722 5 c++ strict-aliasing visual-c++ restrict-qualifier

我已经阅读了许多关于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);
}
Run Code Online (Sandbox Code Playgroud)

上面的例子是否违反了规则restrict

And*_*dyG 4

restrict关键字仅意味着指针应指向内存的唯一部分。在上面的代码中,pBuffer指向某个东西,我们称之为A, pBufferPtr 指向A+10, PData 指向完全不同的东西,B,所以没有违规。