Tôi hiện đang làm việc trong một cơ sở mã nơi các địa chỉ IPv4 được biểu diễn dưới dạng con trỏ tới u_int8
. Các nhà điều hành bình đẳng được thực hiện như thế này:So sánh nhanh các mảng char?
bool Ipv4Address::operator==(const u_int8 * inAddress) const
{
return (*(u_int32*) this->myBytes == *(u_int32*) inAddress);
}
Đây có lẽ là giải pháp nhịn ăn, nhưng nó gây ra các cảnh báo trình biên dịch GCC:
ipv4address.cpp:65: warning: dereferencing type-punned pointer will break strict-aliasing rules
Làm thế nào tôi có thể viết lại việc so sánh một cách chính xác mà không vi phạm quy định nghiêm ngặt-aliasing và không mất điểm hiệu suất?
Tôi đã xem xét sử dụng một trong hai memcmp
hoặc macro này:
#define IS_EQUAL(a, b) \
(a[0] == b[0] && a[1] == b[1] && a[2] == b[2] && a[3] == b[3])
Tôi nghĩ rằng vĩ mô là giải pháp nhanh nhất.
Bạn đề xuất điều gì?
Cập nhật
Tôi chỉ đọc bài viết Squeezing performance out of memcmp usage sẽ giải thích cách trình biên dịch (Visual Studio, nhưng có lẽ cũng GCC) có thể tối ưu hóa !memcmp(..)
cuộc gọi.
Bạn đã thử các tùy chọn khác nhau và đánh giá chúng để xem cái nào thực sự là nhanh nhất? –
@Nick Meyer, chưa, nhưng đó là một gợi ý tốt. – StackedCrooked