2014-02-09 194 views
3

我讀到關於C#非託管代碼,和整個以下行來了: -什麼是包裝尺寸?

在C#程序CLR找到偏移採用現場令牌。
C字段名稱直接編譯爲偏移量。對於訪問速度,每個字段放置在字段大小倍數的偏移處。
但是,該乘數限制爲最大x字節,其中x是「包裝大小」。

我的問題是什麼是包裝大小?

回答

2

在計算機體系結構中,事情變得更快了byte aligned。當語言規範談論包大小時,這是一個問題,即編譯器會根據事物的對齊方式自動創建更大的數據大小的插槽。這意味着有時你認爲會是一個2字節的字段,實際上可能是內存中的一個4字節的插槽。如果你想削減存儲大小,換取cpu減速,你可以調整包大小。

查看包裝上的msdn瞭解更多信息。

引述此tutorial

歷史存儲器是按字節尋址的,並依次排列。 如果 存儲器被安排爲一個字節寬度的單個存儲區,則處理器 需要發出4個存儲器讀取週期來獲取整數。在一個存儲器週期中讀取所有4個字節的整數是更經濟的。要取得這樣的優勢,內存將被安排爲上圖中顯示的 四個組的組。

存儲器尋址仍然是順序的。如果銀行0佔用地址X的 ,則銀行1,銀行2和銀行3將處於(X + 1),(X + 2)和 (X + 3)地址。如果在X地址 (X是4的倍數)上分配了一個4字節的整數,則處理器只需要一個存儲週期,即可讀取整個整數爲 。

凡爲,如果整數在比 4的倍數以外的地址分配,它橫跨銀行兩行跨越如圖中 下圖。這樣的整數需要兩個存儲器讀取週期來獲取數據。

...

變量與數據的方式排列的交易存儲在 這些銀行的數據。例如,32位的 機器上int的自然對齊方式是4個字節。當數據類型自然對齊時,CPU 以最小讀取週期提取它。

類似地,short int的自然對齊是2個字節。這意味着,短整型可存儲在銀行0 - 銀行1對或銀行2 - 銀行3 對中。一個double需要8個字節,並在內存中佔用兩行bank。雙倍的任何未對齊將迫使兩個以上的讀取週期 獲取雙倍數據。

請注意,一個雙變量將分配在32位機器的8字節邊界上,並且需要兩個存儲器讀取週期。在一個64位的機器上,基於存儲體數量的 ,雙變量將分配在8字節的 邊界上,並且只需要一個存儲器讀取週期。

雖然語言不同,但概念是相同的

4

我帶你去現場校準的細節作爲一個給定的,覆蓋devshorts'報價。包大小設置是編譯器停止嘗試保持字段對齊的位置,因爲它太大。

這是一個編譯器設置或本地代碼中的#pragma。這是英特爾處理器上的一個棘手問題,因爲它們很靈活,並且允許數據未對齊,幾乎沒有懲罰。包的大小爲8是一個非常常見的默認值,幾乎總是正確的。有時它是1或4. [StructLayout]聲明中的Pack屬性必須匹配,否則讀取垃圾的可能性很大,因爲您會在錯誤的內存位置讀取一個字段。