0

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

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;
    }
}

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

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

4

1 回答 1

0

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

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

对于 2 字节类型,可以进行直表转换。这是 128 kb,对于我们现在的计算机来说并不算多。对于 32 位类型,这几乎是矫枉过正,但在某些(罕见的)情况下,可能仍然适用于大型 64 位机器。

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

于 2012-10-03T02:24:45.047 回答