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

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

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

如果一個(gè)變量在內(nèi)存中的地址正好是它長度的整數(shù)倍,我們就稱它為自然對齊。
比如在32位的操作系統(tǒng)中,如果一個(gè)整型變量的地址是0x04,那么它就是自然對齊。
而且操作系統(tǒng)也確實(shí)是這么做的,隨便定義一個(gè)整型變量,打印它的地址,結(jié)果一定是4的倍數(shù)。
int main()
{
int num;
printf("%p
", &num);
return 0;
}
這樣做的根本原因還是為了提高CPU的訪問效率。如果一個(gè)整型變量存放在0x02地址上,那么CPU首先會讀取兩個(gè)字節(jié)的short,再讀取后面的兩個(gè)字節(jié),最后把兩個(gè)部分合成一個(gè)整數(shù),很顯然這樣的效率會比較低。
?有了這個(gè)基礎(chǔ),我們再來計(jì)算結(jié)構(gòu)體的長度,就會簡單的多。
struct Test
{
char ch;
int num;
short id;
charc;
};
比如這個(gè)結(jié)構(gòu),char類型占一個(gè)字節(jié),int占四個(gè)字節(jié),但是num不能直接跟在ch的后面,否則num的地址肯定不是4的整數(shù)倍,所以需要在ch的后面空3個(gè)字節(jié)。
接下來輪到id,在32位系統(tǒng)中short占2個(gè)字節(jié),直接跟在num的后面就行。

最后一個(gè)是c,因?yàn)橹徽家粋€(gè)字節(jié),所以直接放在最后就好。
?那結(jié)構(gòu)體的長度是不是11個(gè)字節(jié)呢,不是的,結(jié)構(gòu)體的長度一定是最長成員的整數(shù)倍,所以在c的后面還空了一個(gè)字節(jié),結(jié)構(gòu)體一共占了12字節(jié)。記住幾個(gè)原則。
一、結(jié)構(gòu)體變量的首地址是最長成員長度的整數(shù)倍。比如我們計(jì)算的這個(gè)結(jié)構(gòu)體,它的首地址一定是4的整數(shù)倍。
二、每個(gè)成員相對結(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)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報(bào)投訴
-
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
7402瀏覽量
129338 -
字節(jié)
+關(guān)注
關(guān)注
0文章
44瀏覽量
14380 -
變量
+關(guān)注
關(guān)注
0文章
616瀏覽量
29511
原文標(biāo)題:字節(jié)對齊
文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
熱點(diǎn)推薦
科技云報(bào)到:兩會“中場時(shí)刻”:從技術(shù)突破到制度對齊
科技云報(bào)到:兩會“中場時(shí)刻”:從技術(shù)突破到制度對齊
LAT1185+一個(gè)地址未對齊引起的 HardFault 異常應(yīng)用筆記
,則程序運(yùn)行正常。表面上看,這似乎是 KEIL MDK 的問題,通過分析,導(dǎo)致這個(gè)問題的本質(zhì)原因是內(nèi)存地址沒有對齊引起的,下面章節(jié)將詳細(xì)分析該問題的來龍去脈以及解決方法。
發(fā)表于 01-11 17:28
?0次下載
頻譜分析儀與電壓探頭匹配指南
如何實(shí)現(xiàn)頻譜分析儀與電壓探頭的精準(zhǔn)匹配?核心邏輯可概括為“三對齊一適配”——參數(shù)對齊、接口對齊、設(shè)置對齊+場景適配,最終目標(biāo)是規(guī)避信號反射、衰減與失真問題,確保測量數(shù)據(jù)(幅度、頻率、波
CW32操作FLASH地址對齊的要求
地址邊界對齊,即使用 16bit 位寬訪問 FLASH 時(shí)的地址必須是偶地址,使用 32bit 位寬時(shí)的地址必須是 4 的倍數(shù)地址。
正確地址對齊的代碼示例:
8bit 讀取:
tempdata
發(fā)表于 12-15 06:30
單片機(jī)內(nèi)部FLASH字節(jié)操作
一個(gè)字(32位)
[*]// addr:讀取地址
[*]// 返回: 讀到的字?jǐn)?shù)據(jù)
[*]//備注: 地址為4字節(jié)對齊
發(fā)表于 11-24 06:40
摩爾線程新一代大語言模型對齊框架URPO入選AAAI 2026
近日,摩爾線程在人工智能前沿領(lǐng)域取得重要突破,其提出的新一代大語言模型對齊框架——URPO統(tǒng)一獎(jiǎng)勵(lì)與策略優(yōu)化,相關(guān)研究論文已被人工智能領(lǐng)域的國際頂級學(xué)術(shù)會議AAAI 2026收錄。這一成果標(biāo)志著摩爾線程在大模型基礎(chǔ)技術(shù)探索上邁出了關(guān)鍵一步,為簡化大模型訓(xùn)練流程、突破模型性能上限提供了全新的技術(shù)路徑。
MDK536 + SWM34S平臺移植LVGL8.3.3 定義數(shù)組使用ALIGN()對齊時(shí)編譯報(bào)錯(cuò)是什么原因?qū)е碌模?/a>
使用MDK536 SWM34S單片機(jī) ENV下添加LVGL軟件包8.3.3后,編譯工程報(bào)錯(cuò)。提示出錯(cuò)在定義數(shù)組時(shí)使用ALIGN字節(jié)對齊,在lv_rt_thread_port.c中和一些樣例代碼文件
發(fā)表于 10-09 08:00
MDK uVision V5.36.00使用rt_packed進(jìn)行字節(jié)對齊,但無效,為什么?
各位RTT專家好:
MDK uVision V5.36.00使用rt_packed進(jìn)行字節(jié)對齊,但無效。
發(fā)表于 09-24 06:37
使用lv_label_set_text釋放內(nèi)存沒對齊是什么原因?qū)е碌模?/a>
(guider_ui.monitor_label_pressure_now, "1");
rt_mutex_release(lv_mutex); // 釋放互斥鎖
使用lv_label_set_text導(dǎo)致釋放內(nèi)存沒對齊是什么問題
已經(jīng)加了互斥鎖
發(fā)表于 09-16 06:44
TC334 uart dma發(fā)送數(shù)據(jù)時(shí),只能發(fā)送17個(gè)字節(jié),怎么解決?
具體情況:配置串口發(fā)送,具體配置情況如下,對于17字節(jié)內(nèi)的數(shù)據(jù)包能夠正常發(fā)送,大于17字節(jié)的數(shù)據(jù)包只能發(fā)送前17字節(jié)。(已做好字節(jié)對齊) 請
發(fā)表于 08-04 07:18
伺服電機(jī)編碼器與轉(zhuǎn)子磁極相位對齊方法
永磁交流伺服電機(jī)的編碼器相位為何要與轉(zhuǎn)子磁極相位對齊
其唯一目的就是要達(dá)成矢量控制的目標(biāo),使 d 軸勵(lì)磁分量和 q 軸出力分量解耦,令永磁交流伺服電機(jī)定子繞組產(chǎn)生的電磁場始終正交于轉(zhuǎn)子永磁場,從而
發(fā)表于 05-14 16:00
Allegro Skill布局功能--器件絲印過孔對齊介紹與演示
Allegro系統(tǒng)雖然提供了基本的元件對齊功能,但其適用范圍較為有限。相比之下,F(xiàn)anyskill 的“對齊”命令在操作體驗(yàn)和功能性上更具優(yōu)勢:其界面設(shè)計(jì)更加直觀易用,并支持多種元素的對齊操作,包括
發(fā)表于 05-14 08:59
?3830次閱讀
彈性布局 (Flex) 提供更加有效的方式對容器中的子元素進(jìn)行排列、對齊和分配剩余空間
彈性布局 (Flex)
彈性布局(Flex)提供更加有效的方式對容器中的子元素進(jìn)行排列、對齊和分配剩余空間。常用于頁面頭部導(dǎo)航欄的均勻分布、頁面框架的搭建、多行數(shù)據(jù)的排列等。
布局方向
在彈性
發(fā)表于 04-30 07:54
PCB布局太亂? Altium Designer這個(gè)快捷鍵幫你一秒對齊全場
在做PCB設(shè)計(jì)的時(shí)候,你是否也遇到過這種情況: 器件擺好但總感覺歪歪扭扭? 有些元件間距不一致,看著難受? 想對齊又一個(gè)個(gè)拖動,累得不行? 別急!今天教你一招? Altium Designer 里
圖解邊沿對齊,中心對齊PWM(可下載)
在說邊沿對齊,中心對齊前,我們先來段鋪墊,PWM 又稱脈沖寬度調(diào)制,我們通過調(diào) 節(jié)脈沖的占空比,我們可以控制電壓的大小(比如我們滿占空比時(shí)電壓為 12V,我們可以通 過調(diào)節(jié)占空比讓電壓變?yōu)?7V
發(fā)表于 03-31 15:15
?1次下載
經(jīng)常聽說字節(jié)對齊,那什么是對齊?
評論