尽可能有效地交换字节?

时间:2012-10-03 02:04:26

标签: c++ optimization endianness

目前我有这个函数来交换数据的字节以改变字节顺序。

template<typename Type, unsigned int Half = sizeof(Type)/2, unsigned int End = sizeof(Type)-1> 
inline void swapBytes(Type& x)
{
    char* c = reinterpret_cast<char*>(&x);
    char tmp;
    for (unsigned int i = 0; i < Half; ++i) {
        tmp = c[i];
        c[i] = c[End-i];
        c[End-i] = tmp;
    }
}

这个函数将被我的一些算法调用几百万次。因此,每一条可以避免的指令都是好事。

我的问题是:如何优化此功能?

1 个答案:

答案 0 :(得分:0)

首先,您需要检查您的硬件平台是否有字节交换指令。有些平台有这些说明,有些没有。之后,您需要查找使用它们的库函数。检查文档或在调试器中停止并查看反汇编。你很有可能找到一个。其他任何东西都不可能比这更好。

最终在使用这些指令的汇编程序中编写自己的函数。

对于2字节类型,直接表转换将起作用。这是128 kb,对于我们这些日常计算机来说并不是那么多。对于32位类型,这接近于矫枉过正,但在某些(罕见)情况下仍然可以在64位大盒子上运行。

您还可以结合使用asm指令,表格转换和优化循环。