嗨,我使用的是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/

10-09 05:24