關於C語言結構體對齊問題的探討
關於C語言結構體對齊問題的探討
今天跟一個同事聊天中,討論起了C語言結構體對齊的問題,查閱了一些blog,發現這些blog多多少少有些地方忽略了,或者是敘述的不清楚。在這裡,我想做個總結,梳理一下。
先扯點題外話,我在查閱blog的時候,發現很多人都是你抄我,我抄你,一個錯誤到處重現。。。我要問,有意思嗎?寫技術blog是在完任務嗎?希望大家寫blog的時候能參考下面這位大哥的建議,寫出有價值,能幫助別人的東西。
從理論上看:
位元組對齊的細節和編譯器實現相關,但一般而言,滿足三個準則:
1.結構體變數的首地址能夠被其最寬基本型別成員的大小所整除;
2. 結構體每個成員相對於結構體首地址的偏移量(offset)都是該成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal adding);
3. 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末一個成員之後加上填充位元組(trailing padding)。
4. 對於結構體巢狀結構體,其對齊仍按照基本資料型別拆分來分析
上面這些條準則在很多blog上都提到過,我想問問這些博主,你們有沒有交代過前三條是windows平臺上的規則?或許這樣說太武斷,但是linux下不能按照
這些“準則”去分析。
在win下這些準則基本上可以讓你搞清許多關於結構體對齊的問題(包括那些噁心的面試題)。
剩下的,像巢狀,#pragma pack(n),位域等,大家可以去google,資料很多。還是那句話,要自己去好好考察下,因為有些博主是不負責任的。
這裡說下GCC下結構體對齊的一些規則:
(offset代表對齊的偏移,T代表基本資料型別, size代表基本型別的大小)
size = sizeof(T)
if (size <= 2) {
offset= size;
} else {
offset= 4;
}
即小於等於2的時候,按照型別本身大小來算,而大於2的型別一律將4作為對齊偏移。
結構體整體的對齊規則按照最大成員大小來定,超過4位元組的,按照4位元組對齊。
剩下的我就不想多說了,有很多blog對這一個話題都有比較好的分析和總結,我就不重複了。這裡給出我發現的一些相對較好blog,供大家參考:
1.關於對齊問題的設計思想、注意事項和相關擴充知識介紹。
http://blog.csdn.net/shenbin1430/article/details/4292463
2.對#pragma pack(n)相關問題做了闡述。
http://www.cppblog.com/Tauruser/archive/2007/02/28/19049.html
3.對含有位域的對齊問題做了探討。
相關文章
- C語言中結構體struct的對齊問題C語言結構體Struct
- C 語言結構體的對齊原則結構體
- 乾貨| 關於程式碼對齊的探討
- C結構體中資料的記憶體對齊問題結構體記憶體
- 結構體成員對齊的問題結構體
- C語言記憶體對齊C語言記憶體
- C語言關於回撥函式和this指標探討C語言函式指標
- 關於結構體中指標的一些探討結構體指標
- 關於C語言的面試問題C語言面試
- C語言結構體專題C語言結構體
- C 語言結構體記憶體佈局問題結構體記憶體
- C語言結構體記憶體佈局問題C語言結構體記憶體
- 結構體內部儲存中的對齊問題結構體
- C/C++結構體對齊測試C++結構體
- C語言(結構體)C語言結構體
- c語言資料結構補齊原則C語言資料結構
- c 結構體記憶體對齊詳解結構體記憶體
- C++ struct結構體記憶體對齊C++Struct結構體記憶體
- 關於C語言結構體賦值(linux核心風格)C語言結構體賦值Linux
- C語言:記憶體位元組對齊詳解C語言記憶體
- C/C++ 結構體位元組對齊詳解C++結構體
- 對日軟體外包專案問題探討(轉)
- 結構體記憶體對齊結構體記憶體
- 有關C++引數傳值的一個問題探討C++
- 關於記憶體對齊記憶體
- 關於c#實現影音嗅探的問題C#
- c/c++資料對齊問題C++
- 關於c語言輸入字串的總結C語言字串
- 有幾點關於C語言的疑問C語言
- 資料結構與演算法系列(二):關於陣列,我想探討兩個問題資料結構演算法陣列
- 關於go結構體一個奇怪問題Go結構體
- 關於C語言的常量C語言
- C語言-對一個結構體中的欄位進行排序C語言結構體排序
- 關於mongo原子操作的探討Go
- 關於identity列的探討IDE
- C語言-->(十四)結構體、巨集、編譯C語言結構體編譯
- C語言結構體作為形參C語言結構體
- C語言_瞭解下結構體指標C語言結構體指標