色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

c語言中的字節對齊

嵌入式應用開發 ? 來源:嵌入式應用開發 ? 作者:嵌入式應用開發 ? 2022-12-30 11:03 ? 次閱讀

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

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

查看源圖像

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

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

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

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

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

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

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

對齊規則為:

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

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

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

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

審核編輯:湯梓紅

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

    關注

    5086

    文章

    19144

    瀏覽量

    306096
  • C語言
    +關注

    關注

    180

    文章

    7608

    瀏覽量

    137111
  • 編譯器
    +關注

    關注

    1

    文章

    1636

    瀏覽量

    49172
  • 編譯
    +關注

    關注

    0

    文章

    659

    瀏覽量

    32903
  • 字節對齊
    +關注

    關注

    0

    文章

    5

    瀏覽量

    1523
收藏 人收藏

    評論

    相關推薦

    C語言進階】面試題:請使用宏定義實現字節對齊

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

    單片機c語言中定義字節怎么定義

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

    請問C語言中能高效方式跟換字節位置嗎?

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

    詳解C語言字節對齊

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

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

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

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

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

    C語言中的關鍵字

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

    總結那么幾個C語言中的“坑”

    總結幾個C語言中的“坑”
    的頭像 發表于 01-16 10:52 ?2596次閱讀

    解析C語言結構體字節如何對齊

    01 默認字節對齊 C語言結構體字節對齊是老生常談的問題了,也是高頻面試題,現在我們來深入研究這
    的頭像 發表于 06-12 17:42 ?3095次閱讀

    C語言中Linux字節對齊的問題

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

    STM32 終極字節對齊解析

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

    C語言 | 內存對齊01 - 什么是內存對齊

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

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

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

    C/C++編譯器的缺省字節對齊方式

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

    C語言中的socket編程基礎

    Socket編程簡介 Socket是一種通信機制,允許程序之間進行通信。在C語言中,socket編程是網絡編程的基礎。通過使用socket,程序可以發送和接收數據,實現不同計算機之間的通信
    的頭像 發表于 11-01 16:51 ?377次閱讀
    主站蜘蛛池模板: 久久深夜视频| 美女逼逼毛茸茸| 国产传媒在线观看| 俄罗斯15一16处交| 国产1000部成人免费视频| 国产精品三级在线观看| 国产三级在线免费观看| 国语自产一区第二页| 精品日韩二区三区精品视频| 久久中文字幕人妻AV熟女| 欧美国产成人在线| 神马电影我不卡4k手机在线观看| 网红刘婷hd国产高清| 亚洲三级视频在线观看| 123成人站| 岛国大片在线观看完整版| 国产婷婷色综合AV蜜臀AV| 久久99精国产一区二区三区四区| 久久综合香蕉久久久久久久| 青柠在线观看视频在线高清完整| 无码AV精品一区二区三区| 伊人久久综合影院首页| hdsex老太婆70| 国产精品路线1路线2路线| 久草在在线免视频在线观看| 欧美一级情欲片在线| 同时和两老师双飞| 在线A亚洲老鸭窝天堂AV高清| www黄色com| 国产看黄网站又黄又爽又色| 久久亚洲精品成人综合| 人禽l交视频在线播放 视频| 性绞姿始动作动态图| 中文字幕AV亚洲精品影视| jizz非洲| 黑人 尺寸 强行害怕 痛哭| 男男女女爽爽爽视频免费| 无套内射CHINESEHD熟女| 中国bdsmchinesehd| 古代荡女丫鬟高H辣文纯肉| 精品国产高清自在线看|