嗨,我正在使用 C++ / Boost ASIO,我必须内联ntohl()
出于性能原因。每个数据包包含 256 个 int32,因此需要大量调用ntohl()
。有人这样做过吗?
以下是 VC10++ 的编译后的程序集输出,所有优化均已打开:
; int32_t d = boost::asio::detail::socket_ops::network_to_host_long(*pdw++);
mov esi, DWORD PTR _pdw$[esp+64]
mov eax, DWORD PTR [esi]
push eax
call DWORD PTR __imp__ntohl@4
我也尝试过常规的ntohl()
由 winsock 提供。任何帮助将不胜感激。
另外,我一直在思考 C 的方式#define
执行简单 int32 桶移位的宏(如果网络顺序在编译时与机器顺序不匹配)。如果有人知道并且可以提供最有效的组装ntohl()
在 x86 / x64 架构上,那就太棒了。最终我的代码也需要移植到 ARM。
x86-32 和 x86-64 平台具有 32 位“bswap”汇编指令。我不认为你会比一次手术做得更好。
uint32_t asm_ntohl(uint32_t a)
{
__asm
{
mov eax, a;
bswap eax;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)