我想要做這樣的事情:型punned警告
#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_))
這沒有什麼區別。
紅帽Linux版本2.6.32-220,gcc版本4.4.6 =
有沒有辦法使用嚴格別名警告,但仍做這樣的事情?
謝謝!
編輯
這些不工作:
#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 *'s並且不會發出警告 – hroptatyr 2012-03-21 16:25:57
感謝所有人的回覆。由於對齊的警告很有趣。我們正在編譯-march = 686。在gcc的早期版本中,我對我的memcmp技巧進行了基準測試,儘管沒有最佳對齊方式,但它們出現得更快。當前版本的gcc似乎有所改進 - 它爲小範圍降低了memcmp。我可能會停止使用許多這些技巧,但不是全部,所以我仍然對所有不同的想法感興趣。 – johnnycrash 2012-03-21 17:33:56