我在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);
}
上述示例是否违反了“限制”规则?
答案 0 :(得分:3)
restrict
关键字仅表示指针应指向内存的唯一部分。在上面的代码中,pBuffer
指向某个内容,我们称之为A
,pBufferPtr指向A+10
,PData指向完全不同的内容B
,因此没有违规行为。
答案 1 :(得分:1)
C ++没有像restrict这样的关键字。此外,在您的示例中,有两个不同的单词:__ sattrict和RESTRICT。我认为第一个单词是实现定义,第二个单词表示宏。 它是C,具有关键字限制。