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

一篇文章帶你了解C語言內(nèi)存對齊公式

 更新時間:2021年08月15日 10:57:59   作者:Wallace Zhang  
這篇文章主要介紹了C語言內(nèi)存對齊,包括內(nèi)存對其的基本概念及用法,以及注意事項,并以實例形式加以說明,需要的朋友可以參考下,希望能給你帶來幫助

一、前言

每一個特定平臺上的編譯器都有自己的默認(rèn)“對齊系數(shù)”(也叫對齊模數(shù))。GCC中默認(rèn)#program pack(4),即4個字節(jié)的內(nèi)存對齊。Keil也是采用4字節(jié)對齊的。也可以通過預(yù)編譯命令#pragma pack(n),n = 1,2,4,8,16來改變這一系數(shù),一般情況下盡量使用自然對齊系數(shù),不要修改它。

STM32單片機(jī)上各個變量占用的字節(jié)數(shù):

在這里插入圖片描述

在這里插入圖片描述

二、公式

公式一、結(jié)構(gòu)體變量里,成員的起始地址必須滿足 : 起始地址 % 成員的字節(jié)數(shù)(sizeof值)= 0 (說白了就是能整除)

公式二、結(jié)構(gòu)體變量的總字節(jié)數(shù)必須滿足:總字節(jié)數(shù) % 最大的成員字節(jié)數(shù) = 0 (說白了就是能整除)

2.1、例子一

struct te_a{
	
  /* 公式一 */
	char a;   /* a的起始地址0x00,然后用公式一計算:0x00 % 1(char為1個字節(jié)) = 0,所以成員a占用了內(nèi)存0x00   */
	int  b;   /* b的起始地址0x01 % 4(int為4個字節(jié))不等于0,那么再計算0x02%4還是不等于0,直到0x04 % 4 = 0 ,所以成員b占用了內(nèi)存0x04 ~ 0x07 */
	char c;   /* 成員b的結(jié)尾地址是0x07,所以成員c從0x08開始計算,那么計算0x08 % 1 = 0 , 所以成員c占用了內(nèi)存0x08 */

}Test1;

OK,經(jīng)過公式一的運(yùn)算后,結(jié)構(gòu)體里成員的分布如下:

在這里插入圖片描述

經(jīng)過公式一的計算后,結(jié)構(gòu)體變量Test1的大小是9個字節(jié)。內(nèi)存對齊的計算還沒有結(jié)束,接著使用公式二計算:

結(jié)構(gòu)體變量的總字節(jié)數(shù) % 最大的成員字節(jié)數(shù) = 0 , 在結(jié)構(gòu)體變量Test1里,最大的成員是b,b的大小是4個字節(jié)。那么,當(dāng)前的結(jié)構(gòu)體變量大小9字節(jié) % 4字節(jié) 等于 0 。當(dāng)結(jié)構(gòu)體變量大小為12字節(jié) % 4字節(jié) = 0,所以最終結(jié)構(gòu)體變量Test1占用的內(nèi)存字節(jié)數(shù)是12,其內(nèi)存的分布如下:

在這里插入圖片描述

以上的都是根據(jù)公式計算出來的結(jié)果,那實際在單片機(jī)里是不是這樣呢?把代碼下載到STM32單片機(jī)里,進(jìn)入DEBUG模式看看。

在這里插入圖片描述

在這里插入圖片描述

從以下的內(nèi)存分布看來,公式一與公式二的計算沒有問題。

在這里插入圖片描述

2.2、例子二

struct te_a{
	
  /* 公式一 */
	int   a;  /* a的起始地址是0x00,然后根據(jù)公式一計算0x00 % 4 = 0 ,那么成員a占用的內(nèi)存是0x00 ~ 0x03 */
	float b;  /* b的起始地址是0x04, 然后根據(jù)公式一計算0x04 % 4 = 0 ,那么成員b占用的內(nèi)存是0x04 ~ 0x07 */
	char  c;  /* c的起始地址是0x08, 然后根據(jù)公式一計算0x08 % 1 = 0 ,那么成員c占用的內(nèi)存是0x08 */

}Test1;

OK,經(jīng)過公式一的運(yùn)算后,結(jié)構(gòu)體里成員應(yīng)該占用9個字節(jié)的內(nèi)存,內(nèi)存的分布如下:

在這里插入圖片描述

接著根據(jù)公式二的運(yùn)算,結(jié)構(gòu)體的總字節(jié)數(shù) % 最大的成員字節(jié)數(shù) = 0, 可以輕松得出結(jié)構(gòu)體的總字節(jié)數(shù) = 12時,滿足12 % 4 = 0。所以經(jīng)過公式二的計算后,內(nèi)存分布如下:

在這里插入圖片描述

把代碼燒錄到STM32,進(jìn)入Debug模式看看。

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

2.3、例子三

struct te_a{
	
  /* 公式一 */
	int     a;  /* a的起始地址是0x00,然后根據(jù)公式一計算0x00 % 4 = 0 ,那么成員a占用的內(nèi)存是0x00 ~ 0x03 */
	float   b;  /* b的起始地址是0x04, 然后根據(jù)公式一計算0x04 % 4 = 0 ,那么成員b占用的內(nèi)存是0x04 ~ 0x07 */
	double  c;  /* c的起始地址是0x08, 然后根據(jù)公式一計算0x08 % 8 = 0 ,那么成員c占用的內(nèi)存是0x08 ~ 0x0F */

}Test1;

OK,經(jīng)過公式一的運(yùn)算后,結(jié)構(gòu)體里成員應(yīng)該占用16個字節(jié)的內(nèi)存,內(nèi)存的分布如下:

在這里插入圖片描述

接著根據(jù)公式二的運(yùn)算,結(jié)構(gòu)體的總字節(jié)數(shù) % 最大的成員字節(jié)數(shù) = 0, 那么16 % 8 = 0,運(yùn)氣非常好,公式二不用補(bǔ)位就能讓公式二成立。所以經(jīng)過公式二的運(yùn)算后,內(nèi)存還是一樣的:

在這里插入圖片描述

把代碼燒錄到STM32,進(jìn)入Debug模式看看。

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C語言中的編碼小技巧

    C語言中的編碼小技巧

    這篇文章主要介紹了C語言中的編碼小技巧,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C實現(xiàn)分子沉積模擬的示例代碼

    C實現(xiàn)分子沉積模擬的示例代碼

    這篇文章主要介紹了計算機(jī)在材料科學(xué)中的一個練習(xí)題,功能是模擬氣化后分子沉積
    2013-11-11
  • C++詳解如何實現(xiàn)單鏈表

    C++詳解如何實現(xiàn)單鏈表

    線性表的鏈?zhǔn)酱鎯τ址Q為單鏈表,它是指通過一組任意的存儲單元來存儲線性表中的數(shù)據(jù)元素。本文將用C++實現(xiàn)單鏈表,需要的可以參考一下
    2022-06-06
  • C++?Boost?StringAlgorithms超詳細(xì)講解

    C++?Boost?StringAlgorithms超詳細(xì)講解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-11-11
  • 解析C語言與C++的編譯模型

    解析C語言與C++的編譯模型

    C++繼承了C的編譯模型,C語言的編譯鏈接模型相對簡潔,但C++繼承了這些機(jī)制之后變得更加復(fù)雜難以理解,這里就來帶大家簡要解析C語言與C++的編譯模型
    2016-05-05
  • Qt中鼠標(biāo)點(diǎn)擊的幾種狀態(tài)

    Qt中鼠標(biāo)點(diǎn)擊的幾種狀態(tài)

    在Qt中,鼠標(biāo)點(diǎn)擊按鈕通常會觸發(fā)一系列的事件,包括pressed、released、clicked等,本文主要介紹了Qt中鼠標(biāo)點(diǎn)擊的幾種狀態(tài),具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • C++編寫DLL動態(tài)鏈接庫的步驟與實現(xiàn)方法

    C++編寫DLL動態(tài)鏈接庫的步驟與實現(xiàn)方法

    這篇文章主要介紹了C++編寫DLL動態(tài)鏈接庫的步驟與實現(xiàn)方法,結(jié)合實例形式分析了C++導(dǎo)出類文件及生成與調(diào)用DLL動態(tài)連接庫的相關(guān)操作技巧,需要的朋友可以參考下
    2016-08-08
  • C語言實現(xiàn)貪吃蛇小游戲

    C語言實現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C語言實現(xiàn)井字棋(三子棋)

    C語言實現(xiàn)井字棋(三子棋)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)井字棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C++超詳細(xì)講解友元的使用

    C++超詳細(xì)講解友元的使用

    采用類的機(jī)制后實現(xiàn)了數(shù)據(jù)的隱藏與封裝,類的數(shù)據(jù)成員一般定義為私有成員,成員函數(shù)一般定義為公有的,依此提供類與外界間的通信接口。但是,有時需要定義一些函數(shù),這些函數(shù)不是類的一部分,但又需要頻繁地訪問類的數(shù)據(jù)成員,這時可以將這些函數(shù)定義為該類的友元函數(shù)
    2022-04-04

最新評論