2
對不起,這個令人困惑的標題,但我想不出一個更好的方式來解釋它。爲什麼BitConverter.ToInt32一次只讀取一個字節,如果數據未在給定偏移量處對齊?
在瀏覽的BitConverter
the source code最近,我遇到的代碼奇怪段傳來:
public static unsafe int ToInt32(byte[] value, int startIndex)
{
fixed (byte* pbyte = &value[startIndex])
{
if (startIndex % 4 == 0) // data is aligned
return *((int*)pbyte);
else
{
if (IsLittleEndian)
{
return (*pbyte) | (*(pbyte + 1) << 8) | (*(pbyte + 2) << 16) | (*(pbyte + 3) << 24);
}
else
{
return (*pbyte << 24) | (*(pbyte + 1) << 16) | (*(pbyte + 2) << 8) | (*(pbyte + 3));
}
}
}
}
如何鑄造pbyte
到int*
(6號線)違反數據排列在這種情況下?爲了簡潔起見,我把它留在了外面,但代碼有適當的參數驗證,所以我非常肯定它不能成爲內存訪問衝突。鑄造時失去精度?
換句話說,爲什麼不能代碼被簡化爲:
public static unsafe int ToInt32(byte[] value, int startIndex)
{
fixed (byte* pbyte = &value[startIndex])
{
return *(int*)pbyte;
}
}
編輯:Here是有問題的代碼段。
在數據大小邊界上對齊的數據操作速度更快,並且在某些CPU上訪問不對齊的單詞/雙字/浮點/雙精度是訪問過程...(評論,因爲我沒有很好的鏈接方便)。 –
@AlexeiLevenkov您還可以創建兩個額外的分支,多個按位操作,*和*解引用'pbyte + 1','pbyte + 2'等(其中3個不會「對齊」),以便您可以避免不對齊。似乎對我來說太過矯枉過正。 –
不確定你的評論 - 有你平坦的CPU無法訪問未對齊的'int' - http://stackoverflow.com/questions/1237963/alignment-along-4-byte-boundaries - 所以什麼替代實現做你建議比較逐字節閱讀? –