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

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

 更新時(shí)間:2021年08月15日 10:03:48   作者:Wallace Zhang  
在單片機(jī)下使用C語言編程時(shí),內(nèi)存對齊的知識(shí)點(diǎn)必須掌握。掌握內(nèi)存對齊后,可以防止內(nèi)存碎片化,并且證明你有能力優(yōu)化內(nèi)存。嵌入式單片機(jī)開發(fā)的后階段,無非就是優(yōu)化內(nèi)存與優(yōu)化代碼執(zhí)行效率。

內(nèi)存對齊

先看如下代碼:

在這里插入圖片描述

結(jié)構(gòu)體Test1占用了多少字節(jié)?如果事先不知道內(nèi)存對齊的話,答案肯定是:1個(gè)字節(jié)(char)+ 4個(gè)字節(jié)(int)+ 1個(gè)字節(jié)(char) = 6個(gè)字節(jié)。

事實(shí)上,Test1結(jié)構(gòu)體占用了12個(gè)字節(jié),從DEBUG模式下Watch1觀察:

在這里插入圖片描述

OK,不就猜少了6個(gè)字節(jié)嗎?有什么影響嗎?先不說影響吧,咱們先來看看單片機(jī)內(nèi)存里的實(shí)際情況。從上圖看到,結(jié)構(gòu)體變量的首地址是0x200018F4,通過Keil的Memory1可以看到結(jié)構(gòu)體Text1在內(nèi)存的分布,如下圖所示。

在這里插入圖片描述

將Test1的內(nèi)存分布提取出來,如下圖所示,因?yàn)閮?nèi)存對齊的原因,有6個(gè)字節(jié)被填充了。換句話說,這6個(gè)字節(jié)被浪費(fèi)了,無法被其他資源使用了(因?yàn)榫幾g器將這些內(nèi)存規(guī)劃給結(jié)構(gòu)體Test1了)。此時(shí),如果使用結(jié)構(gòu)體Text1在堆內(nèi)存大量地定義變量的話,將會(huì)造成非常嚴(yán)重的內(nèi)存浪費(fèi)(內(nèi)存碎片化),浪費(fèi)的內(nèi)存 = 6 * N(N表示結(jié)構(gòu)體變量的個(gè)數(shù))。比如用結(jié)構(gòu)體Text1定義1000個(gè)結(jié)構(gòu)體變量,浪費(fèi)的內(nèi)存 = 6 * 1000 = 6000 Byte(非常接近6K內(nèi)存)。

在這里插入圖片描述

好了,假如我是懂得內(nèi)存對齊的原理的,那么我可以這樣去優(yōu)化結(jié)構(gòu)體Text1。

在這里插入圖片描述

接著,從Debug里觀察看看:

在這里插入圖片描述

最后,去Memory1觀察內(nèi)存的分布情況:

在這里插入圖片描述

再將結(jié)構(gòu)體Text1的內(nèi)存分布提取出來分析一下,將成員b與成員c互換位置后,被填充的字節(jié)數(shù)變成2,成功地優(yōu)化了4個(gè)字節(jié)的碎片。如果用Text1的結(jié)構(gòu)體去定義1000個(gè)結(jié)構(gòu)體變量的話,那么1000 * 6的碎片內(nèi)存被優(yōu)化成1000 * 2的碎片內(nèi)存,成功改善了1000 * 4(接近4K的內(nèi)存)啊。

在這里插入圖片描述

三、在內(nèi)存對齊話題下的sizeof與offsetof宏

首先,在main.c包含頭文件stddef.h。

在這里插入圖片描述

回到最初的例子,代碼如下:

在這里插入圖片描述

3.1、sizeof

通過sizeof操作符能夠得出一個(gè)結(jié)構(gòu)的整體長度,包括因邊界對齊而跳過的那些字節(jié)。

在這里插入圖片描述

3.2、offsetof宏

考慮到內(nèi)存對齊的因素,想確定結(jié)構(gòu)體里某個(gè)成員的實(shí)際位置,可以使用offsetof宏得到。比如我想得到成員b在結(jié)構(gòu)體Test1的實(shí)際位置(包括內(nèi)存對齊因素)。

在這里插入圖片描述

3.3、Debug

進(jìn)入Debug模式觀察sizeof與offsetof的返回值分別是12與4。

在這里插入圖片描述

總結(jié)

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

相關(guān)文章

  • C語言經(jīng)典算法例題求100-999之間的“水仙花數(shù)”

    C語言經(jīng)典算法例題求100-999之間的“水仙花數(shù)”

    本文的主要內(nèi)容,設(shè)計(jì)一個(gè)程序,找出100-999之間的“水仙花數(shù)”,需要的朋友可以參考下
    2015-07-07
  • C語言實(shí)現(xiàn)高精度的加法

    C語言實(shí)現(xiàn)高精度的加法

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)高精度的加法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C語言數(shù)組全面詳細(xì)講解

    C語言數(shù)組全面詳細(xì)講解

    數(shù)組是一組有序的數(shù)據(jù)的集合,數(shù)組中元素類型相同,由數(shù)組名和下標(biāo)唯一地確定,數(shù)組中數(shù)據(jù)不僅數(shù)據(jù)類型相同,而且在計(jì)算機(jī)內(nèi)存里連續(xù)存放,地址編號最低的存儲(chǔ)單元存放數(shù)組的起始元素,地址編號最高的存儲(chǔ)單元存放數(shù)組的最后一個(gè)元素
    2022-05-05
  • C語言 CRITICAL_SECTION用法案例詳解

    C語言 CRITICAL_SECTION用法案例詳解

    這篇文章主要介紹了C語言 CRITICAL_SECTION用法案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語言 位運(yùn)算詳解及示例代碼

    C語言 位運(yùn)算詳解及示例代碼

    本文主要介紹C語言 位運(yùn)算的基礎(chǔ)知識(shí),這里整理了相關(guān)資料及示例代碼,有興趣的小伙伴可以參考下
    2016-08-08
  • Qt編寫地圖實(shí)現(xiàn)省市區(qū)域圖的示例代碼

    Qt編寫地圖實(shí)現(xiàn)省市區(qū)域圖的示例代碼

    本文主要介紹了Qt編寫地圖實(shí)現(xiàn)省市區(qū)域圖的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C++17使用折疊表達(dá)式實(shí)現(xiàn)一個(gè)IsAllTrue函數(shù)的過程

    C++17使用折疊表達(dá)式實(shí)現(xiàn)一個(gè)IsAllTrue函數(shù)的過程

    本文介紹了利用C++17特性實(shí)現(xiàn)IsAllTrue函數(shù)的方法,詳細(xì)講解了從基于初始化列表的初級版本到使用折疊表達(dá)式和類型萃取的高級優(yōu)化版本,需要的朋友參考下吧
    2024-09-09
  • C語言直接插入排序算法介紹

    C語言直接插入排序算法介紹

    大家好,本篇文章主要講的是C語言直接插入排序算法介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C語言菜鳥基礎(chǔ)教程之a(chǎn)++與++a

    C語言菜鳥基礎(chǔ)教程之a(chǎn)++與++a

    很多同學(xué)在學(xué)習(xí)c語言的時(shí)候是不是會(huì)碰到a++和++a都有甚么作用啊。今天我們就來探討下
    2017-10-10
  • C語言使用sizeof和strlen計(jì)算數(shù)組和指針大小

    C語言使用sizeof和strlen計(jì)算數(shù)組和指針大小

    sizeof()一般是用來求取?變量?或者?類型?所占內(nèi)存空間的大小,strlen()是一個(gè)庫函數(shù)是專門用來計(jì)算?字符串?長度的,下面我們就來看看C語言如何使用sizeof和strlen計(jì)算數(shù)組和指針大小吧
    2023-11-11

最新評論

探索| 卓尼县| 康平县| 封开县| 仙游县| 赣榆县| 万盛区| 苏尼特左旗| 贵港市| 尚志市| 府谷县| 正镶白旗| 青冈县| 桑日县| 泸水县| 中超| 镇安县| 基隆市| 馆陶县| 噶尔县| 达孜县| 瑞安市| 寻乌县| 萍乡市| 丹东市| 焦作市| 莆田市| 安陆市| 白山市| 广昌县| 崇礼县| 忻州市| 加查县| 盈江县| 永清县| 绿春县| 绩溪县| 汝州市| 大足县| 临城县| 积石山|