2013-10-15 31 views
3

我读过了关于restrict关键字的许多帖子。但实际上,我可以找到的每个示例似乎都只将输入参数引用到函数中,也许只是一个值。我需要澄清我的理解。MSVC++限制关键字和局部变量

我发现一个函数看起来像是完全违反了输入参数和局部变量的关键字规则。

该函数用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

编辑过的标题和标签,因为这通常不适用于C++,只是一个供应商的扩展。 – aschepler

+0

为什么你把它标记为MSVC?微软在MSDN官方表示,他们甚至不支持restrict关键字(无论是c还是C++) – dhein

回答

3

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

+0

所以唯一保证不别名的是实际的指针值本身,而不是它指向的东西?假设我将'pBufferPtr'初始化为'pBuffer + nOffset','nOffset'为零。假设我然后解除了这两个?那是* pBuffer = 100; UCHAR val = * pBufferPtr; 这不会失败一个加载存储? – user2057722

+1

@ user2057722这会产生未定义的行为。限制仅仅是提示编译器允许它通过假设指针指向唯一位置来执行一些优化。程序员要确保事实确实如此。 –

+0

所以这个函数是(或者至少可以)将它声明为限制的指针进行别名,对吧? – user2057722

1

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

+0

OP专指Microsoft Visual-C++,它保留__restrict。我假设RESTRICT在我的答案中被定义为__restrict。 – AndyG

+0

是的,这是正确的。我很抱歉。在我的编辑中,为了简化示例,我打算用__restrict替换RESTRICT的所有实例,因为这是RESTRICT所评估的内容。我现在纠正了它 – user2057722