C語言中 struct成員變數順序對記憶體的佔用
在C語言的結構體中,是會按照其變數型別來進行分配記憶體大小的。但是對於不同的編譯器,結果是不同的,在VC++6.0中是怎麼個分配情況呢?用一下C中的關鍵字sizeof()來測試下,注意sizeof()不是函式哦!只是關鍵字而已。下圖就是在VC++6.0中的位元組分配情況:
下面來分析一下,C中結構體中成員變數的寫法,對佔用記憶體的影響。
卻發現結果不是13個位元組?卻是24個位元組?為什麼呢?哦!肯定是編譯起的問題,對,沒錯,就是編譯器的問題,VC++6.0預設是按照成員變數本身型別來對齊的,比如char 佔一個位元組,就會按照1個位元組對齊,short佔兩個位元組,就會按照2個位元組對齊,同理,int 4個位元組對齊,
預設方式下對齊步驟為:
1.成員變數都按照自己的對齊方式對齊
2.最後整個結構體在按照最大對齊引數對齊 也就是圓整法。
比如上面例子中:第一個成員為int型,所以按照4個位元組對齊(第一個成員的偏移值都是0)位元組對齊,說白了就是當前的偏移地址必須為n的整數倍,比如4個位元組對齊,就是說當前的偏移位元組數必須為4的倍數,因為第一個成員都是從offset為0開始的,所以先上4個位元組來存Int,然後第二個為double,佔8個位元組,也就是此時偏移地址,必須為8的倍數,明顯前面只有4個位元組,不能被8整除,所以必須在填4個位元組的空白位元組,然後在填充8個位元組給ch,最後一個為char型別的,佔一個位元組,都能被1整除。所以成員變數對齊後,佔17個位元組。最後為整體對齊,也就是sizeof(stu)的大小了,按照整體的規則,必須為最大對齊引數的整數倍,max(sizeof(int,double,char)=8所以17往上加,第一個被8整除的就是24,所以最後sizeof後為24。
好我們在結構體中把各個結構體成員變數順序變一下,看下佔用多少記憶體
同理按照上面分析可得到上圖所示。
那麼程式設計師如何按照自己的方式來記憶體對齊呢?用預編譯命名
#pragma pack(n)
.......
#pragma pack 中間的程式碼都將按照n位元組來對齊。
具體規則如下:本質和上面兩條規則一樣
1.各個成員變數按照min(n,sizeof(item))來對齊
比如 int i;這個時候,int佔4個位元組,n=1,此時就是按照1個位元組來對齊的。
2.整體對齊的時候,還是按照最大的對齊引數來對齊。
這裡最大的對齊引數為每個成員變數所最大的對齊引數.y=min(maxsizeof(item),n)
可以看出當n=1時,將按照成員變數本身對齊。
相關文章
- C語言中結構體struct的對齊問題C語言結構體Struct
- 類的成員變數的初始化順序變數
- C++ struct結構體記憶體對齊C++Struct結構體記憶體
- c++語言中類的私有型別或保護型別成員變數C++型別變數
- VS上檢視某個類中各個成員變數所佔用的記憶體空間變數記憶體
- C語言記憶體對齊C語言記憶體
- c語言中的變數儲存區域C語言變數
- struct結構體大小的計算(記憶體對齊)Struct結構體記憶體
- c語言中塊作用域的優先順序高於檔案作用域C語言
- python物件的記憶體佔用Python物件記憶體
- Dig101:Go 之聊聊 struct 的記憶體對齊GoStruct記憶體
- C語言中以字串形式輸出列舉變數C語言字串變數
- c語言中 *p++ 和 (*p)++ 有什麼區別?以及C語言運算子的優先順序。整理。C語言
- influxdb記憶體佔用剖析UX記憶體
- 資源記憶體佔用記憶體
- C語言的記憶體分配C語言記憶體
- Go語言中的變數作用域Go變數
- 記憶體模型之順序一致性記憶體模型
- c++成員變數初始化C++變數
- C/C++多引數函式引數的計算順序與壓棧順序C++函式
- 【iOS】用strong和weak來修飾成員變數的對比iOS變數
- 探索 Go 語言中的記憶體對齊:為什麼結構體大小會有所不同?Go記憶體結構體
- C語言-記憶體分配C語言記憶體
- 成員變數變數
- mariadb 記憶體佔用優化記憶體優化
- node計算記憶體佔用記憶體
- 託管堆記憶體佔用記憶體
- C# 記憶體對齊C#記憶體
- c運算子優先順序表-最全c語言運算子優先順序和結合性對照表C語言
- C++六種記憶體序詳解C++記憶體
- C++原子操作與記憶體序 1C++記憶體
- dart系列之:dart語言中的變數Dart變數
- 聊聊 記憶體模型與記憶體序記憶體模型
- Win10記憶體佔用過多怎麼辦 win10清理記憶體佔用的方法Win10記憶體
- ansible 變數優先順序示例變數
- C語言中結構體感悟C語言結構體
- MySQL記憶體佔用計算公式MySql記憶體公式
- DOTNET記憶體佔用最佳化記憶體
- C++學習筆記(三):類與物件--靜態成員變數與常成員函式C++筆記物件變數函式