我目前正在代码库中工作,其中IPv4地址表示为指针u_int8.等于运算符的实现方式如下:
bool Ipv4Address::operator==(const u_int8 * inAddress) const
{
return (*(u_int32*) this->myBytes == *(u_int32*) inAddress);
}
Run Code Online (Sandbox Code Playgroud)
这可能是禁食的解决方案,但它会导致GCC编译器警告:
ipv4address.cpp:65: warning: dereferencing type-punned pointer will break strict-aliasing rules
Run Code Online (Sandbox Code Playgroud)
如何在不破坏严格别名规则且不丢失性能点的情况下正确地重写比较?
我考虑使用其中一个memcmp或这个宏:
#define IS_EQUAL(a, b) \
(a[0] == b[0] && a[1] == b[1] && a[2] == b[2] && a[3] == b[3])
Run Code Online (Sandbox Code Playgroud)
我认为宏是最快的解决方案.
您有什么推荐的吗?
更新
我刚刚阅读文章压缩memcmp用法的性能,解释了编译器(Visual Studio,但也许还有GCC)如何优化!memcmp(..)调用.
Sys*_*ank 10
我会去memcmp()
还要认为如果您的编译器没有内联memcmp(),您将遇到函数上下文切换
你确定你需要努力优化吗?您是否已经检查过您的程序大部分时间都在进行此类操作?
| 归档时间: |
|
| 查看次数: |
1899 次 |
| 最近记录: |