2

考虑到这段代码,VC9 没有检测到别名:

typedef struct { int x, y; } vec_t;

void rotate_cw(vec_t const *from,
               vec_t       *to)
{
        /* Notice x depends on y and vice versa */
        to->x = from->y;
        to->y = -from->x;
}

/* ... */
vec_t a, b;
rotate_cw(&a, &b); /* OK, no aliasing */
rotate_cw(&a, &a); /* FAIL, aliasing is not detected */

明显的解决方法是使用临时的:

void rotate_cw(vec_t const *from,
               vec_t       *to)
{
        int temp = from->x;
        to->x = from->y;
        to->y = -temp;
}

这是标准行为吗?我期待编译器,除非被告知,否则会假设两个指针都可能有别名。

4

3 回答 3

4

看看这个答案

尝试将__restrict放在参数之前,这似乎是任何人发现让 MSVC 发出任何警告的唯一方法。

于 2009-06-07T19:48:31.513 回答
4

编写的代码在 C89 或 C99 中完全有效。它是模糊的,但编译器没有什么可以诊断的,所以它不会诊断。

如果你在函数的两个参数上都使用了 C99 和 'restrict',那么你会得到一个错误——如果你的编译器支持 C99。AFAIK,目前还没有 MSVC 版本完全支持 C99。

于 2009-06-07T20:12:32.463 回答
0

在 C99 发明restrict限定符之前,一些 C 编译器包含优化选项,可以指导它们对指针的使用做出某些假设;我看到的此类编译器的手册明确警告说,此类优化符合标准,并且可能会任意导致使用某些特定构造的代码,其行为由标准定义,其行为方式与标准和程序员都相反意图。从手册的角度来看,优化告诉编译器编译 C 的一个子集,该子集没有定义 C 中定义的某些极端情况的行为,但允许为那些情况生成更有效的代码确实定义了。

于 2015-08-11T18:22:06.160 回答