C语言 | 内存对齐01 - 什么是内存对齐
一、前言
在單片機下使用C語言編程時,內存對齊的知識點必須掌握。掌握內存對齊后,可以防止內存碎片化,并且證明你有能力優化內存。嵌入式單片機開發的后階段,無非就是優化內存與優化代碼執行效率。
二、內存對齊
先看如下代碼:
結構體Test1占用了多少字節?如果事先不知道內存對齊的話,答案肯定是:1個字節(char)+ 4個字節(int)+ 1個字節(char) = 6個字節。
事實上,Test1結構體占用了12個字節,從DEBUG模式下Watch1觀察:
OK,不就猜少了6個字節嗎?有什么影響嗎?先不說影響吧,咱們先來看看單片機內存里的實際情況。從上圖看到,結構體變量的首地址是0x200018F4,通過Keil的Memory1可以看到結構體Text1在內存的分布,如下圖所示。
將Test1的內存分布提取出來,如下圖所示,因為內存對齊的原因,有6個字節被填充了。換句話說,這6個字節被浪費了,無法被其他資源使用了(因為編譯器將這些內存規劃給結構體Test1了)。此時,如果使用結構體Text1在堆內存大量地定義變量的話,將會造成非常嚴重的內存浪費(內存碎片化),浪費的內存 = 6 * N(N表示結構體變量的個數)。比如用結構體Text1定義1000個結構體變量,浪費的內存 = 6 * 1000 = 6000 Byte(非常接近6K內存)。
好了,假如我是懂得內存對齊的原理的,那么我可以這樣去優化結構體Text1。
接著,從Debug里觀察看看:
最后,去Memory1觀察內存的分布情況:
再將結構體Text1的內存分布提取出來分析一下,將成員b與成員c互換位置后,被填充的字節數變成2,成功地優化了4個字節的碎片。如果用Text1的結構體去定義1000個結構體變量的話,那么1000 * 6的碎片內存被優化成1000 * 2的碎片內存,成功改善了1000 * 4(接近4K的內存)啊。
三、在內存對齊話題下的sizeof與offsetof宏
首先,在main.c包含頭文件stddef.h。
回到最初的例子,代碼如下:
3.1、sizeof
通過sizeof操作符能夠得出一個結構的整體長度,包括因邊界對齊而跳過的那些字節。
3.2、offsetof宏
考慮到內存對齊的因素,想確定結構體里某個成員的實際位置,可以使用offsetof宏得到。比如我想得到成員b在結構體Test1的實際位置(包括內存對齊因素)。
3.3、Debug
進入Debug模式觀察sizeof與offsetof的返回值分別是12與4。
總結
以上是生活随笔為你收集整理的C语言 | 内存对齐01 - 什么是内存对齐的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python numpy和pandas数
- 下一篇: gorm 密码字段隐藏_【财富密码】第1