2012-10-03 26 views
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; 
    } 
} 

這個函數會被幾百萬次的某些算法調用。因此,每一條可以避免的指令都是一件好事。

我的問題是:如何優化此功能?

+1

posix版本有什麼問題? htons,ntohs,htonl,ntohl? –

+0

他們不在標準的C++庫... – Vincent

+0

我沒有說他們是 - 是你需要滿足的一個要求嗎?如果是這樣的話,請檢查這些的開源版本。 –

回答

0

首先你需要檢查你的硬件平臺是否有字節交換指令。一些平臺有這些說明,其中一些不是。之後,您需要查找使用它們的庫函數。檢查文檔或在調試器中停止並查看反彙編。這是一個很好的機會,你會找到一個。其他任何事情都不可能比這更好。

最終在使用這些指令的彙編器中編寫自己的函數。

對於2字節類型的直接錶轉換將起作用。這是128 kb,這對我們的電腦來說不是那麼多。對於32位類型來說,這已經接近矯枉過正,但在一些(罕見)情況下,仍然可以在64位大的盒子上工作。

您還可以使用asm指令,表格轉換和優化循環的組合。