目前我有这个函数来交换数据的字节以改变字节顺序。
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;
}
}
这个函数将被我的一些算法调用几百万次。因此,每一条可以避免的指令都是好事。
我的问题是:如何优化此功能?
答案 0 :(得分:0)
首先,您需要检查您的硬件平台是否有字节交换指令。有些平台有这些说明,有些没有。之后,您需要查找使用它们的库函数。检查文档或在调试器中停止并查看反汇编。你很有可能找到一个。其他任何东西都不可能比这更好。
最终在使用这些指令的汇编程序中编写自己的函数。
对于2字节类型,直接表转换将起作用。这是128 kb,对于我们这些日常计算机来说并不是那么多。对于32位类型,这接近于矫枉过正,但在某些(罕见)情况下仍然可以在64位大盒子上运行。
您还可以结合使用asm指令,表格转换和优化循环。