事前C99と制限し、edness
-
12-09-2019 - |
質問
このコードを考慮すると、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;
}
は、この標準の動作ですか?私はそう言われない限り、コンパイラは、おそらくエイリアスするの のポインタの両方を想定するであろうと。
期待していました解決
この回答をチェックします。
パラメータの前に __restrict に入れてみてください、誰もが任意の警告を与えるためにMSVCを取得する見つけた唯一の方法であると思われる。
他のヒント
書かれたように、コードは、C89やC99で、完全に有効です。それははっきりしないが、コンパイラが診断するために何もないので、それは診断しません。
あなたは機能の両方のパラメータにC99と「制限」を使用した場合は、、あなたはエラーになるだろう - あなたのコンパイラはC99をサポートしている場合。私の知る限り、MSVCのない現在のバージョンでは、まだ完全にはC99をサポートしていません。
C99は
restrict
修飾子を発明する前には、いくつかのCコンパイラは、ポインタの使用状況に関する一定の仮定を作るためにそれらを指示しまうの最適化オプションが含まれ;私は、コンパイラのために見てきたマニュアルは、明示ような最適化は、のの標準に準拠していなかったことを警告し、任意たように動作し、動作が標準で定義されたある特定の構文を使用してコードを引き起こす可能性があり標準およびプログラマの意図の両方に反します。マニュアルの観点から、最適化はCで定義された特定のコーナーケースの振る舞いを定義していないCのサブセットをコンパイルするコンパイラを語ったが、これは、これらの例のために、より効率的なコードの生成を可能にすること定義しました。
所属していません StackOverflow