有没有办法在C中加速be32enc?这是我为uint32_t做的一个例子:
for (int i=0; i < 19; i++) {
be32enc(&endiandata[i], pdata[i]);
}
功能本身:
static inline void be32enc(void *pp, uint32_t x)
{
uint8_t *p = (uint8_t *)pp;
p[3] = x & 0xff;
p[2] = (x >> 8) & 0xff;
p[1] = (x >> 16) & 0xff;
p[0] = (x >> 24) & 0xff;
}
我用Google搜索,但没有找到任何东西 - 这个话题并不那么受欢迎。目标CPU为i3-7350k,我使用的是msvc2017。也可以使用MIT / GPL库。
答案 0 :(得分:3)
有两项修改可能会改善be32inc
功能的效果。首先摆脱指针魔法并使其成为uint32_t
到uint32_t
的函数。其次,如果您不需要移植到除x86之外的其他体系结构,请使用_bswap
- 内在实现它。
答案 1 :(得分:1)
如果你有一个不错的编译器,你应该能够使用内置函数(顺便说一句,有一个BSD标准函数可以做你想要的,htobe32()
):
#ifndef I_HAVE_A_CRAP_COMPILER
#define bswap32(x) __builtin_bswap32(x)
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
#define htobe32(x) bswap32(x)
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
#define htobe32(x) (x)
#else
#error Must be little or big endian
#endif
#else
/*your implementation here*/
#endif
编辑:如果你想尝试C库的内置htobe32()
功能,你可以:
#define _BSD_SOURCE
#include <endian.h>
虽然内置的编译器可能会更快,因为它将完全避免函数调用和内联高效汇编(x86和x86_64上的单个bswap
指令)