是C++;如果指针完全相同,则为威胁添加指针别名?

是C++;如果指针完全相同,则为威胁添加指针别名?,c,pointers,restrict,restrict-qualifier,C,Pointers,Restrict,Restrict Qualifier,考虑此用于矢量化的功能: void AddSqr(float* restrict dst, float* restrict src, int cnt) { for (int i=0; i<cnt; i++) dst[i] = src[i] * src[i]; }; void AddSqr(float*restrict dst,float*restrict src,int cnt) { 对于C中的(int i=0;i,您的代码违反了restrict定义,导致未定义的行为,因为它通过

考虑此用于矢量化的功能:

void AddSqr(float* restrict dst, float* restrict src, int cnt)
{
    for (int i=0; i<cnt; i++) dst[i] = src[i] * src[i];
};
void AddSqr(float*restrict dst,float*restrict src,int cnt)
{

对于C中的(int i=0;i,您的代码违反了
restrict
定义,导致未定义的行为,因为它通过
dst
写入一个对象,但通过
src
读取同一个对象


dst
src
之间是否存在偏移并不重要;条件是存在一个
float
对象,该对象通过一个指针写入,通过另一个指针读取。

Restrict是一个关键字,用于允许某些优化,这些优化只有在两个指针不干扰ea时才有效另一个

对于非常简单的情况,当两个指针相同时,不太可能有任何优化失败,因此当您进行测试时,不会发生任何不好的情况

但在更一般的情况下,
restrict
关键字意味着您正在断言这两个指针是不同的,并且它们指向的数据结构是不同的。编译器可以自由地使用此断言来允许它想要的任何优化,尤其是那些如果您的断言是错误的,将导致程序灾难性失败的优化不是真的


此故障称为“未定义的行为”,因为C标准没有定义断言错误时会发生什么。由于这是一个优化断言,完全不可预测的行为,通常称为“鼻恶魔”,因此C编译器可以定义这种行为。

感谢所有的回答。因此: -通过标准C++定义,这是非常错误的。 -然而,我直接从英特尔得到了回复,这是可以的

我最初的问题确实不是关于它是否“遵守规则”,但如果有可能出错。src/dst数组是1:1映射的,因此数组要么完全不同,要么完全相同,因此每个项要么依赖于某个完全不相关的项,要么依赖于自身。因此,如果重写该项,则其最终值已被计算并存储,因此将永远不需要在这个周期中,他又一次受伤了

无论如何,我做了一些额外的处理:

void AddSqr(float* restrict dst, float* restrict src, int cnt)
{
    if (dst == src)
        for (int i=0; i<cnt; i++) dst[i] = dst[i] * dst[i];
    else
        for (int i=0; i<cnt; i++) dst[i] = src[i] * src[i];
};
void AddSqr(float*restrict dst,float*restrict src,int cnt)
{
如果(dst==src)

对于(int i=0;ii认为回答你的问题不是C问题)C++没有“<代码>限制< /代码>。我不知道C,但是在我阅读标准的时候,上面是UB。编译器可以自由地发出病态代码,假设代码[A](7)< /代码>永远不会改变,即使在<代码> B(7)之后。<代码>是有代码的吗?没有,但仍然有效输出。我冒昧地编辑标签到C,因为限制不是C++关键字。OP,如果你不同意,重新标记它,但是请在解释中如何编辑C++中的C++功能。MSVC有限制(但我认为它也接受限制)。