日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C++內(nèi)存對齊詳細使用指南

C++編程語言對內(nèi)存的操作是一個非常復雜的應用步驟,我們在學習的過程中,需要不斷的從實踐編程中去總結這方面的應用經(jīng)驗,以幫助我們理解。在這里我們就先來介紹一下C++內(nèi)存對齊的相關方法。#t#

十多年的萊州網(wǎng)站建設經(jīng)驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。全網(wǎng)整合營銷推廣的優(yōu)勢是能夠根據(jù)用戶設備顯示端的尺寸不同,自動調(diào)整萊州建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“萊州網(wǎng)站設計”,“萊州網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

一、為什么會有C++內(nèi)存對齊

以下內(nèi)容節(jié)選自《Intel Architecture 32 Manual》。

為了提高程序的性能,數(shù)據(jù)結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在于,為了訪問未對齊的內(nèi)存,處理器需要作兩次內(nèi)存訪問;然而,對齊的內(nèi)存訪問僅需要一次訪問。

一個字或雙字操作數(shù)跨越了4字節(jié)邊界,或者一個四字操作數(shù)跨越了8字節(jié)邊界,被認為是未對齊的,從而需要兩次總線周期來訪問內(nèi)存。一個字起始地址是奇數(shù)但卻沒有跨越字邊界被認為是對齊的,能夠在一個總線周期中被訪問。

二、C++內(nèi)存對齊規(guī)則

每個特定平臺上的編譯器都有自己的默認“對齊系數(shù)”(也叫對齊模數(shù))。程序員可以通過預編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一系數(shù),其中的n就是你要指定的“對齊系數(shù)”。

對齊規(guī)則:

1、數(shù)據(jù)成員對齊規(guī)則:結構(struct)(或聯(lián)合(union))的數(shù)據(jù)成員,***個數(shù)據(jù)成員放在offset為0的地方,以后每個數(shù)據(jù)成員的對齊按照 #pragma pack指定的數(shù)值和這個數(shù)據(jù)成員自身長度中,比較小的那個進行。

2、結構(或聯(lián)合)的整體對齊規(guī)則:在數(shù)據(jù)成員完成各自對齊之后,結構(或聯(lián)合)本身也要進行對齊,對齊將按照#pragma pack指定的數(shù)值和結構(或聯(lián)合)***數(shù)據(jù)成員長度中,比較小的那個進行。

3、結合1、2推斷:當#pragma pack的n值等于或超過所有數(shù)據(jù)成員長度的時候,這個n值的大小將不產(chǎn)生任何效果。

4.各成員變量存放的起始地址相對于結構的起始地址的偏移量必須為該變量的類型所占用的字節(jié)數(shù)的倍數(shù)。

5.各成員變量在存放的時候根據(jù)在結構中出現(xiàn)的順序依次申請空間,同時按照上面的對齊方式調(diào)整位置,空缺的字節(jié)自動填充。

6.同時為了確保結構的大小為結構的字節(jié)邊界數(shù)(即該結構中占用***空間的類型所占用的字節(jié)數(shù))的倍數(shù),所以在為***一個成員變量申請空間后,還會根據(jù)需要自動填充空缺的字節(jié)。

三、pragma pack 宏

VC中提供了#pragma pack(n)來設定變量以n字節(jié)對齊方式。n字節(jié)對齊就是說變量存放的起始地址的偏移量有兩種情況:***、如果n大于等于該變量所占用的字節(jié)數(shù),那么偏移量必須滿足默認的對齊方式,第二、如果n小于該變量的類型所占用的字節(jié)數(shù),那么偏移量為n的倍數(shù),不用滿足默認的對齊方式。結構的總大小也有個約束條件,分下面兩種情況:如果n大于所有成員變量類型所占用的字節(jié)數(shù),那么結構的總大小必須為占用空間***的變量占用的空間數(shù)的倍數(shù);否則必須為n的倍數(shù)。下面舉例說明其用法。

 
 
 
  1. #pragma pack(push) //保存對齊狀態(tài)  
  2. #pragma pack(4)//設定為4字節(jié)對齊  
  3. struct test  
  4. {  
  5. char m1;  
  6. double m4;  
  7. int m3;  
  8. };  
  9. #pragma pack(pop)//恢復對齊狀態(tài) 

以上結構的大小為16,下面分析其存儲情況,首先為m1分配空間,其偏移量為0,滿足我們自己設定的對齊方式(4字節(jié)對齊),m1占用1個字節(jié)。接著開始為m4分配空間,這時其偏移量為1,需要補足3個字節(jié),這樣使偏移量滿足為n=4的倍數(shù)(因為sizeof(double)大于n),m4占用8個字節(jié)。接著為m3分配空間,這時其偏移量為12,滿足為4的倍數(shù),m3占用4個字節(jié)。這時已經(jīng)為所有成員變量分配了空間,共分配了16個字節(jié),滿足為n的倍數(shù)。如果把上面的#pragma pack(4)改為#pragma pack(16),那么我們可以得到結構的大小為24。

以上就是對C++內(nèi)存對齊的相關介紹。


本文名稱:C++內(nèi)存對齊詳細使用指南
文章源于:http://m.5511xx.com/article/cdogoej.html