#define EQ4(a_,b_) (*(int*)(a_)==*(int*)(b_))
char *s1 = "food";
char *s2 = "fred";
return EQ4(s1,s2);
が、gccが、この警告を生成している:警告:逆参照型punnedポインタは、厳密なエイリアシング規則を破るだろう。
ポインタ変数に逆参照されたポインタを割り当てていなかったので、厳密なエイリアシングの目的で逆参照としてカウントされていたことは考えませんでした。
私が試した:何の違いを行っていない
#define EQ4(a_,b_) (*(const int const *)(a_)==*(const int const*)(b_))
を。
のRedHat Linuxのバージョン2.6.32-220、gccのバージョン=
4.4.6は、厳密なエイリアシングの警告を使用する方法はありますが、それでもこのようなことはありますか?
ありがとうございます!これらは動作しません
EDIT
:
#define EQ4(a_,b_) (*(int*)(char*)(a_)==*(int*)(char*)(b_))
#define EQ4(a_,b_) (*(int*)(void*)(a_)==*(int*)(void*)(b_))
#define EQ4(a_,b_) (*(int* __attribute__((__may_alias__)))(a_)== \
*(int* __attribute__((__may_alias__)))(b_))
これは動作します:
typedef union bork { char a[4], int n32 } __attribute__((__may_alias__)) TBork;
#define EQ4(a_,b_) ((TBork*)(a_)->n32==(TBork*)(b_)->n32)
あなたのすべては、このをどう思いますか?
正しく整列してください。gccについてはわかりませんが、iccは正しく整列された 'char *'を認識し、警告を出しません。 – hroptatyr
すべての回答ありがとうございます。アライメントのための警告は面白いです。 -march = 686でコンパイルしています。以前のバージョンのgccでは、私はmemcmpトリックをベンチマークしていました。現在のgccのバージョンは改善されているようです。それは小さな範囲ではmemcmpを下げます。私はおそらくこれらのトリックの多くを使用するのをやめることができますが、すべてではありませんので、私はまだすべての異なるアイデアに興味があります。 – johnnycrash