亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

一、前言

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

STM32單片機(jī)上各個(gè)變量占用的字節(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,然后用公式一計(jì)算:0x00 % 1(char為1個(gè)字節(jié)) = 0,所以成員a占用了內(nèi)存0x00   */
	int  b;   /* b的起始地址0x01 % 4(int為4個(gè)字節(jié))不等于0,那么再計(jì)算0x02%4還是不等于0,直到0x04 % 4 = 0 ,所以成員b占用了內(nèi)存0x04 ~ 0x07 */
	char c;   /* 成員b的結(jié)尾地址是0x07,所以成員c從0x08開始計(jì)算,那么計(jì)算0x08 % 1 = 0 , 所以成員c占用了內(nèi)存0x08 */

}Test1;

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

在這里插入圖片描述

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

結(jié)構(gòu)體變量的總字節(jié)數(shù) % 最大的成員字節(jié)數(shù) = 0 , 在結(jié)構(gòu)體變量Test1里,最大的成員是b,b的大小是4個(gè)字節(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ù)公式計(jì)算出來的結(jié)果,那實(shí)際在單片機(jī)里是不是這樣呢?把代碼下載到STM32單片機(jī)里,進(jìn)入DEBUG模式看看。

在這里插入圖片描述

在這里插入圖片描述

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

在這里插入圖片描述

2.2、例子二

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

}Test1;

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

2.3、例子三

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

}Test1;

OK,經(jīng)過公式一的運(yùn)算后,結(jié)構(gòu)體里成員應(yīng)該占用16個(gè)字節(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語言中的編碼小技巧,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C實(shí)現(xiàn)分子沉積模擬的示例代碼

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

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

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

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

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

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

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

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

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

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

    C++編寫DLL動(dòng)態(tài)鏈接庫(kù)的步驟與實(shí)現(xiàn)方法

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

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

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

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

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

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

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

最新評(píng)論