未对齐读取:memcpy生成的代码比shift更好

时间:2017-04-12 23:08:47

标签: c++ memcpy shift

我正在编写一些函数来从未对齐的字节数组中读取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似乎更快?第二种方法总是最好的吗?

0 个答案:

没有答案