मैं वर्तमान में एक कोडबेस में काम कर रहा हूं जहां आईपीवी 4 पते को u_int8
पर पॉइंटर्स के रूप में दर्शाया गया है। समानता ऑपरेटर इस तरह कार्यान्वित किया जाता है:चार सरणी की तेज़ तुलना?
bool Ipv4Address::operator==(const u_int8 * inAddress) const
{
return (*(u_int32*) this->myBytes == *(u_int32*) inAddress);
}
यह शायद उपवास समाधान है, लेकिन यह जीसीसी संकलक चेतावनी का कारण बनता है:
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])
मैं सोच रहा हूँ कि मैक्रो सबसे तेजी से समाधान है।
आप क्या सलाह देते हैं?
अद्यतन
मैं सिर्फ लेख Squeezing performance out of memcmp usage जो बताते हैं कि कैसे संकलक (विजुअल स्टूडियो, लेकिन शायद यह भी जीसीसी) !memcmp(..)
कॉल अनुकूलन कर सकते हैं पढ़ें।
क्या आपने विभिन्न विकल्पों को आजमाया है और यह देखने के लिए बेंचमार्क किया है कि वास्तव में सबसे तेज़ कौन सा है? –
@ निक मेयर, अभी तक नहीं, लेकिन यह एक अच्छा सुझाव है। – StackedCrooked