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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一连三问 !!! 什么是内存对齐?内存对齐的原因是什么?内存对齐的好处是什么?

發(fā)布時間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一连三问 !!! 什么是内存对齐?内存对齐的原因是什么?内存对齐的好处是什么? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一.前言

問題:比較兩個結(jié)構(gòu)體變量是否一樣能用memcmp嗎?以及如何實現(xiàn)memcmp

首先我們知道m(xù)emcmp函數(shù)是逐字節(jié)進行比較的,而struct存在內(nèi)存對齊,對齊時補的字節(jié)是隨機值,會產(chǎn)生垃圾值,所以無法比較.

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; }

?二.內(nèi)存對齊

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; }

?

對齊規(guī)則:

  • 第一個成員在與結(jié)構(gòu)體變量偏移量為0的地址處
  • 其它成員變量要對齊到某個數(shù)字(對齊數(shù))的整數(shù)倍的地址處
  • 對齊數(shù) = 編譯器默認的一個對齊數(shù) 與 該成員大小的較小值
  • 修改默認對齊數(shù):#pargma pack(n)
  • 取消設(shè)置的默認對齊數(shù),還原默認: #pragma pack()
  • 結(jié)構(gòu)體總大小為最大對齊數(shù)(每個變量都有一個最大對齊數(shù))的整數(shù)倍
  • 如果嵌套了結(jié)構(gòu)體的情況下,嵌套的結(jié)構(gòu)體對齊到自己最大對齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整體大小就是所有最大對齊數(shù)(含嵌套結(jié)構(gòu)體的對齊數(shù))的整數(shù)倍
  • 對齊原因:

  • 平臺原因(移植原因): 不是所有的硬件平臺都能訪問任意地址上的任意數(shù)據(jù).某些硬件平臺只能在某些地址取某些特定類型的數(shù)據(jù),否則就會拋出硬件異常
  • 性能原因:數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能的在自然邊界上對齊.原因在于:為了訪問未對齊的內(nèi)存,處理器需要做兩次內(nèi)存訪問,而對齊的內(nèi)存訪問只需要一次.
  • 更底層的原因:

    一個內(nèi)存是由若干個黑色的內(nèi)存顆粒構(gòu)成的,每一個內(nèi)存顆粒叫做一個chip,每個chip內(nèi)部是由8個bank組成的.

    內(nèi)存編址方式

    我們在應(yīng)用程序內(nèi)存中地址連續(xù)的8個字節(jié)(例如:0x0000 ~ 0x0007),其實并不是在第一個bank.程序員視角看起來連續(xù)的地址(0x0000 ~ 0x0007),實際上是位于8個bank中,每一個bank只保存了一個字節(jié),在物理上它們并不連續(xù).

    原因: 電路工作效率,內(nèi)存中的8個bank是可以并行工作的.如果想要讀取(0x0000 ~ 0x0007),每個bank工作一次,拼起來就是想要的數(shù)據(jù),IO效率比較高.但要存在一個bank里,那這個bank只能自己干活,只能進行串行讀取,需要讀8次,這樣速度會慢很多.

    高速緩存的機制: 高速緩存里的cache line是64字節(jié),是內(nèi)存IO的8倍,不會讓內(nèi)存IO浪費.

    cache line:本級緩存向下層取數(shù)據(jù)時的基本單位

    內(nèi)存的IO是以8個字節(jié)64比特為單位進行的.對于64位的數(shù)據(jù)寬度的內(nèi)存,假如CPU也是64位的CPU(現(xiàn)在的計算機基本都是這樣的),每次內(nèi)存IO獲取數(shù)據(jù)都是從同行同列的8個bank中各自取一個字節(jié)拼起來的.從內(nèi)存的0地址開始,0~7字節(jié)的數(shù)據(jù)可以一次IO讀取出來,8~15字節(jié)的數(shù)據(jù)也可以一次讀取出來.

    如果內(nèi)存不對齊,同樣取8個字節(jié)的數(shù)據(jù),但是不是0開頭的.那么內(nèi)存只好先工作一次把0x0000~0x0007取出來,然后再把0x0008~0x0015取出來,把兩次的結(jié)果返回.CPU和內(nèi)存IO的硬件限制導致沒辦法一次跨在兩個數(shù)據(jù)寬度中間進行IO,這樣應(yīng)用程序就會變慢.

    總結(jié)

    以上是生活随笔為你收集整理的一连三问 !!! 什么是内存对齐?内存对齐的原因是什么?内存对齐的好处是什么?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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