在計算結構體長度的時候,我們經常聽說字節對齊。那什么是對齊?
如果一個變量在內存中的地址正好是它長度的整數倍,我們就稱它為自然對齊。
比如在32位的操作系統中,如果一個整型變量的地址是0x04,那么它就是自然對齊。
而且操作系統也確實是這么做的,隨便定義一個整型變量,打印它的地址,結果一定是4的倍數。
?有了這個基礎,我們再來計算結構體的長度,就會簡單的多。
![3b256cc8-a07b-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/A0/3E/wKgaomToLJuAMZO7AAXBwVTlOjM405.png)
接下來輪到id,在32位系統中short占2個字節,直接跟在num的后面就行。
![3b401352-a07b-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/A0/3E/wKgaomToLJuASQQCAAXIB6yCvMk220.png)
最后一個是c,因為只占一個字節,所以直接放在最后就好。
?那結構體的長度是不是11個字節呢,不是的,結構體的長度一定是最長成員的整數倍,所以在c的后面還空了一個字節,結構體一共占了12字節。
記住幾個原則。
一、結構體變量的首地址是最長成員長度的整數倍。比如我們計算的這個結構體,它的首地址一定是4的整數倍。
二、每個成員相對結構體首地址的偏移量,一定是該成員長度的整數倍。
三、結構體的總長度是最長成員長度的整數倍。
四、如果結構體內有成員長度大于處理器的位數,那么就以處理器的位數作為對齊單位,比如在32位操作系統中,double占8字節,我們還是按照4字節為對齊單位。
![3b5fe326-a07b-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/A0/3F/wKgaomToLJyAbj29AAhnU15XvlY267.png)
如果一個變量在內存中的地址正好是它長度的整數倍,我們就稱它為自然對齊。
比如在32位的操作系統中,如果一個整型變量的地址是0x04,那么它就是自然對齊。
![3b05c184-a07b-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/A0/3E/wKgaomToLJqAR8UhAAcCgMvJtxQ370.png)
int main()
{
int num;
printf("%p
", &num);
return 0;
}
這樣做的根本原因還是為了提高CPU的訪問效率。如果一個整型變量存放在0x02地址上,那么CPU首先會讀取兩個字節的short,再讀取后面的兩個字節,最后把兩個部分合成一個整數,很顯然這樣的效率會比較低。![3b15559a-a07b-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/A0/3E/wKgaomToLJuAEgVkAAb2FNvDtJo572.png)
struct Test
{
char ch;
int num;
short id;
charc;
};
比如這個結構,char類型占一個字節,int占四個字節,但是num不能直接跟在ch的后面,否則num的地址肯定不是4的整數倍,所以需要在ch的后面空3個字節。![3b256cc8-a07b-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/A0/3E/wKgaomToLJuAMZO7AAXBwVTlOjM405.png)
接下來輪到id,在32位系統中short占2個字節,直接跟在num的后面就行。
![3b401352-a07b-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/A0/3E/wKgaomToLJuASQQCAAXIB6yCvMk220.png)
最后一個是c,因為只占一個字節,所以直接放在最后就好。
![3b50104a-a07b-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/A0/3E/wKgaomToLJuAEcBOAAXKEUKND_I341.png)
記住幾個原則。
一、結構體變量的首地址是最長成員長度的整數倍。比如我們計算的這個結構體,它的首地址一定是4的整數倍。
二、每個成員相對結構體首地址的偏移量,一定是該成員長度的整數倍。
三、結構體的總長度是最長成員長度的整數倍。
四、如果結構體內有成員長度大于處理器的位數,那么就以處理器的位數作為對齊單位,比如在32位操作系統中,double占8字節,我們還是按照4字節為對齊單位。
![3b5fe326-a07b-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/A0/3F/wKgaomToLJyAbj29AAhnU15XvlY267.png)
審核編輯 :李倩
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
操作系統
+關注
關注
37文章
6900瀏覽量
123814 -
字節
+關注
關注
0文章
41瀏覽量
13818 -
變量
+關注
關注
0文章
613瀏覽量
28478
原文標題:字節對齊
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
Orcad繪制原理圖的元器件對齊方法
在使用Orcad軟件繪制原理圖的時候,為了使原理圖繪制的美觀一些,有時候也希望像PCB設計一樣,將所有的器件都進行對齊,這里我們給大家介紹下,原理圖器件對齊的方法,方便大家在原理圖設計的時候也可以將元器件進行對齊。
![Orcad繪制原理圖的元器件<b class='flag-5'>對齊</b>方法](https://file1.elecfans.com/web3/M00/07/5F/wKgZPGelcaCAKwfGAAAOpk8Mx1M157.png)
如何保證電平轉換前后數據的相位對齊?
請教各位TI的技術人員一個問題
數據經過電平轉換芯片是會產生延遲的
對于多通道電平轉換芯片,由于延時的存在,不同通道間的延時是不一樣的,那同相位的信號經過轉換后不同通道的輸出信號的相位可能不同,請問一下如何保證不同通道間的輸出相位對齊?
謝謝
發表于 02-05 06:16
關于tlk2201數據對齊問題求解
最近在調tlk2201,10bit位寬,tbi模式。目前的進度如下:如果發射端不發k28.5,那接收端syncen拉低,是無法對齊的。td0-td9隨機對應rd0-rd9。這樣不行,所以拉高
發表于 01-23 06:26
KiCad的對齊工具不好用?
兩個以上對象 時,才可以在右鍵的菜單中找到它的身影: 如何使用對齊菜單? 經常有小伙伴抱怨 KiCad 的對齊的效果很隨機,沒有辦法按照意圖進行對齊操作。真實情況是 KiCad 在執行
![KiCad的<b class='flag-5'>對齊</b>工具不好用?](https://file1.elecfans.com//web1/M00/F4/D2/wKgZoWcy166AZBlZAAFk4Vjf3gI929.png)
I2S有左對齊,右對齊跟標準的I2S三種格式,那么這三種格式各有什么優點呢?
大家好,關于I2S格式,有兩個疑問請教一下
我們知道I2S有左對齊,右對齊跟標準的I2S三種格式,那么這三種格式各有什么優點呢?
而且對于標準的I2S格式,32FS傳輸16bit的數據,48fs傳輸24bit的數據,最低位會移動到右聲道,是否意味著該數據被丟棄了?還是有
發表于 10-21 08:23
請問cc3200 i2s怎么設置左對齊或者右對齊模式?
CC3200 手冊 swru367中有提到i2s支持左對齊或者右對齊,但是在sdk提供的api中沒有找到如何設置,請問哪位高人知道,請指點一下,謝謝
發表于 10-21 07:08
OpenAI超級對齊團隊解散
近日,OpenAI的安全主管、“超級智能對齊團隊”負責人Jan Leike宣布離職。據悉,Jan Leike與OpenAI高層在公司的核心優先事項上存在長期且難以調和的分歧。
求助,關于STM32H7的Cache無效化操作32字節對齊問題求解
core_cm7.h更新到5.1.1版本后,發現該函數對dsize做了32字節對齊,但是op_addr地址32字節對齊卻注釋掉了?,圖片的這句話是不是說SCB->
發表于 03-29 06:51
STM32H操作外部存儲器的地址沒有對齊怎么解決?
如下硬件例外中斷,查看了一下是給外部SDRAM變量賦值時發生的,匯編指令如下0x800'4e5a: 0x600aSTR R2, [R1]
R1的值是0x3004'4036,沒有進行4字節對齊,發生這種問題是MPU設置不對嗎,還是對編譯器的設置不對,還是
發表于 03-28 07:23
PSoC Creator有沒有內存對齊方式的設置?
使用PSoC4開發的時候發現ROM不夠了,想做下優化,PSoC Creator有沒有內存對齊方式的設置,比如說把對齊方式從4Byte改為2Byte?
發表于 02-18 08:03
評論