91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++內存對齊怎么理解

發布時間:2021-11-30 17:56:30 來源:億速云 閱讀:180 作者:iii 欄目:編程語言

這篇文章主要講解了“C++內存對齊怎么理解”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++內存對齊怎么理解”吧!

一、為什么要內存對齊?

訪問未對齊的內存,處理器要訪問兩次(數據先讀高位,再度地位),訪問對齊的內存,處理器只要訪問一次,為了提高處理器讀取數據的效率,我們使用內存對齊。Windows 默認對齊數為8字節,Linux 默認對齊數為4字節。

使用內存對齊的原因還有平臺的原因:不是所有的硬件平臺都能訪問特定的地址上的任意數據,某些平臺只能訪問特定的地址上的獲取數據,否則會拋出異常。

二、內存對齊原則:

在內存中,編譯器按照成員列表分別為 每個結構體變量分配內存,當存儲過程中需要對齊的需求時,編譯器會在成員之間留下額外的內存空間。如果想要確認結構體占多少存儲空間,則使用關鍵字sizeof查看大小,如果想得知結構體的某個特定成員在結構體的位置,則使用offsetof(頭文件stddef.h)

結構體或聯合體的數據成員、第一個成員放到0片便宜的地方,以后每個數據成員放到自身對齊的整數倍偏移處。(對齊數是變量自身大小和默認對齊數的較小值)結構體的大小必須是最大對齊數的整數倍。

三、對于結構體字節對齊,有哪些規則?

總體上我們假設結構體起始位置為0x0000,N為設置的n字節對齊,則滿足公式0x0000%N==0,來決定結構體成員存儲的位置。

1.如果是采用默認對齊規則,需要執行以下的步驟:

(1)結構體的成員的自身對值N(數據類型占有的空間,比如在32位機器下int型為4字節,自身對值為4)需要與存儲位置做出判斷。若滿足“起始位置%N=0”(除了結構體的第一個成員,N也要必須滿足>=成員自身對齊值),則把該成員存放在該起始位置。若前一個成員與目前成員的存儲位置有一定的距離,則把該距離作為填充空間。

(2)所有結構體的成員都分配完存儲位置之后,則還要結構體本身也要進行對齊。結構體本身也要滿足“(M+X)%S=0”來進行對齊,其中M+X是整個結構體占有的存儲空間大小,M是所有結構體的成員的存儲空間大小總和,X是為了滿足S的整數倍的填補空間大小,S是就是結構體成員中自身對齊值最大的那個。

四、如果是采用#pragma pack(N)規則,需要執行以下的步驟:

(1)結構體成員的自身對齊值是偏移的量。若滿足“起始位置%N=0”(這里N是指定對齊值,即#pragma pack(N)),則可以把該成員存儲到該起始位置中,偏移量為該成員的自身對齊值(比如int型自身對齊值為4,占用4個字節的內存位置)。

(2)結構體自身對齊值為該結構體的所有成員自身對齊值中最大的值,但又因為結構體的有效對齊值(即指定對齊值)為N,所以“(M+X)%N=0”,M+X是該結構體存儲的空間大小。

五、為什么我的編譯器在結構中留下了空洞?這導致空間浪費而且無法與外部數據文件進行“二進制”讀寫。能否關掉填充,或者控制結構域的對齊方式?

當內存中的值合理對齊時,很多機器都能非常高效地訪問。例如,在按字節尋址的機器中,2字節的short int型變量必須放在偶地址上,而4字節的long int型變量則必須存放在4的整數倍地址上。某些機器甚至根本就不能訪問沒有對齊的地址,因此必須要求所有的數據都正確地對齊。

六、什么叫做位域?

位域是指信息在存儲時,并不需要占用一個完整的字節, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,并使處理簡便,C語言又提供了一種數據結構,稱為“位域”或“位段”。所謂“位域”是把一個字節中的二進位劃分為幾 個不同的區域, 并說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節的二進制位域來表示。

感謝各位的閱讀,以上就是“C++內存對齊怎么理解”的內容了,經過本文的學習后,相信大家對C++內存對齊怎么理解這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

西华县| 瑞金市| 连平县| 黑水县| 虞城县| 饶河县| 和林格尔县| 临江市| 丰原市| 天峨县| 宣化县| 广丰县| 扶余县| 澄江县| 台湾省| 漳平市| 民权县| 西充县| 错那县| 蛟河市| 鱼台县| 荔浦县| 黔江区| 宣汉县| 北碚区| 札达县| 南宁市| 徐州市| 长春市| 清水县| 双桥区| 福清市| 鄂托克旗| 榆社县| 万全县| 秦安县| 衡东县| 武城县| 焉耆| 雷山县| 滨州市|