日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言 | 内存对齐02 - 为什么会有内存对齐?它解决了什么问题

發(fā)布時(shí)間:2025/3/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言 | 内存对齐02 - 为什么会有内存对齐?它解决了什么问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一、前言
  • 二、內(nèi)存對齊為4個(gè)字節(jié)的好處
  • 三、內(nèi)存對齊的目的是以空間換取速度
    • 3.1、內(nèi)存對齊為4的例子
    • 3.2、內(nèi)存沒有使用內(nèi)存對齊的例子
  • 四、掌握內(nèi)存對齊的必要性

一、前言


內(nèi)存對齊的目的是為了提高CPU讀寫內(nèi)存里數(shù)據(jù)的速度?,F(xiàn)代的CPU讀取內(nèi)存并不是一個(gè)一個(gè)字節(jié)挨著讀取,這樣做的效率非常低?,F(xiàn)代的CPU一般以4個(gè)字節(jié)(32bit數(shù)據(jù)總線)或者8個(gè)字節(jié)(64bit數(shù)據(jù)總線)為一組,一組一組地讀寫內(nèi)存里的數(shù)據(jù)。

二、內(nèi)存對齊為4個(gè)字節(jié)的好處


首先,了解一下CPU從內(nèi)存里讀取數(shù)據(jù)的流程:
第一步,CPU通過地址總線,找到該數(shù)據(jù)的位置。
第二步,通過控制總線,發(fā)送讀取數(shù)據(jù)的指令。
第三步,通過數(shù)據(jù)總線,從內(nèi)存里獲取該數(shù)據(jù)的內(nèi)容。

內(nèi)存對齊使用4個(gè)字節(jié)的原因有:

  • STM32單片機(jī)的數(shù)據(jù)總線與地址總線都是32bit(4個(gè)字節(jié))。
  • 方便DMA的搬運(yùn),DMA搬運(yùn)的最大內(nèi)存是32bit(4個(gè)字節(jié))。
  • 三、內(nèi)存對齊的目的是以空間換取速度


    3.1、內(nèi)存對齊為4的例子

    /* 先來一個(gè)簡單的結(jié)構(gòu)體 */ struct {char a;int b;}Test2;


    CPU讀取內(nèi)存里數(shù)據(jù)的過程:

  • 想找變量a:第一次讀取就能找到。
  • 想找變量b:第二次讀取就能找到。
    這一點(diǎn)很重要,變量a與變量b各自只需要1次尋址就能完成讀取。接下來看一看內(nèi)存如果沒有使用內(nèi)存對齊的例子(當(dāng)我不知道內(nèi)存對齊時(shí),我也是誤以為內(nèi)存里的數(shù)據(jù)是這樣分布的!)
  • 3.2、內(nèi)存沒有使用內(nèi)存對齊的例子

    如果內(nèi)存沒有使用內(nèi)存對齊的話,構(gòu)想的內(nèi)存分布如下:

    CPU讀取數(shù)據(jù)的過程:

  • 想找變量a:第一次讀取就能找到。
  • 想找變量b:先讀取第一組內(nèi)存的后三個(gè)字節(jié),接著再讀取第二組內(nèi)存的第一個(gè)字節(jié),最后將所有字節(jié)合并為4個(gè)字節(jié)。
  • 如果內(nèi)存沒有使用內(nèi)存對齊的話,CPU為了獲取變量b花掉了兩次地址尋址,接著還要將字節(jié)合并。所以,內(nèi)存對齊可以有效地提高CPU讀寫內(nèi)存的速度,但是浪費(fèi)一點(diǎn)空間。

    四、掌握內(nèi)存對齊的必要性


    了解內(nèi)存對齊的作用后,就能弄懂為什么編譯器要對某些內(nèi)存做了填充。比如本章節(jié)的例子,如果結(jié)構(gòu)體里只有一個(gè)char與int變量,無論是char變量在前,還是int變量在前,都肯定會(huì)浪費(fèi)3個(gè)字節(jié)被用于填充,湊夠4個(gè)字節(jié)變成一組數(shù)據(jù)被CPU一次性讀取。
    不過,當(dāng)掌握內(nèi)存對齊的知識(shí)點(diǎn)后,上一章節(jié)的例子就能避免更多的內(nèi)存被浪費(fèi)了。C語言 | 內(nèi)存對齊01 - 什么是內(nèi)存對齊

    總結(jié)

    以上是生活随笔為你收集整理的C语言 | 内存对齐02 - 为什么会有内存对齐?它解决了什么问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。