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