char数组的快速比较?

Sta*_*ked 5 c++

我目前正在代码库中工作,其中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()

  1. 它更便携
  2. 我通常尽量不比我的编译器/语言更聪明.您正在尝试比较内存内容和(取决于编译器选项)memcmp()的实现应该是最有效的方法.

还要认为如果您的编译器没有内联memcmp(),您将遇到函数上下文切换

你确定你需要努力优化吗?您是否已经检查过您的程序大部分时间都在进行此类操作?

  • 是的,`std :: memcmp()`是std lib用于比较内置函数数组的内容.来自我的+1.如果分析显示某个体系结构上的速度太慢,您可以随时返回并进行更改.不过我对此表示怀疑. (2认同)