日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

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

嵌入式應用開發(fā) ? 來源:嵌入式應用開發(fā) ? 作者:嵌入式應用開發(fā) ? 2022-12-30 11:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

查看源圖像

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

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

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

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

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

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

typedef struct
{
  char bb4; //1個字節(jié)對齊 1  char dd4; //1個字節(jié)對齊 1  short cc4;//2個字節(jié)對齊 11  int aa4; //4個字節(jié)對齊 1111  } testlength4;
int length4 = sizeof(testlength4); //4個字節(jié)對齊,占用字節(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;
}

對齊規(guī)則為:

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

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

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

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

審核編輯:湯梓紅

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

    關(guān)注

    5210

    文章

    20680

    瀏覽量

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

    關(guān)注

    183

    文章

    7646

    瀏覽量

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

    關(guān)注

    1

    文章

    1673

    瀏覽量

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

    關(guān)注

    0

    文章

    696

    瀏覽量

    35296
  • 字節(jié)對齊
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    1613
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    C語言進階】面試題:請使用宏定義實現(xiàn)字節(jié)對齊

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

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

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

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

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

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

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

    C語言中指針的介紹非常詳細

    C語言中指針的介紹非常詳細 C語言中指針的介紹非常詳細
    發(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é)那么幾個C語言中的“坑”

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Socket編程簡介 Socket是一種通信機制,允許程序之間進行通信。在C語言中,socket編程是網(wǎng)絡(luò)編程的基礎(chǔ)。通過使用socket,程序可以發(fā)送和接收數(shù)據(jù),實現(xiàn)不同計算機之間的通信
    的頭像 發(fā)表于 11-01 16:51 ?2334次閱讀
    白山市| 麦盖提县| 鄱阳县| 额济纳旗| 平原县| 舒城县| 元氏县| 台南市| 文昌市| 北宁市| 内江市| 同江市| 南岸区| 永清县| 德格县| 寻甸| 徐汇区| 三亚市| 哈密市| 濉溪县| 壤塘县| 绿春县| 玉田县| 卢湾区| 鄢陵县| 阳江市| 墨脱县| 博湖县| 交城县| 庄河市| 浮山县| 盐城市| 禹城市| 始兴县| 平果县| 宝清县| 信宜市| 格尔木市| 定西市| 桑植县| 大石桥市|