2015-08-26 23 views
2

對不起,這個令人困惑的標題,但我想不出一個更好的方式來解釋它。爲什麼BitConverter.ToInt32一次只讀取一個字節,如果數據未在給定偏移量處對齊?

在瀏覽的BitConverterthe 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));       
      } 
     } 
    } 
} 

如何鑄造pbyteint*(6號線)違反數據排列在這種情況下?爲了簡潔起見,我把它留在了外面,但代碼有適當的參數驗證,所以我非常肯定它不能成爲內存訪問衝突。鑄造時失去精度?

換句話說,爲什麼不能代碼被簡化爲:

public static unsafe int ToInt32(byte[] value, int startIndex) 
{ 
    fixed (byte* pbyte = &value[startIndex]) 
    { 
     return *(int*)pbyte; 
    } 
} 

編輯:Here是有問題的代碼段。

+1

在數據大小邊界上對齊的數據操作速度更快,並且在某些CPU上訪問不對齊的單詞/雙字/浮點/雙精度是訪問過程...(評論,因爲我沒有很好的鏈接方便)。 –

+0

@AlexeiLevenkov您還可以創建兩個額外的分支,多個按位操作,*和*解引用'pbyte + 1','pbyte + 2'等(其中3個不會「對齊」),以便您可以避免不對齊。似乎對我來說太過矯枉過正。 –

+0

不確定你的評論 - 有你平坦的CPU無法訪問未對齊的'int' - http://stackoverflow.com/questions/1237963/alignment-along-4-byte-boundaries - 所以什麼替代實現做你建議比較逐字節閱讀? –

回答

1

我打賭,這具有在C#規範(重點煤礦)的5.0版本§18.4的這一部分要做到:

當一個指針類型轉換爲另一種,如果所得的指針沒有正確對齊指定類型,如果結果被解除引用,行爲是不確定的。

完成「未對齊」情況下的順序複製以避免依賴明確未定義的行爲。

相關問題