5

我已经阅读了许多关于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

2 回答 2

4

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

于 2013-10-15T22:14:27.900 回答
1

C++ 没有限制这样的关键字。此外,在您的示例中,有两个不同的词:__restrict 和 RESTRICT。我认为第一个词是实现定义的,第二个词表示一个宏。具有关键字限制的是 C。

于 2013-10-15T22:17:38.630 回答