嗨,我使用的是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
我还尝试了winsock提供的常规
ntohl()
。任何帮助将不胜感激。另外,我一直在考虑C语言的
#define
宏的功能,该宏可以执行简单的int32桶移位(如果网络顺序与编译时的机器顺序不匹配)。而且,如果有人知道并且可以在x86/x64体系结构上为ntohl()
提供最有效的汇编,那将是很棒的。最终,我的代码也需要移植到ARM。 最佳答案
x86-32和x86-64平台具有32位“bswap”汇编指令。我认为您不会比一项手术做得更好。
uint32_t asm_ntohl(uint32_t a)
{
__asm
{
mov eax, a;
bswap eax;
}
}
关于c++ - C++/Boost ASIO中的内联ntohs()/ntohl(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7505388/