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

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

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

c語言中的字節(jié)對(duì)齊

嵌入式應(yīng)用開發(fā) ? 來源:嵌入式應(yīng)用開發(fā) ? 作者:嵌入式應(yīng)用開發(fā) ? 2022-12-30 11:03 ? 次閱讀

在缺省情況下,C編譯器為每一個(gè)變量或是數(shù)據(jù)單元按其自然對(duì)界條件分配空間。

在結(jié)構(gòu)中,編譯器為結(jié)構(gòu)的每個(gè)成員按其自然對(duì)界(alignment)條件分配空間。各個(gè)成員按照它們被聲明的順序在內(nèi)存中順序存儲(chǔ)(成員之間可能有插入的空字節(jié)),第一個(gè)成員的地址和整個(gè)結(jié)構(gòu)的地址相同。

查看源圖像

C編譯器缺省的結(jié)構(gòu)成員自然對(duì)界條件為“N字節(jié)對(duì)齊”,N即該成員數(shù)據(jù)類型的長度。如int型成員的自然對(duì)界條件為4字節(jié)對(duì)齊,而double類型的結(jié)構(gòu)成員的自然對(duì)界條件為8字節(jié)對(duì)齊。若該成員的起始偏移不位于該成員的“默認(rèn)自然對(duì)界條件”上,則在前一個(gè)節(jié)面后面添加適當(dāng)個(gè)數(shù)的空字節(jié)。

C編譯器缺省的結(jié)構(gòu)整體的自然對(duì)界條件為:該結(jié)構(gòu)所有成員中要求的最大自然對(duì)界條件。若結(jié)構(gòu)體各成員長度之和不為“結(jié)構(gòu)整體自然對(duì)界條件的整數(shù)倍,則在最后一個(gè)成員后填充空字節(jié)。

struct Test
{ 
char x1; // 成員x1為char型(其起始地址必須1字節(jié)對(duì)界),其偏移地址為0
char x2; // 成員x2為char型(其起始地址必須1字節(jié)對(duì)界,其偏移地址為1
float x3; // 成員x3為float型(其起始地址必須4字節(jié)對(duì)界),編譯器在x2和x3之間填充了兩個(gè)空字節(jié),其偏移地址為4
char x4; // 成員x4為char型(其起始地址必須1字節(jié)對(duì)界),其偏移地址為8
};

因?yàn)門est結(jié)構(gòu)體中,最大的成員為flaot x3,因些此結(jié)構(gòu)體的自然對(duì)界條件為4字節(jié)對(duì)齊。則結(jié)構(gòu)體長度就為12字節(jié),內(nèi)存布局為1100 1111 1000。

#include //#pragma pack(2)typedef struct
{
  int aa1; //4個(gè)字節(jié)對(duì)齊 1111  char bb1;//1個(gè)字節(jié)對(duì)齊 1  short cc1;//2個(gè)字節(jié)對(duì)齊 011  char dd1; //1個(gè)字節(jié)對(duì)齊 1  } testlength1;
int length1 = sizeof(testlength1); //4個(gè)字節(jié)對(duì)齊,占用字節(jié)1111 1011 1000,length = 12
typedef struct
{
  char bb2;//1個(gè)字節(jié)對(duì)齊 1  int aa2; //4個(gè)字節(jié)對(duì)齊 01111  short cc2;//2個(gè)字節(jié)對(duì)齊 11  char dd2; //1個(gè)字節(jié)對(duì)齊 1  } testlength2;
int length2 = sizeof(testlength2); //4個(gè)字節(jié)對(duì)齊,占用字節(jié)1011  1111 1000,length = 12

typedef struct
{
  char bb3; //1個(gè)字節(jié)對(duì)齊 1  char dd3; //1個(gè)字節(jié)對(duì)齊 1  int aa3; //4個(gè)字節(jié)對(duì)齊 001111  short cc23//2個(gè)字節(jié)對(duì)齊 11
  } testlength3;
int length3 = sizeof(testlength3); //4個(gè)字節(jié)對(duì)齊,占用字節(jié)1100 1111 1100,length = 12

typedef struct
{
  char bb4; //1個(gè)字節(jié)對(duì)齊 1  char dd4; //1個(gè)字節(jié)對(duì)齊 1  short cc4;//2個(gè)字節(jié)對(duì)齊 11  int aa4; //4個(gè)字節(jié)對(duì)齊 1111  } testlength4;
int length4 = sizeof(testlength4); //4個(gè)字節(jié)對(duì)齊,占用字節(jié)1111 1111,length = 8int main(void)
{
  printf("length1 = %d.n",length1);
  printf("length2 = %d.n",length2);
  printf("length3 = %d.n",length3);
  printf("length4 = %d.n",length4);
  return 0;
}

對(duì)齊規(guī)則為:

1、數(shù)據(jù)成員對(duì)齊規(guī)則:結(jié)構(gòu)(struct)(或聯(lián)合(union))的數(shù)據(jù)成員,第一個(gè)數(shù)據(jù)成員放在offset為0的地方,以后每個(gè)數(shù)據(jù)成員的對(duì)齊按照#pragma pack指定的數(shù)值和這個(gè)數(shù)據(jù)成員自身長度中,比較小的那個(gè)進(jìn)行。

2、結(jié)構(gòu)(或聯(lián)合)的整體對(duì)齊規(guī)則:在數(shù)據(jù)成員完成各自對(duì)齊之后,結(jié)構(gòu)(或聯(lián)合)本身也要進(jìn)行對(duì)齊,對(duì)齊將按照#pragma pack指定的數(shù)值和結(jié)構(gòu)(或聯(lián)合)最大數(shù)據(jù)成員長度中,比較小的那個(gè)進(jìn)行。

結(jié)合1、2推斷:當(dāng)#pragma pack的n值等于或超過所有數(shù)據(jù)成員長度的時(shí)候,這個(gè)n值的大小將不產(chǎn)生任何效果。

因此,當(dāng)使用偽指令#pragma pack (2)時(shí),Test結(jié)構(gòu)體的大小為8,內(nèi)存布局為11 11 11 10。

審核編輯:湯梓紅

聲明:本文內(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)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5059

    文章

    18973

    瀏覽量

    302044
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7594

    瀏覽量

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

    關(guān)注

    1

    文章

    1617

    瀏覽量

    49015
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    648

    瀏覽量

    32775
  • 字節(jié)對(duì)齊
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    1507
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語言進(jìn)階】面試題:請(qǐng)使用宏定義實(shí)現(xiàn)字節(jié)對(duì)齊

    C語言進(jìn)階】面試題:請(qǐng)使用宏定義實(shí)現(xiàn)字節(jié)對(duì)齊
    的頭像 發(fā)表于 07-11 09:21 ?2701次閱讀
    【<b class='flag-5'>C</b><b class='flag-5'>語言</b>進(jìn)階】面試題:請(qǐng)使用宏定義實(shí)現(xiàn)<b class='flag-5'>字節(jié)</b><b class='flag-5'>對(duì)齊</b>

    單片機(jī)c語言中定義字節(jié)怎么定義

    定義位可以用***it但是定義字節(jié)呢?還有就是比如匯編中的DPTR的DPH和DPL在c語言中怎樣定義的呢?
    發(fā)表于 02-23 14:50

    請(qǐng)問C語言中能高效方式跟換字節(jié)位置嗎?

    C語言中有沒有一種高效方式跟換字節(jié)中的BIT位置,如:76543210更換成自己想要的規(guī)格如:45670123或者46570213等等。
    發(fā)表于 03-06 04:35

    詳解C語言字節(jié)對(duì)齊

      一、什么是對(duì)齊,以及為什么要對(duì)齊:   1. 現(xiàn)代計(jì)算機(jī)中內(nèi)存空間都是按照byte劃分的,從理論上講似乎對(duì)任何類型的變量的訪問可以從任何地址開始,但實(shí)際情況是
    發(fā)表于 08-29 10:11 ?1239次閱讀

    C語言中指針的介紹非常詳細(xì)

    C語言中指針的介紹非常詳細(xì) C語言中指針的介紹非常詳細(xì)
    發(fā)表于 12-25 10:39 ?57次下載

    C語言和匯編語言混合編程方法和C語言中斷處理方法

    C語言和匯編語言混合編程方法和C語言中斷處理方法,new
    發(fā)表于 01-06 14:36 ?36次下載

    C語言中的關(guān)鍵字

    C語言中的入門教程
    發(fā)表于 10-14 16:24 ?3次下載

    總結(jié)那么幾個(gè)C語言中的“坑”

    總結(jié)幾個(gè)C語言中的“坑”
    的頭像 發(fā)表于 01-16 10:52 ?2535次閱讀

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

    01 默認(rèn)字節(jié)對(duì)齊 C語言結(jié)構(gòu)體字節(jié)對(duì)齊是老生常談的問題了,也是高頻面試題,現(xiàn)在我們來深入研究這
    的頭像 發(fā)表于 06-12 17:42 ?3023次閱讀

    C語言中Linux字節(jié)對(duì)齊的問題

    ,于是經(jīng)過排查,是因?yàn)閭鬟f消息的結(jié)構(gòu)體沒有考慮字節(jié)對(duì)齊的問題。 隨手整理一下C語言中字節(jié)對(duì)齊的問
    的頭像 發(fā)表于 08-16 11:25 ?2421次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>Linux<b class='flag-5'>字節(jié)</b><b class='flag-5'>對(duì)齊</b>的問題

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

    一、全局變量對(duì)齊問題:基本上用戶定義的變量是幾個(gè)字節(jié)就是幾字節(jié)對(duì)齊,這個(gè)比較好理解。uint8_t定義變量地址要1字節(jié)
    發(fā)表于 11-23 18:06 ?11次下載
    STM32 終極<b class='flag-5'>字節(jié)</b><b class='flag-5'>對(duì)齊</b>解析

    C語言 | 內(nèi)存對(duì)齊01 - 什么是內(nèi)存對(duì)齊

    一、前言在單片機(jī)下使用C語言編程時(shí),內(nèi)存對(duì)齊的知識(shí)點(diǎn)必須掌握。掌握內(nèi)存對(duì)齊后,可以防止內(nèi)存碎片化,單片機(jī)有限的內(nèi)存被更加有效地使用。二、內(nèi)存對(duì)齊
    發(fā)表于 01-13 15:18 ?0次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b> | 內(nèi)存<b class='flag-5'>對(duì)齊</b>01 - 什么是內(nèi)存<b class='flag-5'>對(duì)齊</b>

    c#語言中怎么使用HTTP代理

    c#語言中怎么使用HTTP代理。
    的頭像 發(fā)表于 09-01 14:46 ?2098次閱讀

    C/C++編譯器的缺省字節(jié)對(duì)齊方式

    C/C++編譯器的缺省字節(jié)對(duì)齊方式為自然對(duì)界。即在缺省情況下,編譯器為每一個(gè)變量或是數(shù)據(jù)單元按其自然對(duì)界條件分配空間。
    的頭像 發(fā)表于 04-15 11:24 ?940次閱讀

    C語言中的socket編程基礎(chǔ)

    Socket編程簡(jiǎn)介 Socket是一種通信機(jī)制,允許程序之間進(jìn)行通信。在C語言中,socket編程是網(wǎng)絡(luò)編程的基礎(chǔ)。通過使用socket,程序可以發(fā)送和接收數(shù)據(jù),實(shí)現(xiàn)不同計(jì)算機(jī)之間的通信
    的頭像 發(fā)表于 11-01 16:51 ?203次閱讀