最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、前言

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

STM32單片機上各個變量占用的字節(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)過公式一的運算后,結(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é)。那么,當前的結(jié)構(gòu)體變量大小9字節(jié) % 4字節(jié) 等于 0 。當結(jié)構(gòu)體變量大小為12字節(jié) % 4字節(jié) = 0,所以最終結(jié)構(gòu)體變量Test1占用的內(nèi)存字節(jié)數(shù)是12,其內(nèi)存的分布如下:

在這里插入圖片描述

以上的都是根據(jù)公式計算出來的結(jié)果,那實際在單片機里是不是這樣呢?把代碼下載到STM32單片機里,進入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)過公式一的運算后,結(jié)構(gòu)體里成員應該占用9個字節(jié)的內(nèi)存,內(nèi)存的分布如下:

在這里插入圖片描述

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

在這里插入圖片描述

把代碼燒錄到STM32,進入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)過公式一的運算后,結(jié)構(gòu)體里成員應該占用16個字節(jié)的內(nèi)存,內(nèi)存的分布如下:

在這里插入圖片描述

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

在這里插入圖片描述

把代碼燒錄到STM32,進入Debug模式看看。

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

總結(jié)

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

相關(guān)文章

  • C語言指針引用數(shù)組案例講解

    C語言指針引用數(shù)組案例講解

    這篇文章主要介紹了C語言指針引用數(shù)組案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • c++中queue用法超詳細講解(入門必看!)

    c++中queue用法超詳細講解(入門必看!)

    queue是一種容器轉(zhuǎn)換器模板,調(diào)用#include< queue>即可使用隊列類,下面這篇文章主要給大家介紹了關(guān)于c++中queue用法超詳細講解的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • Dijkstra算法與Prim算法的異同案例詳解

    Dijkstra算法與Prim算法的異同案例詳解

    這篇文章主要介紹了Dijkstra算法與Prim算法的異同案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 深入淺析C++ traits技術(shù)

    深入淺析C++ traits技術(shù)

    traits就是提取“被傳進的對象”對應的返回類型,讓同一個接口實現(xiàn)對應的功能。因為STL的算法和容器是分離的,兩者通過迭代器鏈接,本文通過實例代碼給大家介紹C++ traits技術(shù),感興趣的朋友一起看看吧
    2021-05-05
  • C++實現(xiàn)騎士走棋盤算法

    C++實現(xiàn)騎士走棋盤算法

    這篇文章主要為大家詳細介紹了C++實現(xiàn)騎士走棋盤算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++變量,常量,數(shù)組和字符串詳解

    C++變量,常量,數(shù)組和字符串詳解

    這篇文章主要介紹了C++變量,常量,數(shù)組和字符串,是C++入門學習中的基礎(chǔ)知識,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-10-10
  • VC讀配置文件實例

    VC讀配置文件實例

    這篇文章主要介紹了VC讀配置文件的方法,實例講述了VC針對文件操作的技巧,需要的朋友可以參考下
    2014-10-10
  • 一文帶你吃透C++繼承

    一文帶你吃透C++繼承

    繼承是C++語言的一個重要特性,繼承使得軟件(代碼)復用變得簡單、易行,可以通過繼承復用已有的程序資源,縮短軟件開發(fā)的周期,本就帶大家吃透C++繼承,需要的朋友可以參考下
    2023-06-06
  • C語言數(shù)據(jù)結(jié)構(gòu)之二分法查找詳解

    C語言數(shù)據(jù)結(jié)構(gòu)之二分法查找詳解

    二分查找算法是在有序數(shù)組中用到的較為頻繁的一種算法,在未接觸二分查找算法時,最通用的一種做法是,對數(shù)組進行遍歷,跟每個元素進行比較,其時間為O(n),但二分查找算法更優(yōu)
    2022-02-02
  • 基于Windows API實現(xiàn)遍歷所有文件并刪除的方法

    基于Windows API實現(xiàn)遍歷所有文件并刪除的方法

    這篇文章主要介紹了基于Windows API實現(xiàn)遍歷所有文件并刪除的方法,是win32應用程序的一個比較典型的文件操作應用技巧,需要的朋友可以參考下
    2015-04-04

最新評論

黄石市| 阜平县| 莱芜市| 石门县| 宾阳县| 莲花县| 辰溪县| 同仁县| 依兰县| 乐陵市| 儋州市| 会理县| 盘锦市| 崇仁县| 龙山县| 腾冲县| 隆尧县| 定襄县| 集贤县| 天长市| 鹤峰县| 乌海市| 吉林市| 东乌珠穆沁旗| 赣榆县| 绍兴市| 潍坊市| 海阳市| 黄冈市| 凭祥市| 庆阳市| 乌拉特前旗| 泸定县| 华容县| 开化县| 阜城县| 阿瓦提县| 牡丹江市| 满洲里市| 旬阳县| 新兴县|