亚洲一级免费看,特黄特色大片免费观看播放器,777毛片,久久久久国产一区二区三区四区,欧美三级一区二区,国产精品一区二区久久久久,人人澡人人草

試題

計(jì)算機(jī)二級(jí)C++內(nèi)存對(duì)齊詳細(xì)使用指南

時(shí)間:2025-04-23 02:22:28 試題 我要投稿
  • 相關(guān)推薦

2016計(jì)算機(jī)二級(jí)C++內(nèi)存對(duì)齊詳細(xì)使用指南

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

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

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

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

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

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

  對(duì)齊規(guī)則:

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

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

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

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

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

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

  三、pragma pack 宏

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

  #pragma pack(push) //保存對(duì)齊狀態(tài) #pragma pack(4)//設(shè)定為4字節(jié)對(duì)齊 struct test { char m1; double m4; int m3; }; #pragma pack(pop)//恢復(fù)對(duì)齊狀態(tài)

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

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

【計(jì)算機(jī)二級(jí)C++內(nèi)存對(duì)齊詳細(xì)使用指南】相關(guān)文章:

解析C語(yǔ)言結(jié)構(gòu)體對(duì)齊(內(nèi)存對(duì)齊問題)04-13

C/C++內(nèi)存管理05-05

java內(nèi)存的詳細(xì)介紹06-04

計(jì)算機(jī)二級(jí)C++考點(diǎn):C++語(yǔ)言概述07-17

計(jì)算機(jī)二級(jí)C++模板概述07-06

計(jì)算機(jī)二級(jí)C++函數(shù)考點(diǎn)07-22

計(jì)算機(jī)二級(jí)C++函數(shù)解釋05-20

計(jì)算機(jī)二級(jí)c++試題及答案12-24

計(jì)算機(jī)二級(jí)C++強(qiáng)化測(cè)試03-12