1、對齊原則
min(sizeof(word ), 4) = 2,因此是 2 字節對齊,而不是我們認為的 4 字節對齊。
1)每個成員分別按自己的方式對齊,并能最小化長度;
2)復雜類型(如結構)的默認對齊方式是它最長的成員的對齊方式,這樣在成員是復雜類型時,可以最小化長度;
3)對齊后的結構體整體長度必須是成員中最大的對齊參數的整數倍,這樣在處理數組時可以保證每一項都邊界對齊。
對于數組,比如 char a[3]:
它的對齊方式和分別寫 3 個 char 是一樣的,也就是說它還是按 1 個字節對齊;
如果是 typedef char Array3[3]:
Array3 這種類型的對齊方式還是按 1 個字節對齊,而不是按它的長度;
不論類型是什么,對齊的邊界一定是 1,2,4,8,16,32,64.... 中的一個。
2、#pragma pack 作用
指定結構體、聯合以及類成員的對齊 packing alignment;
3、語法
#pragma pack ( [show] | [push | pop] [, identifier], n )
說明:
1) pack 提供數據聲明級別的控制,對定義不起作用;
2) 調用 pack 時不指定參數,n 將被設成默認值;
3) 一旦改變數據類型的 alignment,直接效果就是占用 memory 的減少,但是 performance 會下降;
語法具體分析:
1) show:可選參數
顯示當前packing aligment的字節數,以warning message的形式被顯示;
2) push:可選參數
將當前指定的packing alignment數值進行壓棧操作,這里的棧是the internal compiler stack,同時設置當前的packing alignment為n;如果n沒有指定,則將當前的packing alignment數值壓棧;
3) pop:可選參數
從internal compiler stack中刪除最頂端的record;如果沒有指定n,則當前棧頂record即為新的packing alignment數值;
如果指定了n,則n將成為新的packing aligment數值;如果指定了identifier,則internal compiler stack中的record都將被pop直到identifier被找到,然后pop出identitier,同時設置packing alignment數值為當前棧頂的record;
如果指定的identifier并不存在于internal compiler stack,則pop操作被忽略;
4) identifier:可選參數
當同push一起使用時,賦予當前被壓入棧中的record一個名稱;
當同pop一起使用時,從internal compiler stack中pop出所有的record直到identifier被pop出,如果identifier沒有被找到,則忽略pop操作;
5) n:可選參數
指定packing的數值,以字節為單位;
缺省數值是8,合法的數值分別是1、2、4、8、16。
取消字節對齊:
#pragma pack() // 取消自定義字節對齊方式
4、重要規則
1)復雜類型中各個成員按照它們被聲明的順序在內存中順序存儲,第一個成員的地址和整個類型的地址相同;
2)每個成員分別對齊,即每個成員按自己的方式對齊,并最小化長度;規則就是每個成員按其類型的對齊參數(通常是這個類型的大小)和指定對齊參數中較小的一個對齊;
3)結構體、聯合體或者類的數據成員,第一個放在偏移為0的地方;
以后每個數據成員的對齊,按照#pragma pack指定的數值和這個數據成員自身長度兩個中比較小的那個進行;
也就是說,當#pragma pack指定的值等于或者超過所有數據成員長度的時候,這個指定值的大小將不產生任何效果;
4)復雜類型(如結構體)整體的對齊是按照結構體中長度最大的數據成員和#pragma pack指定值之間較小的那個值進行;
這樣當數據成員為復雜類型(如結構體)時,可以最小化長度;
5)復雜類型(如結構體)整體長度的計算必須取所用過的所有對齊參數的整數倍,不夠補空字節;
也就是取所用過的所有對齊參數中最大的那個值的整數倍,因為對齊參數都是2的n次方;這樣在處理數組時可以保證每一項都邊界對齊。
5、示例
強制對齊 #pragma pack:
#pragma pack(4) // 按 4 字節對齊,但實際上由于結構體中單個成員的最大占用字節數為 2 字節,因此實際還是按 2 字節對齊
typedef struct
{
// buf[1] 按 1 字節對齊,buf[2] 按 1 字節對齊,由于 buf[3] 的下一成員 word a 是按兩字節對齊
// 因此 buf[3] 按 1 字節對齊后,后面只需補一空字節
char buf[3];
// #pragma pack(4),取小值為 2,按 2 字節對齊
word a;
} kk;
refer:
https://www.cnblogs.com/King-Gentleman/p/5297355.html
上一篇:STM32 內存分配詳解
下一篇:STM32 Flash 均衡保存算法
推薦閱讀
史海拾趣
2016年,Taitien收購了Cardinal Components,這一收購為公司帶來了新的發展機遇和資源支持。隨后,在2021年,Cardinal加入了Pletronics,進一步擴大了其在電子行業的影響力。這些收購與合作不僅為公司帶來了更多的業務機會,也促進了其在技術研發和市場拓展方面的進步。
這五個故事只是Cardinal Components在電子行業發展中的一部分縮影。作為一家具有深厚歷史底蘊和強大技術實力的公司,Cardinal將繼續在電子行業中發揮重要作用,為行業的進步和發展做出更多貢獻。
CTC公司在創立初期便致力于半導體技術的研發。一次偶然的實驗中,公司團隊成功研發出了一種新型的晶體管結構,這一創新使得晶體管的工作效率大大提升,同時降低了能耗。這一技術突破迅速引起了行業的關注,CTC公司的名字開始在電子行業中嶄露頭角。隨著該技術的普及和應用,CTC公司的業務逐漸擴大,奠定了在電子行業的重要地位。
隨著產品線的不斷豐富,Compostar Technology Co Ltd開始積極尋求市場拓展。公司通過與國內外知名電子品牌建立戰略合作關系,成功將產品打入國際市場。同時,公司還積極參加各類行業展會和技術交流會,與業界同行建立了廣泛的聯系。這些努力不僅為公司帶來了更多的商機,也進一步提升了公司的知名度和影響力。
隨著技術的不斷成熟和產品的日益完善,Exclara開始將目光投向全球市場。公司積極拓展海外市場,通過參加國際展會、與當地合作伙伴建立戰略合作關系等方式,不斷提升品牌知名度和市場份額。同時,公司也在全球范圍內建立了完善的銷售網絡和售后服務體系,以確保客戶能夠享受到優質的產品和服務。
在電子行業這個競爭激烈的領域里,技術的更新換代速度非常快。為了保持領先地位,Exclara高度重視研發投入,不斷引進高端人才和先進設備,加強研發團隊建設。通過持續的研發投入,公司不僅保持了技術的領先地位,還成功開發出了一系列具有自主知識產權的核心技術。
安崴提供低壓差600MA輸出電流的LDO,AP1735做到600MA/350MV, AP6256做到600MA/500MV 需要樣品請聯系13537795709 梁生,QQ 291426765 郵箱:LY158@TOM.COM … 查看全部問答∨ |
|
誰用過FreeScale的i.MX31,ADS1.2中,中斷搞不定啊! 我用FreeScale的i.MX31(ARM11)做嵌入式系統,在WinCE下能使用中斷,但是winCE初始化中斷的代碼是看不到的! 我在ADS1.2中做BootLoader,中斷調不出來!發生中斷時,沒有自動跳轉到中斷向量那里去。 1、CP15中VE(Bit24)置0, V( Bit13)置0,即中斷 ...… 查看全部問答∨ |
大家好,我需要把勝博PC104的兩塊擴展卡添加到系統中,一塊為ADT882,一塊為ADT900,其都有驅動,并且告訴了安裝過程,如下: adt900 安裝步驟 1)、把cdt900.o文件拷貝到$(WIND_BASE)/target/lib/objPENTIUMgnuvx目錄中; 2)、在您的VxWorksW ...… 查看全部問答∨ |
VISTA系統下安裝 Tornado2.0后,運行時總出現 gdb error,是什么原因? 運行Tornado時,總彈出好幾個錯誤的對話框,標題為 gdb error! 內容為:Failed to register COM Server. Error code = ox8002801c 將對話框點掉之后 Tornado 就啟動起來了,運行還算正常,但每次一啟動就出 ...… 查看全部問答∨ |
包括什么ttyS0,console等等,什么都沒有 怎樣修改才能添加呢 另外etc文件夾下也什么文件都沒有,不知怎么一回事 內核是2.6的 謝謝… 查看全部問答∨ |
大家好: 我想知道 TI 的 MSP-FET430UIF 仿真器能不能支持 兩線 BSL 仿真模式? 如果可以能不能把這個方法用于 430F21X1系列的MCU 上.… 查看全部問答∨ |
|
MSP430F5438 是屬于哪個系列的? 手頭有一個正宗的MSP-EXP430F5438 開發板 CPU上印字 X430F5438 在TI CCE軟件中,設備選項名列最后一個,即選擇 XMS430F5438(這是培訓手冊上指導的) 看了一下隨帶光盤資料: 1xx Users Guide,手冊封面寫著 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 高通攜手中國“汽車朋友圈”亮相2025上海車展: 加速駕駛輔助普惠,推動艙駕創新升級
- 工業市場正在快速回暖,德州儀器如何重塑電力電子市場?
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析