一连三问 !!! 什么是内存对齐?内存对齐的原因是什么?内存对齐的好处是什么?
一.前言
問題:比較兩個結構體變量是否一樣能用memcmp嗎?以及如何實現memcmp
首先我們知道memcmp函數是逐字節進行比較的,而struct存在內存對齊,對齊時補的字節是隨機值,會產生垃圾值,所以無法比較.
int memcmp(const void* ptr1,const void* ptr2,size_t num ){assert(ptr1);assert(ptr2);char* dest = (char*)ptr2;char* src = (char*)ptr1;while(num-- &&(*dest == *src)){dest++;src++;}if(count == 0){return 0;}return *dest - *src; }?二.內存對齊
struct s1 {char c1;int i;char c2; };struct s2 {char c1;char c2;int i; };struct s3 {double d;char c;int i; };struct s4 {char c1;struct s3 s;double d; };int main() {cout << "s1:" <<sizeof(s1) << endl;cout << "s2:" <<sizeof(s2) << endl;cout << "s3:" <<sizeof(s3) << endl;cout << "s4:" <<sizeof(s4) << endl;return 0; }?
對齊規則:
對齊原因:
更底層的原因:
一個內存是由若干個黑色的內存顆粒構成的,每一個內存顆粒叫做一個chip,每個chip內部是由8個bank組成的.
內存編址方式
我們在應用程序內存中地址連續的8個字節(例如:0x0000 ~ 0x0007),其實并不是在第一個bank.程序員視角看起來連續的地址(0x0000 ~ 0x0007),實際上是位于8個bank中,每一個bank只保存了一個字節,在物理上它們并不連續.
原因: 電路工作效率,內存中的8個bank是可以并行工作的.如果想要讀取(0x0000 ~ 0x0007),每個bank工作一次,拼起來就是想要的數據,IO效率比較高.但要存在一個bank里,那這個bank只能自己干活,只能進行串行讀取,需要讀8次,這樣速度會慢很多.
高速緩存的機制: 高速緩存里的cache line是64字節,是內存IO的8倍,不會讓內存IO浪費.
cache line:本級緩存向下層取數據時的基本單位
內存的IO是以8個字節64比特為單位進行的.對于64位的數據寬度的內存,假如CPU也是64位的CPU(現在的計算機基本都是這樣的),每次內存IO獲取數據都是從同行同列的8個bank中各自取一個字節拼起來的.從內存的0地址開始,0~7字節的數據可以一次IO讀取出來,8~15字節的數據也可以一次讀取出來.
如果內存不對齊,同樣取8個字節的數據,但是不是0開頭的.那么內存只好先工作一次把0x0000~0x0007取出來,然后再把0x0008~0x0015取出來,把兩次的結果返回.CPU和內存IO的硬件限制導致沒辦法一次跨在兩個數據寬度中間進行IO,這樣應用程序就會變慢.
總結
以上是生活随笔為你收集整理的一连三问 !!! 什么是内存对齐?内存对齐的原因是什么?内存对齐的好处是什么?的全部內容,希望文章能夠幫你解決所遇到的問題。