有没有办法在C中加速be32编码?

时间:2018-01-10 09:25:05

标签: c optimization encode compiler-optimization endianness

有没有办法在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库。

2 个答案:

答案 0 :(得分:3)

有两项修改可能会改善be32inc功能的效果。首先摆脱指针魔法并使其成为uint32_tuint32_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指令)