C中结构体的存储分配
生活随笔
收集整理的這篇文章主要介紹了
C中结构体的存储分配
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
對于C語言中結構體所占的存儲空間的大小,也一直是筆試面試的常客,今天好好看了一下這方面,以前一直以為很清楚了,今天通過各種實際測試舉例,發現原來還是沒有搞透徹,好在現在是徹底懂了,所以和大家分享,希望能有所幫助。
提到結構體,相信大家都知道元素存儲要對齊,話是沒有錯,只是這個“對齊”里面包含了很多微妙的東西。首先詳細的給出結構體內存分配的原則吧:編譯器按照成員列表順序一個接一個地給每個成員分配內存。只有當存儲成員時需要滿足正確的邊界對齊要求時,成員之間才可能出現用于填充的額外內存空間。接下來我們來慢慢理解這句話。 sizeof操作符能夠得出一個結構的整體長度,包括因邊界對齊而跳過的那些字節。所以一般都用sizeof來計算其所占存儲空間。來看下面的例子: struct test1? { int a; char b[9]; char c; }; 計算可以得到test1占16個字節。原因是a占4個字節(32位機,int占4個字節),b和c分別占9個字節和1個字節,加起來10個字節,與a對齊,則需要12個字節,所以總共需要16個字節。這個例子就是我們最熟悉的,接下來看一下個。 struct test2? { char b[9]; int a; char c; }; 計算可以得到test2占20個字節。比較test1和test2可以發現僅僅將a和b的位置換了一下,為什么結果會不同呢?這就是前面定義中所說的順序的問題。int為最大字節,一開始分配9個字節,然后是a,為了對齊,這時候應該是12+4個字節,后面又來一個char,為了對齊加4,所以總共是20個字節。而test1因為后面兩個類型一致,所以可以和在一起分配,然后對齊。 接下來我們在加大難度,看如下例子: struct test3? { char b[9]; int a; char c; double d; }; 按照上面的邏輯,b占9個字節,a占4個字節,為了和a對齊,所以此時應該是12+4,接著是c為1個字節總共為12+4+1=17,然后是d為8個字節,為了和8字節對齊,則應該為24+8=32個字節,即最終結果為32個字節。變換一下順序,得到如下例子: struct test4? { char b[9]; int a; double d; char c; }; 同樣的,b和a占據12+4個字節,d為8個字節,則應該是16+8=24,加上最后的一個字節,為了對齊,總共也是24+8=32個字節。這里需要注意的是,若數組b元素改為13,則為了對齊,d前面應該是16+4,然后遇到d,對齊后為24+8,在加上最后的8個字節,應該為40個字節。 再來看一個: struct test4? { double d; char b[9]; int a; char c; }; d占8個字節,b占9個字節,后面是int,為了對齊,加上a應該是20+4,再加上1個字節,為了和最大的double對齊,所以應該是20+4+8=32個字節。 好了,通過列舉這么多不同的例子,最終目標只有一個,是真的搞清楚某個結構體占據的空間大小。通過上面的例子,我總結了以下幾點。 1)首先,看該結構體中最大的“基元素”(這是我杜撰的,就是說基本元素類型最大的是哪個,例如test1和test2都是int,而test3和test4都是double,而不是看數組總共所占據的大小),找到這個以后,結構體所占據的空間的大小一定要是該基本元素所占空間大小的整數倍。 2)接著,按順序將元素進行排列。前一元素要與后一元素對齊,如果后一元素的“基元素”比前一個大,則前一元素需要調整大小,即對齊該后一元素。 3)最后將得到的字節大小加起來,跟最大的基元素對齊,即得到最終的所占存儲空間大小。 如果要確定結構中某個成員的實際位置,可以使用offsetof宏(stddef.h)offsetof(type,member)。type是結構的類型,member是該結構的成員名,表達式的結構是一個sizeof_t值。表示該指定成員的存數位置(離該結構體存儲的起始位置)。 另外還有一點值得一提的是,當結構體里面包含另一結構體時,直接將該結構體中的內容代換進去,計算其總的存儲空間即可。總結
以上是生活随笔為你收集整理的C中结构体的存储分配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前沿 | 美国白宫AI峰会闭幕:特朗普政
- 下一篇: Linux服务器配置秘钥对连接