在編譯期間確定C 類別的大小
了解類別大小和記憶體對齊
在C 中,類別大小在編譯期間靜態確定,以最佳化記憶體分配和存取。為了有效計算類別大小,編譯器會考慮各種因素,包括資料成員大小和對齊要求。
資料成員對齊和大小計算
對於普通舊資料(POD) ) 具有確定大小的資料成員的類,通常適用以下規則:
- 每個資料成員擁有大小(s) 和對齊要求(a)。
- 編譯器的初始值大小 (S) 設定為 0,而對齊 (A) 設定為 1 位元組。
-
依序處理成員:
- 檢查對齊要求 (a) 。如果 S 不能被 a 整除,則增加 S 以使成員對齊到正確的偏移量。
- 將 A 更新為目前 A 和 a 的最小公倍數。
- 將 S 增加 s 至容納該成員。
- 處理完所有成員後,確保S能被A整除;如果不是,則相應地增加 S。
- S 的最終值代表班級大小。
其他注意事項
- 陣列:大小的計算方式為元素數量乘以元素大小; alignment 是元素的對齊要求。
- 結構:使用相同的規則遞歸計算大小和對齊。
- 聯合:大小是最大成員的大小加上滿足以下條件的任何填充:所有成員對齊的最小公倍數。
範例:TestClass3
對於TestClass3,大小計算如下:
-
buf[8] 需要 8 個位元組,需要8 個位元組,對齊方式為1,因此S 變成8。 - __m128i vect 需要 16 個位元組,對齊方式為 16。 S 首先增加到 16 以進行對齊,然後增加到 32 以容納 vect。
- buf2[8] 需要 8 個位元組,對齊方式為 1。 S 增加到 24。
- 由於 24 不能被 16 整除,所以 S 增加 8 到 32。
因此,TestClass3 的大小為 32 個位元組。
結論
透過遵守這些對齊和大小計算規則,編譯器可確保最佳的記憶體分配和高效C 類的資料存取。
以上是C編譯器在編譯過程中如何計算類別的大小?的詳細內容。更多資訊請關注PHP中文網其他相關文章!