C語言結構體占用記憶體總結
前幾天有個小朋友問了我一下,關于C語言結構體占用空間的問題,覺得以后會對小可愛有點幫助,就打算先寫一下,
struct Test
{
int a;
char b;
int c;
} test;
理論上,結構體中的各個成員在記憶體中應該是連續儲存的,就像陣列里面的元素一樣,事實上,也確實是這個樣子的,不過和我們想象的有點不一樣,
按照我們最初的想法,變數test所占的記憶體為 4 + 1 + 4 = 9,
但是我們寫一個小代碼驗證一下發現和我們想的不一樣,

它的記憶體為12,因為 int型別是4個位元組,所以是不是各個成員的記憶體都是按照最大的那個設定呢?畢竟 4 * 3 = 12,我們再次實驗,

如果按照我們的推測,那么記憶體大小應該是 8 * 3 = 24,為何是16呢?
下面我來總結一下,
總結
C語言結構體所占記憶體大小,其實里面涉及到C語言記憶體對齊,提高尋址效率的一種思想在里面,具體我就不在這里展開來說了,有興趣的可以自己百度了解一下,
其實小可愛最想了解的應該是如何計算,結構體的記憶體大小,
- 不包含,陣列和指標的結構體
對于不包含,陣列和指標的結構體,知道各個成員所占記憶體大小后,可以直接相加,不過相加的時候必須保證前面的成員變數的記憶體所占記憶體必須是下一個成員變數所占記憶體的整倍數,如果不夠就補上;并且最后的結果必須要是所占記憶體空間最大的成員變數的整倍數,
下面我來幾個例子說明:
struct Test
{
double c; //8
int a; //4
char b; //1
} test;
所占記憶體大小,8 + 4 + 1 = 13,最大記憶體為8, 所以應該這樣計算 8 + 4 + 4 = 16,
下面我們交換下,
struct Test
{
int a; //4
double c; //8
char b; //1
} test;
所占記憶體大小, 4 + 8 + 1 = 13,因為double型別是8個位元組,而前面只有4個位元組,并且成員變數最大記憶體為8,所以應該這樣計算 8 + 8 + 8 = 24,
struct Test
{
int a; //4
char b; //1
double c; //8
} test;
同理4 + 1 + 8 = 13,應該變為 4 + 4 + 8 = 16,
- 包含,陣列和指標的結構體
- 包含指標的結構體
對于包含指標的結構體,可以用和上面相同的方法進行計算,一般指標的大小都是固定的4個位元組(在我的電腦上,你們可能不同),因為不管什么型別的指標只需要儲存地址,不需要儲存地址指向空間的內容,
這三種所占記憶體大小均為 4 + 4 + 8 = 16,如果將變數 b 和變數 c 的位置互換,則變為 8 + 8 + 8 = 24,struct Test { char a; //1 char *b; //4 double c; //8 } test; struct Test { char a; //1 int *b; //4 double c; //8 } test; struct Test { char a; //1 double *b; //4 double c; //8 } test;- 包含陣列的結構體
陣列中的元素地址是連續的,所以一個陣列所占空間大小,為陣列型別 * 元素個數,
知道了陣列所占空間大小后,再來說說如何計算結構體中包含陣列的情況,在之前計算的時候,我說過相加的時候必須保證前面的成員變數的記憶體所占記憶體必須是下一個成員變數所占記憶體的整倍數,但是如果下一變數為陣列,則沒有這個要求,
例如:
- 包含指標的結構體
struct Test
{
int a;
char b[21];
int d;
double c;
} test;
應該為 4 + 24 + 4 + 8 = 40,
struct Test
{
int a;
char b[19];
int d;
double c;
} test;
應該為 4 + 20 + 8 + 8 = 40,
struct Test
{
char a; //1
char b[19]; //19
int d; //4
double c; //8
} test;
應該為 1 + 19 + 4 + 8 = 32,
struct Test
{
char a; //1
char b[17]; //17
int d; //4
double c; //8
} test;
應該為 1 + 19 + 4 + 8 = 32,
struct Test
{
char a; //1
char b[15]; //15
int d; //4
double c; //8
} test;
應該為 1 + 15 + 8 + 8 = 32,
希望可以對你有一些幫助,記得點贊加關注哦!!!
不然下次找不到了!!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/229882.html
標籤:其他
上一篇:「陣列方法」寫給女友的一系列 JS 陣列操作(建議收藏 | 內附思維導圖)
下一篇:可拖拽組件slider.js
