欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言結(jié)構(gòu)體占用內(nèi)存深入講解

 更新時間:2020年12月04日 14:58:39   作者:Y_peak  
這篇文章主要給大家介紹了關(guān)于C語言結(jié)構(gòu)體占用內(nèi)存的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

前幾天有個小朋友問了我一下,關(guān)于C語言結(jié)構(gòu)體占用空間的問題。覺得以后會對小可愛有點幫助,就打算先寫一下。

struct Test
{
 int a;
 char b;
 int c;
} test;

理論上,結(jié)構(gòu)體中的各個成員在內(nèi)存中應(yīng)該是連續(xù)儲存的,就像數(shù)組里面的元素一樣。事實上,也確實是這個樣子的,不過和我們想象的有點不一樣。

按照我們最初的想法,變量test所占的內(nèi)存為 4 + 1 + 4 = 9。

但是我們寫一個小代碼驗證一下發(fā)現(xiàn)和我們想的不一樣。

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

如果按照我們的推測,那么內(nèi)存大小應(yīng)該是 8 * 3 = 24。為何是16呢?

下面我來總結(jié)一下。

總結(jié)

C語言結(jié)構(gòu)體所占內(nèi)存大小,其實里面涉及到C語言內(nèi)存對齊,提高尋址效率的一種思想在里面。具體我就不在這里展開來說了,有興趣的可以自己百度了解一下。

其實小可愛最想了解的應(yīng)該是如何計算,結(jié)構(gòu)體的內(nèi)存大小。

不包含,數(shù)組和指針的結(jié)構(gòu)體

對于不包含,數(shù)組和指針的結(jié)構(gòu)體,知道各個成員所占內(nèi)存大小后,可以直接相加,不過相加的時候必須保證前面的成員變量的內(nèi)存所占內(nèi)存必須是下一個成員變量所占內(nèi)存的整倍數(shù),如果不夠就補上;并且最后的結(jié)果必須要是所占內(nèi)存空間最大的成員變量的整倍數(shù)。

下面我來幾個例子說明:

struct Test
{
 double c; 	//8
 int a;		//4
 char b;		//1
} test;

所占內(nèi)存大小,8 + 4 + 1 = 13,最大內(nèi)存為8, 所以應(yīng)該這樣計算 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,所以應(yīng)該這樣計算 8 + 8 + 8 = 24。

struct Test
{
 int a;		//4
 char b;		//1
 double c; 	//8
} test;

同理4 + 1 + 8 = 13,應(yīng)該變?yōu)?4 + 4 + 8 = 16。

包含,數(shù)組和指針的結(jié)構(gòu)體 包含指針的結(jié)構(gòu)體

對于包含指針的結(jié)構(gòu)體,可以用和上面相同的方法進行計算,一般指針的大小都是固定的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ù)組的結(jié)構(gòu)體

數(shù)組中的元素地址是連續(xù)的,所以一個數(shù)組所占空間大小,為數(shù)組類型 * 元素個數(shù)。

知道了數(shù)組所占空間大小后,再來說說如何計算結(jié)構(gòu)體中包含數(shù)組的情況,在之前計算的時候,我說過相加的時候必須保證前面的成員變量的內(nèi)存所占內(nèi)存必須是下一個成員變量所占內(nèi)存的整倍數(shù),但是如果下一變量為數(shù)組,則沒有這個要求。

例如:

struct Test
{
 int a;
 char b[21];
 int d;
 double c;
} test;

應(yīng)該為 4 + 24 + 4 + 8 = 40。

struct Test
{
 int a;
 char b[19];
 int d;
 double c;
} test;

應(yīng)該為 4 + 20 + 8 + 8 = 40。

struct Test
{
 char a;		//1
 char b[19];	//19
 int d;		//4
 double c;	//8
} test;

應(yīng)該為 1 + 19 + 4 + 8 = 32。

struct Test
{
 char a;		//1
 char b[17];	//17
 int d;		//4
 double c;	//8
} test;

應(yīng)該為 1 + 19 + 4 + 8 = 32。

struct Test
{
 char a;		//1
 char b[15];	//15
 int d;		//4
 double c;	//8
} test;

應(yīng)該為 1 + 15 + 8 + 8 = 32。

到此這篇關(guān)于C語言結(jié)構(gòu)體占用內(nèi)存的文章就介紹到這了,更多相關(guān)C語言結(jié)構(gòu)體占用內(nèi)存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用Debug調(diào)試代碼解決0xC0000005:?讀取位置?0x0000000000000000?時發(fā)生訪問沖突問題

    利用Debug調(diào)試代碼解決0xC0000005:?讀取位置?0x0000000000000000?時發(fā)生訪問沖突問

    這篇文章主要介紹了利用Debug調(diào)試代碼解決0xC0000005:?讀取位置?0x0000000000000000?時發(fā)生訪問沖突,本文給大家分享完美解決方案,需要的朋友可以參考下
    2023-03-03
  • C++如何獲取本機的IP地址

    C++如何獲取本機的IP地址

    這篇文章主要為大家詳細介紹了C++如何獲取本機IP地址小程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++中replace()?函數(shù)的基本用法

    C++中replace()?函數(shù)的基本用法

    今天就跟大家聊聊有關(guān)C++中replace()函數(shù)的作用是什么,可能很多人都不太了解,為了讓大家更加了解,這篇文章主要給大家介紹了關(guān)于C++中replace()?函數(shù)的基本用法,需要的朋友可以參考下
    2021-11-11
  • C++實現(xiàn)LeetCode(128.求最長連續(xù)序列)

    C++實現(xiàn)LeetCode(128.求最長連續(xù)序列)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(128.求最長連續(xù)序列),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言 常量詳解及示例代碼

    C語言 常量詳解及示例代碼

    本文主要講解C語言 常量,這里整理了 C語言常量的基礎(chǔ)知識,并附代碼示例和示例詳細講解,希望能幫助開始學(xué)習(xí)C 語言的同學(xué)
    2016-08-08
  • C++隨機數(shù)生成實例講解

    C++隨機數(shù)生成實例講解

    這篇文章主要為大家詳細介紹了C++隨機數(shù)生成實例,如何利用C++來生成0——N-1之間的隨機數(shù),感興趣的小伙伴們可以參考一下
    2016-04-04
  • 詳解C++中的內(nèi)聯(lián)函數(shù)和函數(shù)重載

    詳解C++中的內(nèi)聯(lián)函數(shù)和函數(shù)重載

    這篇文章主要介紹了詳解C++中的內(nèi)聯(lián)函數(shù)和函數(shù)重載,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • c++11 atomic的使用詳解

    c++11 atomic的使用詳解

    這篇文章主要介紹了c++11 atomic的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下
    2021-02-02
  • 詳解C++ 運算符重載中返回值的坑

    詳解C++ 運算符重載中返回值的坑

    這篇文章主要介紹了C++ 運算符重載中返回值的坑,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 解讀C++11 原生字符串

    解讀C++11 原生字符串

    這篇文章主要介紹了C++11 原生字符串的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++11,感興趣的朋友可以了解下
    2020-08-08

最新評論