我正在编写一些函数来从未对齐的字节数组中读取2,4,8个字节:
我有2个版本。
1:逐字节访问然后移位
template <typename T, size_t val = sizeof(T)>
struct ExtractValue {
// for non pointer types
static T get (const uint8_t *p)
{
return (ExtractValue<T, val - 1>::get(p) << 8) |
static_cast<T>(p[val - 1]);
}
};
// ignore, Just to terminate the above template recursion
template <typename T>
struct ExtractValue<T, 0> {
static T get (const uint8_t *p)
{
return 0;
}
};
版本2:使用memcpy:
template <typename T>
struct ExtractValueI<T, 4> {
static T get (const uint8_t *p)
{
T t;
memcpy(&t, p, sizeof(T));
return __builtin_bswap32(t);
}
};
查看生成的汇编代码。实际上,memcpy版本的指令要少得多 - 比移位版本少40%的指令。 memcpy似乎更快?第二种方法总是最好的吗?