国产成人毛片视频|星空传媒久草视频|欧美激情草久视频|久久久久女女|久操超碰在线播放|亚洲强奸一区二区|五月天丁香社区在线|色婷婷成人丁香网|午夜欧美6666|纯肉无码91视频

c語言結(jié)構(gòu)體對(duì)齊規(guī)則 內(nèi)存對(duì)齊的目的和規(guī)則?

內(nèi)存對(duì)齊的目的和規(guī)則?有四種內(nèi)存對(duì)齊原則:1)。數(shù)據(jù)成員對(duì)齊規(guī)則:結(jié)構(gòu)(或聯(lián)合)的數(shù)據(jù)成員。第一個(gè)數(shù)據(jù)成員放置在偏移量為0的位置。之后,每個(gè)數(shù)據(jù)成員存儲(chǔ)的起始位置從該成員大小或其子成員大小的整數(shù)倍開始

內(nèi)存對(duì)齊的目的和規(guī)則?

有四種內(nèi)存對(duì)齊原則:

1)。數(shù)據(jù)成員對(duì)齊規(guī)則:結(jié)構(gòu)(或聯(lián)合)的數(shù)據(jù)成員。第一個(gè)數(shù)據(jù)成員放置在偏移量為0的位置。之后,每個(gè)數(shù)據(jù)成員存儲(chǔ)的起始位置從該成員大小或其子成員大小的整數(shù)倍開始(只要該成員有子成員,如數(shù)組、結(jié)構(gòu)等)(例如,在32位計(jì)算機(jī)中int為4字節(jié),則應(yīng)從4的整數(shù)倍地址開始存儲(chǔ))?;绢愋筒话╯truct/class/Uinon。

2) . struct as member:如果一個(gè)結(jié)構(gòu)中有一些結(jié)構(gòu)成員,那么應(yīng)該從結(jié)構(gòu)中“最寬的基本類型成員”的整數(shù)倍地址存儲(chǔ)結(jié)構(gòu)成員。(結(jié)構(gòu)a包含結(jié)構(gòu)B,而B包含char、int、double和其他元素,那么B應(yīng)該從8的整數(shù)倍存儲(chǔ)。)。

3) . 收尾工作:結(jié)構(gòu)的總尺寸,即sizeof的結(jié)果,必須是結(jié)構(gòu)內(nèi)部最大構(gòu)件的“最寬基本型構(gòu)件”的整數(shù)倍。彌補(bǔ)不足。(基本類型不包括struct/class/Uinon)。

4) . sizeof(Union),結(jié)構(gòu)中最大的元素是Union的大小,因?yàn)樵谔囟〞r(shí)間,只有Union的一個(gè)成員實(shí)際存儲(chǔ)在地址中。

內(nèi)存對(duì)齊的規(guī)則?

為了加快計(jì)算機(jī)的訪問速度,編譯器在默認(rèn)情況下對(duì)內(nèi)存進(jìn)行字節(jié)對(duì)齊。結(jié)構(gòu)(包括類)字節(jié)對(duì)齊的原則如下:

1)結(jié)構(gòu)變量的第一個(gè)地址可以除以其最寬的基本類型成員的大??;

2)結(jié)構(gòu)的每個(gè)成員相對(duì)于結(jié)構(gòu)的第一個(gè)地址的偏移量是成員大小的整數(shù)倍。如果需要,編譯器將在成員之間添加內(nèi)部加法;

3)結(jié)構(gòu)的總大小是結(jié)構(gòu)最寬基本類型成員大小的整數(shù)倍。如果需要,編譯器將在最后一個(gè)成員之后添加尾隨填充。Structsbyte1{double//offset 0~7charj//offset 8inta//offset 12~15,因?yàn)?不能被4除,請(qǐng)先填寫9~11}sizeof(sbyte1)//=16structsbyte2{charj//offset 0double//offset 8~15,因?yàn)?不能被8除,請(qǐng)先填寫1~7inta//offset 16~19}sizeof(sbyte2)//=24,為了使倍數(shù)為8,填寫20~23

對(duì)齊方式與數(shù)據(jù)在內(nèi)存中的位置有關(guān)。如果變量的內(nèi)存地址是其長(zhǎng)度的整數(shù)倍,則稱為自然對(duì)齊。例如,在32位CPU中,如果整數(shù)變量的地址是0x00000004,則它自然對(duì)齊。字節(jié)對(duì)齊的根本原因是CPU訪問數(shù)據(jù)的效率。假設(shè)上面整數(shù)變量的地址不是自然對(duì)齊的,例如0x00000002,那么CPU需要訪問內(nèi)存兩次,如果它接受它的值。第一次從0x00000002-0x00000003取短,第二次從0x00000004-0x00000005取短,然后合并得到所需的數(shù)據(jù)。如果變量的地址為0x00000003,則需要訪問內(nèi)存三次,第一次訪問char,第二次訪問簡(jiǎn)稱char,第三次訪問char,然后合并得到整數(shù)數(shù)據(jù)。如果變量處于自然對(duì)齊位置,則只能檢索一次數(shù)據(jù)。有些系統(tǒng)對(duì)對(duì)齊非常嚴(yán)格,如SPARC系統(tǒng)。如果獲取未對(duì)齊的數(shù)據(jù),則會(huì)發(fā)生錯(cuò)誤。例如,char ch[8]char*P=& ch[1]int i=*(int*)P在運(yùn)行時(shí)會(huì)報(bào)告為段錯(cuò)誤,而X86上不會(huì)有錯(cuò)誤,但效率會(huì)降低。

結(jié)構(gòu)體字節(jié)對(duì)齊原則?

C中的結(jié)構(gòu)對(duì)齊問題:結(jié)構(gòu)占用的位數(shù)是數(shù)據(jù)的整數(shù)倍,結(jié)構(gòu)成員占用的位數(shù)最長(zhǎng)。在這種結(jié)構(gòu)中,結(jié)構(gòu)占用的比特?cái)?shù)是雙重類型的整數(shù)倍。雖然這種結(jié)構(gòu)使用位場(chǎng),但對(duì)結(jié)果沒有影響。Int i占用四個(gè)字節(jié),char J占用一個(gè)字節(jié)。這兩個(gè)字節(jié)總共占用八個(gè)字節(jié),盡管最后三個(gè)字節(jié)是無用的。inta本身占用4個(gè)字節(jié),但與結(jié)構(gòu)對(duì)齊需要8個(gè)字節(jié)。雙B需要8個(gè)字節(jié)??傆?jì)8=24字節(jié)

如何理解struct的內(nèi)存對(duì)齊?

Commons:sizeof(Union data1)的值是16。默認(rèn)情況下,Commons的最大基本類型是double,它占用8個(gè)字節(jié),因此Commons與8對(duì)齊。字符數(shù)組C2占用9字節(jié),因此整個(gè)公共體應(yīng)該占用9字節(jié),但根據(jù)對(duì)齊原則,實(shí)際分配給它的內(nèi)存是16字節(jié)。Struct:Struct數(shù)據(jù)與8字節(jié)對(duì)齊,long類型的成員1分配8字節(jié)。s、 I、C和a最初分別占用4、2、1和10字節(jié)??紤]到對(duì)齊方式,s分配4個(gè)字節(jié),I分配2個(gè)字節(jié),C分配2個(gè)字節(jié)。此時(shí),8個(gè)字節(jié)剛剛用完。最初分配了10個(gè)字節(jié)??紤]到對(duì)齊,整個(gè)結(jié)構(gòu)占用的存儲(chǔ)空間是8的倍數(shù),因此分配了16個(gè)字節(jié)。因此,結(jié)構(gòu)數(shù)據(jù)占用84216=32字節(jié)。