C / Boost ASIO中的内联ntohs()/ ntohl()
发布时间:2020-12-16 09:37:23 所属栏目:百科 来源:网络整理
导读:嗨,我正在使用C / Boost ASIO,出于性能原因,我必须内联ntohl().每个数据包包含256个int32,因此对ntohl()进行了大量调用.有没有人这样做过? 这是从VC10开始编译的程序集输出,所有优化都打开: ; int32_t d = boost::asio::detail::socket_ops::network_to_ho
嗨,我正在使用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().任何帮助将不胜感激. 另外,我一直在考虑使用#define宏的C方式来执行简单的int32桶移位(如果网络顺序与编译时的机器顺序不匹配).如果有人知道并且可以在x86 / x64架构上为ntohl()提供最有效的程序集,那就太棒了.最终我的代码也需要可移植到ARM. 解决方法
x86-32和x86-64平台具有32位’bswap’汇编指令.我不认为你会比一次手术更好.
uint32_t asm_ntohl(uint32_t a) { __asm { mov eax,a; bswap eax; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |