1. 對齊的目的是什么?
- 提供訪問效率---放大對齊
- 壓縮存儲空間---緊湊對齊
2. 對齊的類型有哪些?
- 自然對齊 :結(jié)構(gòu)體默認按最大基礎(chǔ)類型成員的大小對齊(比如最大成員是
int(4字節(jié)),就按 4 字節(jié)對齊); - 強制對齊 :用
__attribute__((aligned(n)))(GCC/Clang)或#pragma pack(n)(MSVC/GCC)指定對齊值n(必須是 2 的冪:1/2/4/8/16...)。
3. 對齊的規(guī)則是什么?
- 使用packed 或 #pragma pack(n) 時,
影響結(jié)構(gòu)體對齊、大小和成員對齊。結(jié)構(gòu)體每個成員必須按自身大小和強制對齊值中的較小值對齊; - 使用aligned(n) 時,
只影響結(jié)構(gòu)體對齊和大小,不影響成員對齊; - 使用aligned(n) 時,結(jié)構(gòu)體總大小必須是 max(最大成員對齊,aligned(n)) 的整數(shù)倍(不足則填充字節(jié));
- 使用aligned(n) 時,結(jié)構(gòu)體對齊取 max(最大成員對齊,aligned(n)) 。
struct Test1 {
char a; // 按min(1, 1)=1對齊,起始地址0
short b; // 按min(2,1)=1對齊,起始地址1
int c; // 按min(4,1)=1對齊,起始地址3
} __attribute__((packed));
// Test1的起始地址對齊1字節(jié), 比如0,1,2...
// Test1的總大小是1的整數(shù)倍,等于7
struct Test2 {
char a; // 按min(1, 8)=1對齊,起始地址0
short b; // 按min(2,8)=2對齊,起始地址2
int c; // 按min(4,8)=4對齊,起始地址4
} __attribute__((aligned(8)));
// Test2的起始地址對齊max(4,8)=8字節(jié),比如0,8,16...
// Test2的總大小是8的整數(shù)倍,等于8
4. 對齊的方法有哪些?
| 指令 | 作用 | 適用場景 |
|---|---|---|
__attribute__((aligned(n))) | 放大對齊 (不能小于自然對齊) | 緩存對齊、硬件要求 |
__attribute__((packed)) | 縮小對齊 (1 字節(jié)緊湊) | 網(wǎng)絡(luò)協(xié)議、節(jié)省內(nèi)存 |
#pragma pack(n) | 全局修改對齊規(guī)則 | 跨編譯器兼容(MSVC/GCC) |
5. 使用typedef定義的結(jié)構(gòu)體類型如何對齊?
typedef struct {
char a;
int b;
} __attribute__((packed)) TestType; // ? 正確:放在結(jié)構(gòu)體末尾
6. typedef結(jié)構(gòu)體類型定義的變量也會保持對齊嗎?
- 是的
// 1. typedef + packed:定義“緊湊對齊的結(jié)構(gòu)體類型”
typedef struct {
char a; // 1
int b; // 4
} __attribute__((packed)) MyType;
// 2. 用這個別名定義變量
MyType data;
// 結(jié)果:
// sizeof(MyType) = 5 字節(jié)(1+4,無填充)
// data 這個變量,內(nèi)存布局也是緊湊無填充的
7. __attribute__((aligned(n)))對數(shù)組的影響
- 影響數(shù)組的起始地址對齊和 總大小 ,不影響數(shù)組元素對齊。
審核編輯 黃宇
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
C語言
+關(guān)注
關(guān)注
183文章
7648瀏覽量
146226
發(fā)布評論請先 登錄
相關(guān)推薦
熱點推薦
如何使用 powerquad 加速器中的一些功能以及 CMSIS 原始實現(xiàn)中的一些功能?
)。
如何使用 powerquad 加速器中的一些功能以及 CMSIS 原始實現(xiàn)中的一些功能。
Example: I do not want to call arm_mat_trans_q15 powerquad
發(fā)表于 04-03 06:37
爬壁機器人磁鐵的一些常見問題
爬壁機器人近幾年比較火,它是一類能夠在垂直墻面、天花板、傾斜表面上移動和作業(yè)的特種機器人,今天我們不聊其它,只聊下關(guān)于磁吸附應(yīng)用中的磁鐵,以下是小編整理的關(guān)于爬壁機器人中磁鐵的一些常見
汽車網(wǎng)絡(luò)安全開發(fā)語言選型指南:C/C++/Rust/Java等主流語言對比+Perforce QAC/Klocwork工具支持
汽車網(wǎng)絡(luò)安全如何選編程語言?C、C++、Rust、Java……誰更適合AUTOSAR、ISO/SAE 21434?一文了解8種主流語言的優(yōu)劣
C語言中一些令人震驚的結(jié)構(gòu)介紹
C語言同意一些令人震驚的結(jié)構(gòu),下面的結(jié)構(gòu)是合法的嗎,如果是它做些什么?
int a = 5, b = 7, c;
c = a+++b;
發(fā)表于 12-23 08:15
關(guān)于六類網(wǎng)線一些問題的解答
今天我們就圍繞網(wǎng)友一些常見的關(guān)于六類網(wǎng)線的問題進行一下匯總式解答: 問 六類網(wǎng)線可以當電源用嗎? 答 六類網(wǎng)線并不是設(shè)計用于傳輸電力的電纜,因此一般不建議將其用于電源傳輸。 盡管六類網(wǎng)
為什么單片機還在用C語言編程?
,只是C語言是最適合單片機編程的高級語言。
一、單片機編程的特點
1.對單片機編程來說,我們首先要考慮的是單片機的程序空間和數(shù)據(jù)空間都是有限的,所以我們在編寫程序時要盡量做到讓程
發(fā)表于 11-28 07:37
C語言的編程技巧
一個成員是一個未知大小的數(shù)組,適用于動態(tài)分配內(nèi)存并關(guān)聯(lián)一個可變長度的數(shù)組。?
?3、匿名結(jié)構(gòu)體和聯(lián)合體?:C語言允許在結(jié)構(gòu)體或聯(lián)合體中定義不
發(fā)表于 11-27 06:46
寫好C程序的大要點
中解決類似問題時所使用的寫法,《C程序設(shè)計語言》一書中有許多極好的程序?qū)嵗?。在這里有一個關(guān)于程序模式的相關(guān)網(wǎng)頁,里面也列出了
發(fā)表于 11-24 08:23
C語言特性
1、高效性:直接操作硬件
C 語言代碼的執(zhí)行效率極高,這是其最為顯著的優(yōu)勢之一。它能夠直接訪問硬件資源,與底層硬件進行緊密交互,充分發(fā)揮硬件的性能潛力。在嵌入式開發(fā)中,硬件資源往往十分有限,對程序
發(fā)表于 11-24 07:01
貼片電容精度J±5%的一些詳細知識
貼片電容精度J±5%表示電容的實際值與標稱值之間的偏差范圍在±5%以內(nèi) ,以下是關(guān)于貼片電容精度J±5%的一些詳細知識: 一、精度等級含義 J±5% :字母“J”在貼片電容的標識中通常表示標稱精度
摩爾線程新一代大語言模型對齊框架URPO入選AAAI 2026
近日,摩爾線程在人工智能前沿領(lǐng)域取得重要突破,其提出的新一代大語言模型對齊框架——URPO統(tǒng)一獎勵與策略優(yōu)化,相關(guān)研究論文已被人工智能領(lǐng)域的國際頂級學(xué)術(shù)會議AAAI 2026收錄。這
蜂鳥E203的浮點指令集F的一些實現(xiàn)細節(jié)
周期。
總結(jié)
本文介紹的內(nèi)容是為了完成基礎(chǔ)功能:對蜂鳥E203 RISC-V內(nèi)核的微架構(gòu)實現(xiàn)進行一定優(yōu)化,在添加F拓展的過程中的一些記錄。
發(fā)表于 10-24 08:57
CICC2033:關(guān)于C語言仿真的一些說明
C語言運行說明
操作說明(以helloworld為例)
1、在SDK環(huán)境下寫好C語言相關(guān)代碼。
最簡單的寫法為根據(jù)已有demo進行更改。如果說需要重新創(chuàng)建新的SDK項目,具體寫法
發(fā)表于 10-21 14:18
關(guān)于芯片設(shè)計的一些基本知識
芯片的設(shè)計理念眾所周知,芯片擁有極為復(fù)雜的結(jié)構(gòu)。以英偉達的B200芯片為例,在巴掌大的面積上,塞入了2080億個晶體管。里面的布局,堪稱一個異次元空間級的迷宮。英偉達B200芯片如此復(fù)雜的架構(gòu)
關(guān)于C語言對齊的一些總結(jié)
評論