C语言 | 内存对齐02 - 为什么会有内存对齐?它解决了什么问题
生活随笔
收集整理的這篇文章主要介紹了
C语言 | 内存对齐02 - 为什么会有内存对齐?它解决了什么问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、前言
- 二、內存對齊為4個字節的好處
- 三、內存對齊的目的是以空間換取速度
- 3.1、內存對齊為4的例子
- 3.2、內存沒有使用內存對齊的例子
- 四、掌握內存對齊的必要性
一、前言
內存對齊的目的是為了提高CPU讀寫內存里數據的速度。現代的CPU讀取內存并不是一個一個字節挨著讀取,這樣做的效率非常低。現代的CPU一般以4個字節(32bit數據總線)或者8個字節(64bit數據總線)為一組,一組一組地讀寫內存里的數據。
二、內存對齊為4個字節的好處
首先,了解一下CPU從內存里讀取數據的流程:
第一步,CPU通過地址總線,找到該數據的位置。
第二步,通過控制總線,發送讀取數據的指令。
第三步,通過數據總線,從內存里獲取該數據的內容。
內存對齊使用4個字節的原因有:
三、內存對齊的目的是以空間換取速度
3.1、內存對齊為4的例子
/* 先來一個簡單的結構體 */ struct {char a;int b;}Test2;
CPU讀取內存里數據的過程:
這一點很重要,變量a與變量b各自只需要1次尋址就能完成讀取。接下來看一看內存如果沒有使用內存對齊的例子(當我不知道內存對齊時,我也是誤以為內存里的數據是這樣分布的!)
3.2、內存沒有使用內存對齊的例子
如果內存沒有使用內存對齊的話,構想的內存分布如下:
CPU讀取數據的過程:
如果內存沒有使用內存對齊的話,CPU為了獲取變量b花掉了兩次地址尋址,接著還要將字節合并。所以,內存對齊可以有效地提高CPU讀寫內存的速度,但是浪費一點空間。
四、掌握內存對齊的必要性
了解內存對齊的作用后,就能弄懂為什么編譯器要對某些內存做了填充。比如本章節的例子,如果結構體里只有一個char與int變量,無論是char變量在前,還是int變量在前,都肯定會浪費3個字節被用于填充,湊夠4個字節變成一組數據被CPU一次性讀取。
不過,當掌握內存對齊的知識點后,上一章節的例子就能避免更多的內存被浪費了。C語言 | 內存對齊01 - 什么是內存對齊
總結
以上是生活随笔為你收集整理的C语言 | 内存对齐02 - 为什么会有内存对齐?它解决了什么问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: excel三次样条函数_Excel中F1
- 下一篇: python协程asyncio 应用_P