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

一篇文章帶你了解C語言內存對齊

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

內存對齊

先看如下代碼:

在這里插入圖片描述

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

接著,從Debug里觀察看看:

在這里插入圖片描述

最后,去Memory1觀察內存的分布情況:

在這里插入圖片描述

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

在這里插入圖片描述

三、在內存對齊話題下的sizeof與offsetof宏

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

在這里插入圖片描述

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

在這里插入圖片描述

3.1、sizeof

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

在這里插入圖片描述

3.2、offsetof宏

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

在這里插入圖片描述

3.3、Debug

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

在這里插入圖片描述

總結

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

相關文章

  • C語言實現(xiàn)排雷游戲(多文件)

    C語言實現(xiàn)排雷游戲(多文件)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)排雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C++如何實現(xiàn)廣義表詳解

    C++如何實現(xiàn)廣義表詳解

    廣義表是非線性結構,其定義是遞歸的。那么下面跟著小編一起看看如何用C++實現(xiàn)廣義表,有需要的可以參考借鑒。
    2016-08-08
  • C++設計模式之組合模式(Composite)

    C++設計模式之組合模式(Composite)

    這篇文章主要為大家詳細介紹了C++設計模式之組合模式Composite,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 淺談c++中“::”和“:” 冒號的意思

    淺談c++中“::”和“:” 冒號的意思

    這篇文章主要介紹了淺談c++中“::”和“:” 冒號的意思,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • C語言中對字母進行大小寫轉換的簡單方法

    C語言中對字母進行大小寫轉換的簡單方法

    這篇文章主要介紹了C語言中對字母進行大小寫轉換的簡單方法,是C語言入門學習中的基礎知識,需要的朋友可以參考下
    2015-08-08
  • 深入淺析C++中的#,##,和

    深入淺析C++中的#,##,和

    這篇文章主要介紹了C++中的#,##,和"的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-09-09
  • C++設計模式之訪問者模式

    C++設計模式之訪問者模式

    這篇文章主要介紹了C++設計模式之訪問者模式,本文講解了什么是訪問者模式、訪問者模式的UML類圖、訪問者模式的實現(xiàn)代碼等內容,需要的朋友可以參考下
    2014-10-10
  • C語言二叉樹的三種遍歷方式的實現(xiàn)及原理

    C語言二叉樹的三種遍歷方式的實現(xiàn)及原理

    這篇文章主要介紹了C語言二叉樹的三種遍歷方式的實現(xiàn)及原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • C++編程之?std::forward使用例子

    C++編程之?std::forward使用例子

    std::forward?是一個?C++11?中的模板函數(shù),其主要作用是在模板函數(shù)或模板類中,將一個參數(shù)以“原樣”(forward)的方式轉發(fā)給另一個函數(shù),這篇文章主要介紹了C++編程之?std::forward,需要的朋友可以參考下
    2023-03-03
  • STL各個容器性能詳細比較

    STL各個容器性能詳細比較

    從下面表中的數(shù)據(jù)來看寫入用時vector和deque很快,因為他們內存分配次數(shù)少,關聯(lián)容器和list都是一個一個分配的,一個一個分配也會造成內存碎片,內存利用率低
    2013-09-09

最新評論