關於struct占用記憶體大小的幾點分析

2021-06-21 10:50:29 字數 1386 閱讀 4238

struct占用記憶體空間分析

在初學c語言的時候,很多人都認為struct結構體占用記憶體空間的大小等於所有結構體成員各自所佔記憶體空間的總和,其實這種觀點是存在誤區的。

舉乙個簡單的例子:

#include

struct test ;

int main(void)

程式執行的結果為4;(注:我使用gcc進行編譯,編譯器預設4位元組對齊)

很多人會很奇怪,為什麼執行的結果不是sizeof(char)+sizeof(short)=3?

之所以會得出占用記憶體為4個位元組的結果主要原因是編譯器的優化;

cpu在訪問資料時,是按照「塊「的大小來訪問的,通常塊的大小為 (1,2,4,8…….)個位元組因此如果編譯器不做優化,那麼cpu會先使用一條指令讀取乙個位元組,然後使用另一條指令讀取兩個位元組,那麼最後執行的結果就為3個位元組,但是這種做法使cpu的工作效率降低,因此在實際應用中,為了提高cpu工作效率,編譯器需要對程式進行優化操作,使用一條指令一次性讀取4個位元組。這樣執行的結果是會多出乙個位元組的空間,也就是上面test的執行結果

struct占用記憶體的計算規則為:

1.每個成員按其型別大小和指定對齊引數n中較小的乙個進行對齊

2.確定的對齊引數必須能夠整除起始位址(或偏移量)

3.偏移位址和成員占用大小均需對齊

4.結構體成員的對齊引數為其所有成員使用的對齊引數的最大值

5.結構體總長度必須為所有對齊引數的整數倍

下面我們來舉乙個例子進行分析:

#include

struct test ;

int main(void)

執行結果為1,4,4,12

型別大小位元組對齊數起始位址占用空間空餘空間

1            4       char  a    0x0          1         0

4            4       int   b    0x04         4         3

4            4       float  c    0x08         4         0 

總空間大小為占用空間+空餘空間=12

為了加深大家的理解我解釋一下char a 和int b 所占用記憶體空間的計算過程;

a 的型別為char因此所佔記憶體空間大小為1個位元組,小於對齊引數4,所以選擇1為對齊數,而位址0x0能夠被1整除,所以0x0為a的起始位址占用空間大小為1個位元組;

b 的型別為int 所佔記憶體空間大小為4個位元組,與對齊引數相同,因此4為對齊數,0x1不能被4整除,因此不能作為b 的起始位址依次往下推,只能選用0x4作為b 的起始位址,因此中間會空出3個位元組的空餘空間

注:一般編譯器會設定預設的對齊引數,對於devc++ 和gcc來說,預設引數均為4

Redis占用記憶體大小

redis占用記憶體大小 我們知道redis是基於記憶體的key value資料庫,因為系統的記憶體大小有限,所以我們在使用redis的時候可以配置redis能使用的最大的記憶體大小。1 通過配置檔案配置 通過在redis安裝目錄下面的redis.conf配置檔案中新增以下配置設定記憶體大小。設定r...

類的占用記憶體大小

1.類的大小為類的非靜態成員資料的型別大小之和,也 就是說靜態成員資料不作考慮。2.普通成員函式與sizeof無關。3.靜態成員並不屬於某個物件,sizeof取的是物件大小。4.虛函式由於要維護在虛函式表,所以要佔據乙個指標大小,也就是4位元組。5.空類的sizeof為1。因為乙個空類也要例項化,所...

struct結構體記憶體大小

概括 一.基本原則 1.struct中成員變數的宣告順序,與成員變數對應的記憶體順序是一致的 2.struct本身的起始儲存位址必須是成員變數中最長的資料型別的整倍數,注意是最長的資料型別,而不是最長的變數 對於陣列只看型別不看元素個數 3.記憶體對齊與編譯器設定有關。二.計算規則 以下的所有規則,...