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 に答える