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

它的內(nèi)存為12。因為 int類型是4個字節(jié),所以是不是各個成員的內(nèi)存都是按照最大的那個設置呢?畢竟 4 * 3 = 12,我們再次實驗,

如果按照我們的推測,那么內(nèi)存大小應該是 8 * 3 = 24。為何是16呢?
下面我來總結一下。
總結
C語言結構體所占內(nèi)存大小,其實里面涉及到C語言內(nèi)存對齊,提高尋址效率的一種思想在里面。具體我就不在這里展開來說了,有興趣的可以自己百度了解一下。
其實小可愛最想了解的應該是如何計算,結構體的內(nèi)存大小。
不包含,數(shù)組和指針的結構體
對于不包含,數(shù)組和指針的結構體,知道各個成員所占內(nèi)存大小后,可以直接相加,不過相加的時候必須保證前面的成員變量的內(nèi)存所占內(nèi)存必須是下一個成員變量所占內(nèi)存的整倍數(shù),如果不夠就補上;并且最后的結果必須要是所占內(nèi)存空間最大的成員變量的整倍數(shù)。
下面我來幾個例子說明:
struct Test
{
double c; //8
int a; //4
char b; //1
} test;
所占內(nèi)存大小,8 + 4 + 1 = 13,最大內(nèi)存為8, 所以應該這樣計算 8 + 4 + 4 = 16。
下面我們交換下,
struct Test
{
int a; //4
double c; //8
char b; //1
} test;
所占內(nèi)存大小, 4 + 8 + 1 = 13,因為double類型是8個字節(jié),而前面只有4個字節(jié),并且成員變量最大內(nèi)存為8,所以應該這樣計算 8 + 8 + 8 = 24。
struct Test
{
int a; //4
char b; //1
double c; //8
} test;
同理4 + 1 + 8 = 13,應該變?yōu)?4 + 4 + 8 = 16。
包含,數(shù)組和指針的結構體 包含指針的結構體
對于包含指針的結構體,可以用和上面相同的方法進行計算,一般指針的大小都是固定的4個字節(jié)(在我的電腦上,你們可能不同),因為不管什么類型的指針只需要儲存地址,不需要儲存地址指向空間的內(nèi)容。
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;
這三種所占內(nèi)存大小均為 4 + 4 + 8 = 16。如果將變量 b 和變量 c 的位置互換,則變?yōu)?8 + 8 + 8 = 24。 包含數(shù)組的結構體
數(shù)組中的元素地址是連續(xù)的,所以一個數(shù)組所占空間大小,為數(shù)組類型 * 元素個數(shù)。
知道了數(shù)組所占空間大小后,再來說說如何計算結構體中包含數(shù)組的情況,在之前計算的時候,我說過相加的時候必須保證前面的成員變量的內(nèi)存所占內(nèi)存必須是下一個成員變量所占內(nèi)存的整倍數(shù),但是如果下一變量為數(shù)組,則沒有這個要求。
例如:
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。
到此這篇關于C語言結構體占用內(nèi)存的文章就介紹到這了,更多相關C語言結構體占用內(nèi)存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- C語言結構體的具體使用方法
- C語言入門篇--初識結構體
- C語言自定義類型詳解(結構體、枚舉、聯(lián)合體和位段)
- c語言結構體字節(jié)對齊的實現(xiàn)方法
- C語言中結構體與內(nèi)存對齊實例解析
- C語言結構體計算內(nèi)存占用問題解析
- C語言結構體指針案例解析
- C語言中結構體和共用體實例教程
- C語言結構體簡單入門講解
- C語言使用四種方法初始化結構體
- C語言新手練習之多維數(shù)組、結構體及函數(shù)
- C語言中結構體、聯(lián)合體的成員內(nèi)存對齊情況
- C語言自定義數(shù)據(jù)類型的結構體、枚舉和聯(lián)合詳解
- C語言結構體內(nèi)存的對齊知識詳解
- C語言結構體版學生成績管理系統(tǒng)
- C 語言結構體的使用方法
相關文章
C++設計模式之模板方法模式(TemplateMethod)
這篇文章主要為大家詳細介紹了C++設計模式之模板方法模式TemplateMethod,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04
C++利用數(shù)組(一維/二維)處理批量數(shù)據(jù)的方法
對于簡單的問題,使用簡單的數(shù)據(jù)類型就可以了,但是對于有些需要處理的數(shù)據(jù),只用以上簡單的數(shù)據(jù)類型是不夠的,難以反映出數(shù)據(jù)的特點,也難以有效的進行處理,本文小編給大家介紹了C++利用數(shù)組(一維/二維)處理批量數(shù)據(jù)的方法,需要的朋友可以參考下2023-10-10

