在計算結(jié)構(gòu)體長度的時候,我們經(jīng)常聽說字節(jié)對齊。那什么是對齊?
如果一個變量在內(nèi)存中的地址正好是它長度的整數(shù)倍,我們就稱它為自然對齊。
比如在32位的操作系統(tǒng)中,如果一個整型變量的地址是0x04,那么它就是自然對齊。
而且操作系統(tǒng)也確實是這么做的,隨便定義一個整型變量,打印它的地址,結(jié)果一定是4的倍數(shù)。
?有了這個基礎(chǔ),我們再來計算結(jié)構(gòu)體的長度,就會簡單的多。

接下來輪到id,在32位系統(tǒng)中short占2個字節(jié),直接跟在num的后面就行。

最后一個是c,因為只占一個字節(jié),所以直接放在最后就好。
?那結(jié)構(gòu)體的長度是不是11個字節(jié)呢,不是的,結(jié)構(gòu)體的長度一定是最長成員的整數(shù)倍,所以在c的后面還空了一個字節(jié),結(jié)構(gòu)體一共占了12字節(jié)。
記住幾個原則。
一、結(jié)構(gòu)體變量的首地址是最長成員長度的整數(shù)倍。比如我們計算的這個結(jié)構(gòu)體,它的首地址一定是4的整數(shù)倍。
二、每個成員相對結(jié)構(gòu)體首地址的偏移量,一定是該成員長度的整數(shù)倍。
三、結(jié)構(gòu)體的總長度是最長成員長度的整數(shù)倍。
四、如果結(jié)構(gòu)體內(nèi)有成員長度大于處理器的位數(shù),那么就以處理器的位數(shù)作為對齊單位,比如在32位操作系統(tǒng)中,double占8字節(jié),我們還是按照4字節(jié)為對齊單位。

如果一個變量在內(nèi)存中的地址正好是它長度的整數(shù)倍,我們就稱它為自然對齊。
比如在32位的操作系統(tǒng)中,如果一個整型變量的地址是0x04,那么它就是自然對齊。

int main()
{
int num;
printf("%p
", &num);
return 0;
}
這樣做的根本原因還是為了提高CPU的訪問效率。如果一個整型變量存放在0x02地址上,那么CPU首先會讀取兩個字節(jié)的short,再讀取后面的兩個字節(jié),最后把兩個部分合成一個整數(shù),很顯然這樣的效率會比較低。
struct Test
{
char ch;
int num;
short id;
charc;
};
比如這個結(jié)構(gòu),char類型占一個字節(jié),int占四個字節(jié),但是num不能直接跟在ch的后面,否則num的地址肯定不是4的整數(shù)倍,所以需要在ch的后面空3個字節(jié)。
接下來輪到id,在32位系統(tǒng)中short占2個字節(jié),直接跟在num的后面就行。

最后一個是c,因為只占一個字節(jié),所以直接放在最后就好。

記住幾個原則。
一、結(jié)構(gòu)體變量的首地址是最長成員長度的整數(shù)倍。比如我們計算的這個結(jié)構(gòu)體,它的首地址一定是4的整數(shù)倍。
二、每個成員相對結(jié)構(gòu)體首地址的偏移量,一定是該成員長度的整數(shù)倍。
三、結(jié)構(gòu)體的總長度是最長成員長度的整數(shù)倍。
四、如果結(jié)構(gòu)體內(nèi)有成員長度大于處理器的位數(shù),那么就以處理器的位數(shù)作為對齊單位,比如在32位操作系統(tǒng)中,double占8字節(jié),我們還是按照4字節(jié)為對齊單位。

審核編輯 :李倩
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
7091瀏覽量
124961 -
字節(jié)
+關(guān)注
關(guān)注
0文章
42瀏覽量
14041 -
變量
+關(guān)注
關(guān)注
0文章
614瀏覽量
28822
原文標(biāo)題:字節(jié)對齊
文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
熱點推薦
伺服電機(jī)編碼器與轉(zhuǎn)子磁極相位對齊方法
永磁交流伺服電機(jī)的編碼器相位為何要與轉(zhuǎn)子磁極相位對齊
其唯一目的就是要達(dá)成矢量控制的目標(biāo),使 d 軸勵磁分量和 q 軸出力分量解耦,令永磁交流伺服電機(jī)定子繞組產(chǎn)生的電磁場始終正交于轉(zhuǎn)子永磁場,從而
發(fā)表于 05-14 16:00
Allegro Skill布局功能--器件絲印過孔對齊介紹與演示
Allegro系統(tǒng)雖然提供了基本的元件對齊功能,但其適用范圍較為有限。相比之下,F(xiàn)anyskill 的“對齊”命令在操作體驗和功能性上更具優(yōu)勢:其界面設(shè)計更加直觀易用,并支持多種元素的對齊操作,包括
發(fā)表于 05-14 08:59
?354次閱讀

PCB布局太亂? Altium Designer這個快捷鍵幫你一秒對齊全場
在做PCB設(shè)計的時候,你是否也遇到過這種情況: 器件擺好但總感覺歪歪扭扭? 有些元件間距不一致,看著難受? 想對齊又一個個拖動,累得不行? 別急!今天教你一招? Altium Designer 里

圖解邊沿對齊,中心對齊PWM(可下載)
在說邊沿對齊,中心對齊前,我們先來段鋪墊,PWM 又稱脈沖寬度調(diào)制,我們通過調(diào) 節(jié)脈沖的占空比,我們可以控制電壓的大小(比如我們滿占空比時電壓為 12V,我們可以通 過調(diào)節(jié)占空比讓電壓變?yōu)?7V
發(fā)表于 03-31 15:15
?0次下載
Gerber文件中元件與焊接無法對齊
同一塊板子,轉(zhuǎn)換成Gerber文件后,進(jìn)行DFM分析時,元件無法與焊接對齊,導(dǎo)致全部貼片元件報錯。如果直接采用AD源文件進(jìn)行DFM分析則不會出現(xiàn)。
發(fā)表于 02-19 09:02
Orcad繪制原理圖的元器件對齊方法
在使用Orcad軟件繪制原理圖的時候,為了使原理圖繪制的美觀一些,有時候也希望像PCB設(shè)計一樣,將所有的器件都進(jìn)行對齊,這里我們給大家介紹下,原理圖器件對齊的方法,方便大家在原理圖設(shè)計的時候也可以將元器件進(jìn)行對齊。

如何保證電平轉(zhuǎn)換前后數(shù)據(jù)的相位對齊?
請教各位TI的技術(shù)人員一個問題
數(shù)據(jù)經(jīng)過電平轉(zhuǎn)換芯片是會產(chǎn)生延遲的
對于多通道電平轉(zhuǎn)換芯片,由于延時的存在,不同通道間的延時是不一樣的,那同相位的信號經(jīng)過轉(zhuǎn)換后不同通道的輸出信號的相位可能不同,請問一下如何保證不同通道間的輸出相位對齊?
謝謝
發(fā)表于 02-05 06:16
關(guān)于tlk2201數(shù)據(jù)對齊問題求解
最近在調(diào)tlk2201,10bit位寬,tbi模式。目前的進(jìn)度如下:如果發(fā)射端不發(fā)k28.5,那接收端syncen拉低,是無法對齊的。td0-td9隨機(jī)對應(yīng)rd0-rd9。這樣不行,所以拉高
發(fā)表于 01-23 06:26
求助,TLK10002低速側(cè)兩路數(shù)據(jù)對齊的疑問求解
實際測試tlk10002過程中發(fā)現(xiàn),在開始“同步期間”,也就是tlk10002發(fā)送TI專有同步碼的過程中,收到的兩路同步碼是對齊的,數(shù)據(jù)間沒有byte錯位。然而,在同步碼之后的正常數(shù)據(jù),對于兩通
發(fā)表于 01-10 06:04
KiCad的對齊工具不好用?
兩個以上對象 時,才可以在右鍵的菜單中找到它的身影: 如何使用對齊菜單? 經(jīng)常有小伙伴抱怨 KiCad 的對齊的效果很隨機(jī),沒有辦法按照意圖進(jìn)行對齊操作。真實情況是 KiCad 在執(zhí)行

請問ADC12D1600的DCLK可以選擇與RCLK的相位嚴(yán)格對齊嗎?
我選擇的芯片是ADC12D1600RF,因為輸出數(shù)據(jù)時鐘DCLK是4分頻的,而DAC那邊也是4分頻時鐘,因此兩個時鐘有可能有相位差。我想要通過將DA的數(shù)據(jù)時鐘輸給RCLK來對齊ADC的DCLK可行
發(fā)表于 11-29 09:35
ARM嵌入式系統(tǒng)中內(nèi)存對齊的重要性
做嵌入式系統(tǒng)軟件開發(fā),經(jīng)常在代碼中看到各種各樣的對齊,很多時候我們都是知其然不知其所以然,知道要做好各種對齊,但是不明白為什么要對齊,不對齊

I2S有左對齊,右對齊跟標(biāo)準(zhǔn)的I2S三種格式,那么這三種格式各有什么優(yōu)點呢?
大家好,關(guān)于I2S格式,有兩個疑問請教一下
我們知道I2S有左對齊,右對齊跟標(biāo)準(zhǔn)的I2S三種格式,那么這三種格式各有什么優(yōu)點呢?
而且對于標(biāo)準(zhǔn)的I2S格式,32FS傳輸16bit的數(shù)據(jù),48fs傳輸24bit的數(shù)據(jù),最低位會移動到右聲道,是否意味著該數(shù)據(jù)被丟棄了?還是有
發(fā)表于 10-21 08:23
請問cc3200 i2s怎么設(shè)置左對齊或者右對齊模式?
CC3200 手冊 swru367中有提到i2s支持左對齊或者右對齊,但是在sdk提供的api中沒有找到如何設(shè)置,請問哪位高人知道,請指點一下,謝謝
發(fā)表于 10-21 07:08
三相三電平逆變器的中心對齊SVPWM實現(xiàn)
電子發(fā)燒友網(wǎng)站提供《三相三電平逆變器的中心對齊SVPWM實現(xiàn).pdf》資料免費下載
發(fā)表于 10-12 11:25
?0次下載

評論