尽可能高效地交换字节

Swap bytes as efficiently as possible?

本文关键字:字节 交换 高效 尽可能      更新时间:2023-10-16

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

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

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

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

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

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

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

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