我目前在一個代碼庫中工作,其中IPv4地址表示爲指向u_int8
的指針。等於運算符來實現這樣的:字符數組的快速比較?
bool Ipv4Address::operator==(const u_int8 * inAddress) const
{
return (*(u_int32*) this->myBytes == *(u_int32*) inAddress);
}
這可能是禁食的解決方案,但它會導致GCC編譯器警告:
ipv4address.cpp:65: warning: dereferencing type-punned pointer will break strict-aliasing rules
我怎樣才能正確地改寫比較沒有打破嚴格走樣規則並且不會失去性能點?
我可以選擇是使用memcmp
或該宏認爲:
#define IS_EQUAL(a, b) \
(a[0] == b[0] && a[1] == b[1] && a[2] == b[2] && a[3] == b[3])
我想的是,宏是最快的解決方案。
你有什麼建議?
更新
我剛纔讀這也解釋了編譯器(Visual Studio中,但或許也GCC)如何優化!memcmp(..)
來電文章Squeezing performance out of memcmp usage。
您是否嘗試了不同的選項並對它們進行基準測試,以查看哪一個確實是最快的? – 2010-05-28 14:45:10
@尼克邁爾,還沒有,但這是一個很好的建議。 – StackedCrooked 2010-05-28 15:10:02