計算結構體的大小
c**中定義的結構體是一塊連續記憶體,各成員按照定義的順序依次在其中存放。編譯器在完成語法分析後,需要計算它的大小,然後才能正確地為結構體分配空間。為了讓結構體的所有成員都能正確、快速地訪問,需要位元組對齊。
位元組對齊體現為:在成員之間可能增加補齊位元組,以調整每個成員的偏移;結構體末尾,也可能增加補充位元組。所有補齊位元組計入結構體的大小。
請寫乙個程式來計算結構體的大小,要考慮位元組對齊,同時要支援結構體多層巢狀的情況。
結構體大小的計算
成員在結構體內的偏移必須是它的位元組對齊值的倍數。
l 位元組對齊值:
1)基本型別char、short、int、double的位元組對齊值依次為1、2、4、8。
2)陣列的位元組對齊值等於它的乙個元素的位元組對齊值。
3)結構體的位元組對齊值等於它的所有成員的位元組對齊值的最大值。
2 大小的計算:
1)基本型別char、short、int、double的大小依次為1、2、4、8位元組。
2)陣列的大小等於它的乙個元素的大小乘以元素個數。
3)結構體的大小要補齊到它自己的位元組對齊值的倍數,補齊位元組在末尾。
要求
實現以下介面:
1.開始結構體定義
2.新增基本型別成員
3.新增陣列成員
4.新增巢狀結構體成員
5.結束巢狀結構體成員
6.完成結構體定義,輸出它的大小
呼叫者會保證:
1.結構體的開始和結束是匹配的。
2.不需要考慮空的結構體。
3.陣列只限於一維的基本型別的陣列。
4.最多20層巢狀(巢狀的情況參考示例)
structsize.h
structsize.cpp
main.cpp
計算結構體大小
運算子sizeof可以計算出給定型別的大小,對於32位系統來說,sizeof char 1 sizeof int 4。基本資料型別的大小很好計算,我們來看一下如何計算構造資料型別的大小。c語言中的構造資料型別有三種 陣列 結構體和共用體。陣列是相同型別的元素的集合,只要會計算單個元素的大小,整個陣列...
計算結構體大小
include include include define uint32 unsigned int define uint16 unsigned short define uint8 unsigned char define bool unsigned char 位元組型別列舉 enum type...
結構體大小的計算
位元組對齊原則 結構體預設的位元組對齊一般滿足三個準則 1 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 2 結構體每個成員相對於結構體首位址的偏移量 offset 都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組 internal adding 3 結構體的總大小為結構體最...