0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

keil arm工程中結(jié)構(gòu)體1字節(jié)對(duì)齊如何實(shí)現(xiàn)

科技綠洲 ? 來(lái)源:網(wǎng)絡(luò)整理 ? 作者:網(wǎng)絡(luò)整理 ? 2024-01-05 14:40 ? 次閱讀

Keil Arm工程中,結(jié)構(gòu)體的對(duì)齊方式可以通過(guò)使用特定的編譯器指令或者關(guān)鍵字來(lái)實(shí)現(xiàn)。結(jié)構(gòu)體的對(duì)齊方式會(huì)直接影響結(jié)構(gòu)體變量在內(nèi)存中的布局和對(duì)齊邊界,從而對(duì)程序的性能和存儲(chǔ)空間占用產(chǎn)生影響。

  1. 結(jié)構(gòu)體的默認(rèn)對(duì)齊方式和規(guī)則
    結(jié)構(gòu)體在Keil Arm工程中的默認(rèn)對(duì)齊方式是根據(jù)編譯器或者編譯器選項(xiàng)來(lái)定的。通常情況下,編譯器會(huì)按照平臺(tái)的特定對(duì)齊方式對(duì)結(jié)構(gòu)體進(jìn)行對(duì)齊,這樣可以提高內(nèi)存訪問(wèn)速度。在Keil Arm工程中,一般使用的是4字節(jié)對(duì)齊方式,也就是結(jié)構(gòu)體變量的起始地址必須是4的倍數(shù)。

例如,考慮以下定義的結(jié)構(gòu)體:

struct MyStruct {
int a;
char b;
short c;
};

根據(jù)默認(rèn)的4字節(jié)對(duì)齊規(guī)則,a的地址是0,b的地址是4,c的地址是8。這樣,結(jié)構(gòu)體的大小為12字節(jié)。

  1. 使用編譯器指令設(shè)置結(jié)構(gòu)體的對(duì)齊方式
    在Keil Arm工程中,可以使用編譯器指令來(lái)設(shè)置結(jié)構(gòu)體的對(duì)齊方式。常用的編譯器指令有#pragma pack(n)和__attribute__((packed))。這些編譯器指令可以用來(lái)設(shè)置結(jié)構(gòu)體的對(duì)齊邊界。

a. #pragma pack(n)
使用#pragma pack(n)指令可以將結(jié)構(gòu)體的對(duì)齊方式設(shè)置為n字節(jié)對(duì)齊。例如,如果需要將結(jié)構(gòu)體設(shè)置為1字節(jié)對(duì)齊,可以使用以下指令:

#pragma pack(1)
struct MyStruct {
int a;
char b;
short c;
};

這樣,結(jié)構(gòu)體的大小為7字節(jié),a的地址是0,b的地址是4,c的地址是5。

b. attribute ((packed))
使用__attribute__((packed))屬性也可以將結(jié)構(gòu)體的對(duì)齊方式設(shè)置為1字節(jié)對(duì)齊。例如:

struct MyStruct {
int a;
char b;
short c;
} __attribute__((packed));

這樣,結(jié)構(gòu)體的大小為7字節(jié),a的地址是0,b的地址是4,c的地址是5。

需要注意的是,使用這些編譯器指令會(huì)破壞默認(rèn)的對(duì)齊方式,可能導(dǎo)致內(nèi)存訪問(wèn)速度下降或者有潛在的錯(cuò)誤。

  1. 對(duì)齊方式的影響
    結(jié)構(gòu)體的對(duì)齊方式會(huì)直接影響內(nèi)存的布局和訪問(wèn)速度。使用更小的對(duì)齊邊界可以減小內(nèi)存占用,但也可能導(dǎo)致訪問(wèn)內(nèi)存的效率下降。在Keil Arm工程中,使用1字節(jié)對(duì)齊可能會(huì)導(dǎo)致額外的內(nèi)存操作,從而影響程序的性能。因此,調(diào)整結(jié)構(gòu)體的對(duì)齊方式需要謹(jǐn)慎考慮。
  2. 最佳實(shí)踐
    在Keil Arm工程中,為了獲取最佳的性能和存儲(chǔ)效率,可以采用以下幾個(gè)最佳實(shí)踐。

a. 對(duì)于需要按照字節(jié)進(jìn)行訪問(wèn)的結(jié)構(gòu)體成員,將其定義為字符類型,避免對(duì)齊帶來(lái)的性能損失。

struct MyStruct {
char a; // 1字節(jié)對(duì)齊
};

b. 對(duì)于多字節(jié)類型的成員,按照默認(rèn)的對(duì)齊方式進(jìn)行定義,避免額外的訪問(wèn)操作。

struct MyStruct {
int a; // 默認(rèn)對(duì)齊方式
};

c. 如果需要改變結(jié)構(gòu)體的對(duì)齊方式,根據(jù)實(shí)際需求來(lái)使用#pragma pack(n)或者_(dá)_attribute__((packed))指令。但是,需要謹(jǐn)慎權(quán)衡性能和存儲(chǔ)效率的權(quán)衡。

通過(guò)以上的介紹,你應(yīng)該有一個(gè)清晰的了解關(guān)于在Keil Arm工程中如何實(shí)現(xiàn)結(jié)構(gòu)體1字節(jié)對(duì)齊的方法,并且你可以根據(jù)實(shí)際情況靈活使用它。在選擇結(jié)構(gòu)體對(duì)齊方式時(shí),需要根據(jù)程序的性能要求和存儲(chǔ)要求來(lái)綜合考慮,以獲得最佳的性能和存儲(chǔ)效率。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 程序
    +關(guān)注

    關(guān)注

    115

    文章

    3720

    瀏覽量

    80361
  • 字符
    +關(guān)注

    關(guān)注

    0

    文章

    230

    瀏覽量

    25108
  • keil
    +關(guān)注

    關(guān)注

    68

    文章

    1207

    瀏覽量

    166182
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1602

    瀏覽量

    48896
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    AAPCS規(guī)則要求堆棧保持8字節(jié)對(duì)齊(轉(zhuǎn))

    的STKALIGN置位,來(lái)保證中斷的棧8字節(jié)對(duì)齊,具體實(shí)現(xiàn)過(guò)程如下:當(dāng)發(fā)生中斷時(shí)由硬件自動(dòng)檢測(cè)MSP是否8字節(jié)
    發(fā)表于 01-19 11:43

    C語(yǔ)言-結(jié)構(gòu)對(duì)齊詳解

    4字節(jié)對(duì)齊處存放,結(jié)構(gòu)對(duì)齊后的大小必須4的倍數(shù),如果編譯器設(shè)置為8字節(jié)
    發(fā)表于 07-12 16:41

    請(qǐng)問(wèn)IAR如何設(shè)置按1字節(jié)對(duì)齊

    本帖最后由 一只耳朵怪 于 2018-6-6 15:26 編輯 如題,求問(wèn)大家,IAR如何設(shè)置按1字節(jié)對(duì)齊?
    發(fā)表于 06-06 02:22

    請(qǐng)問(wèn)z-stack結(jié)構(gòu)默認(rèn)對(duì)齊方式是一字節(jié)嗎?

    z-stack的結(jié)構(gòu)默認(rèn)對(duì)齊方式是一字節(jié)嗎?在z-stack可以將一般指針強(qiáng)制轉(zhuǎn)換為結(jié)構(gòu)
    發(fā)表于 08-18 07:38

    請(qǐng)問(wèn)F28335字節(jié)對(duì)齊能不能改為1字節(jié)?

    大家好,C2000成員TMS320F28335在CCS3.3下是2字節(jié)對(duì)齊的,能不能改為1字節(jié)對(duì)齊?怎么改呢?再者,有沒有在F28335下成
    發(fā)表于 08-20 06:41

    為什么MMU實(shí)驗(yàn)不是4字節(jié)對(duì)齊?

    是4B的一級(jí)描述符,圖上寫錯(cuò)了,抱歉這個(gè)是韋老師MMU實(shí)驗(yàn)的C語(yǔ)言源碼,可以正常使用,但是問(wèn)題來(lái)了,4B的描述符地址的[1:0]位應(yīng)該是00啊,也就是4字節(jié)對(duì)齊啊,可是這里明顯不是4字節(jié)
    發(fā)表于 08-05 03:26

    align為什么要8字節(jié)對(duì)齊?

    我知道數(shù)據(jù)儲(chǔ)存的起始地址%對(duì)齊字節(jié)(N)=0才行,但是我不明白有兩點(diǎn)問(wèn)題1:UCOSIII的系統(tǒng)的浮點(diǎn)數(shù)打印任務(wù)的堆棧大小要8字節(jié)
    發(fā)表于 04-23 00:21

    使用的開發(fā)環(huán)境為MAPLAB X IDE 1字節(jié)對(duì)齊實(shí)現(xiàn)

    使用的開發(fā)環(huán)境為MAPLAB X IDE 1字節(jié)對(duì)齊實(shí)現(xiàn)如下#pragma pack(1)typedef union{uint8_t bu
    發(fā)表于 11-24 06:21

    STM32終極字節(jié)對(duì)齊的相關(guān)資料推薦

    字節(jié)對(duì)齊。uint64_t定義變量地址要8字節(jié)對(duì)齊。指針變量是4字節(jié)對(duì)齊。二、
    發(fā)表于 12-06 06:03

    keil MDK中程序讀寫結(jié)構(gòu)成員進(jìn)入HARDFAUL HANDLE RET為什么無(wú)法讀寫?

    ]; ~ ~ DX[18]; Y[18]; }eedata; #pragma pack(pop)//恢復(fù)對(duì)齊狀態(tài) 這里keilshort int 占兩字節(jié) float占四
    發(fā)表于 08-25 07:58

    基于ARM程序的字節(jié)對(duì)齊的分析

    任意值。如果一個(gè)數(shù)據(jù)是以能被4 整除的地址開始的連續(xù)存儲(chǔ),那么它就是對(duì)齊,否則就是非對(duì)齊。舉例說(shuō)明四字節(jié)
    發(fā)表于 09-19 16:04 ?0次下載

    解析C語(yǔ)言結(jié)構(gòu)字節(jié)如何對(duì)齊

    我們不使用宏#pragma pack,采用默認(rèn)字節(jié)對(duì)齊方式。 先拋出結(jié)論: 在一個(gè)結(jié)構(gòu)第一個(gè)成員變量放在偏移為0的位置,以后的變量都存儲(chǔ)
    的頭像 發(fā)表于 06-12 17:42 ?2971次閱讀

    STM32 終極字節(jié)對(duì)齊解析

    字節(jié)對(duì)齊。uint64_t定義變量地址要8字節(jié)對(duì)齊。指針變量是4字節(jié)對(duì)齊。二、
    發(fā)表于 11-23 18:06 ?11次下載
    STM32 終極<b class='flag-5'>字節(jié)</b><b class='flag-5'>對(duì)齊</b>解析

    什么是結(jié)構(gòu)字節(jié)對(duì)齊現(xiàn)象

    什么是結(jié)構(gòu)字節(jié)對(duì)齊現(xiàn)象 程序員,咱都用代碼說(shuō)話,先上 code: (說(shuō)明:以下代碼均在 ARM 平臺(tái)上,使用
    的頭像 發(fā)表于 11-20 15:55 ?459次閱讀
    什么是<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>的<b class='flag-5'>字節(jié)</b><b class='flag-5'>對(duì)齊</b>現(xiàn)象

    嵌套的結(jié)構(gòu) 字節(jié)是如何對(duì)齊

    嵌套的結(jié)構(gòu),字節(jié)又是如何對(duì)齊的呢 先來(lái)看下面的代碼 typedef struct stu1 { char ary [ 5 ] ; int
    的頭像 發(fā)表于 11-20 16:01 ?428次閱讀
    嵌套的<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b> <b class='flag-5'>字節(jié)</b>是如何<b class='flag-5'>對(duì)齊</b>的