C++ MSVC&x2B+;限制关键字和局部变量

C++ MSVC&x2B+;限制关键字和局部变量,c++,visual-c++,strict-aliasing,restrict-qualifier,C++,Visual C++,Strict Aliasing,Restrict Qualifier,我读过很多关于restrict关键字的帖子。但实际上,我能找到的每一个例子似乎都只涉及一个函数的输入参数,也许还有一个值。我需要澄清我的理解 我发现一个函数在输入参数和局部变量上完全违反了关键字的规则 使用void*对缓冲区调用此函数,指针声明为\uu restrict(这是Microsoft Visual C++)。在函数的后面,声明了一个UCHAR*类型的局部变量指针,并使其指向同一个受限输入参数缓冲区 下面是我所说的函数的一个严重精简版本: void Foo(int nVersion, i

我读过很多关于
restrict
关键字的帖子。但实际上,我能找到的每一个例子似乎都只涉及一个函数的输入参数,也许还有一个值。我需要澄清我的理解

我发现一个函数在输入参数和局部变量上完全违反了关键字的规则

使用
void*
对缓冲区调用此函数,指针声明为
\uu 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
的规则?

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

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

OP具体指的是Microsoft Visual C++,它确实保留了\uu restrict。我假设RESTRICT在我的回答中被定义为u RESTRICT。是的,这是正确的。我道歉。在我的编辑过程中,为了简化示例,我打算用_RESTRICT替换RESTRICT的所有实例,因为RESTRICT的计算结果就是这样的。我现在已经纠正了它,所以唯一可以保证不会出现别名的是实际指针值本身,而不是它指向的东西?假设我将“pBufferPtr”初始化为“pBuffer+nOffset”,并且“nOffset”为零。假设我随后取消了两者的引用?即*pBuffer=100;UCHAR val=*pBufferPtr;这不会使加载命中存储失败吗?@user2057722会产生未定义的行为。Restrict只是提示编译器允许它通过假设指针指向唯一的位置来执行一些优化。这取决于程序员来确保情况确实如此。因此,函数是(或至少可能是)对它声明为restrict的指针进行别名化,对吗?@user2057722鉴于此函数中除了从中派生
pBufferPtr
之外没有使用
pBufferPtr
,并且
pBufferPtr
仅在该函数期间存在,我认为它没有。但是,如果这个函数也在<代码> pBuffux/Cube上执行了一个操作,它超出了代码> pHuffe+10 ,那么我会说它确实是这样的,并且你会遇到未定义的行为。编辑的标题和标签,因为这一般不适用于C++,只不过是一个厂商的扩展。为什么你把它标记为MSVC?微软官方在MSDN上声明,他们甚至不支持restrict关键字(c或c++)