精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊聊Linux字節對齊的那些事

系統 Linux
對齊跟數據在內存中的位置有關。如果一個變量的內存地址正好位于它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設一個整型變量的地址為0x00000004,那它就是自然對齊的。

[[415839]]

最近一口君在做一個項目,遇到一個問題,運行于ARM上的threadx在與DSP通信采用消息隊列的方式傳遞消息(最終實現原理是中斷+共享內存的方式),在實際操作過程中發現threadx總是crash,于是經過排查,是因為傳遞消息的結構體沒有考慮字節對齊的問題。

隨手整理一下C語言中字節對齊的問題與大家一起分享。

一、概念

對齊跟數據在內存中的位置有關。如果一個變量的內存地址正好位于它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設一個整型變量的地址為0x00000004,那它就是自然對齊的。

首先了解什么位、字節、字

字長

一個字的位數,現代電腦的字長通常為16,32, 64位。(一般N位系統的字長是N/8字節。)

不同的CPU一次可以處理的數據位數是不同的,32位CPU可以一次處理32位數據,64位CPU可以一次處理64位數據,這里的位,指的就是字長。

而所謂的字長,我們有時會稱為字(word)。在16位的CPU中,一個字剛好為兩個字節,而32位CPU中,一個字是四個字節。若以字為單位,向上還有雙字(兩個字),四字(四個字)。

二、對齊規則

對于標準數據類型,它的地址只要是它的長度的整數倍就行了,而非標準數據類型按下面的原則對齊:   數組 :按照基本數據類型對齊,第一個對齊了后面的自然也就對齊了。聯合 :按其包含的長度最大的數據類型對齊。結構體:結構體中每個數據類型都要對齊。

三、如何限制定字節對齊位數?

1. 缺省

在缺省情況下,C編譯器為每一個變量或是數據單元按其自然對界條件分配空間。一般地,可以通過下面的方法來改變缺省的對界條件:

2. #pragma pack(n)

· 使用偽指令#pragma pack (n),C編譯器將按照n個字節對齊。· 使用偽指令#pragma pack (),取消自定義字節對齊方式。

#pragma pack(n) 用來設定變量以n字節對齊方式。n字節對齊就是說變量存放的起始地址的偏移量有兩種情況:

  1. 如果n大于等于該變量所占用的字節數,那么偏移量必須滿足默認的對齊方式
  2. 如果n小于該變量的類型所占用的字節數,那么偏移量為n的倍數,不用滿足默認的對齊方式。

結構的總大小也有一個約束條件,如果n大于等于所有成員變量類型所占用的字節數,那么結構的總大小必須為占用空間最大的變量占用的空間數的倍數;否則必須是n的倍數。

3. __attribute

另外,還有如下的一種方式:· __attribute((aligned (n))),讓所作用的結構成員對齊在n字節自然邊界上。如果結構中有成員的長度大于n,則按照最大成員的長度來對齊。· attribute ((packed)),取消結構在編譯過程中的優化對齊,按照實際占用字節數進行對齊。

4. 匯編.align

匯編代碼通常用.align來制定字節對齊的位數。

.align:用來指定數據的對齊方式,格式如下:

  1. .align [absexpr1, absexpr2] 

以某種對齊方式,在未使用的存儲區域填充值. 第一個值表示對齊方式,4, 8,16或 32. 第二個表達式值表示填充的值。

四、為什么要對齊?

操作系統并非一個字節一個字節訪問內存,而是按2,4,8這樣的字長來訪問。因此,當CPU從存儲器讀數據到寄存器,IO的數據長度通常是字長。如32位系統訪問粒度是4字節(bytes), 64位系統的是8字節。當被訪問的數據長度為n字節且該數據地址為n字節對齊時,那么操作系統就可以高效地一次定位到數據, 無需多次讀取,處理對齊運算等額外操作。數據結構應該盡可能地在自然邊界上對齊。如果訪問未對齊的內存,CPU需要做兩次內存訪問。

字節對齊可能帶來的隱患:

代碼中關于對齊的隱患,很多是隱式的。比如在強制類型轉換的時候。例如:

  1. unsigned int i = 0x12345678; 
  2. unsigned char *p=NULL
  3. unsigned short *p1=NULL
  4.  
  5. p=&i; 
  6. *p=0x00; 
  7. p1=(unsigned short *)(p+1); 
  8. *p1=0x0000; 

最后兩句代碼,從奇數邊界去訪問unsignedshort型變量,顯然不符合對齊的規定。在x86上,類似的操作只會影響效率,但是在MIPS或者sparc上,可能就是一個error,因為它們要求必須字節對齊.

五、舉例

例1:os基本數據類型占用的字節數

首先查看操作系統的位數

在64位操作系統下查看基本數據類型占用的字節數:

  1. #include <stdio.h> 
  2.  
  3. int main() 
  4.     printf("sizeof(char) = %ld\n", sizeof(char)); 
  5.     printf("sizeof(int) = %ld\n", sizeof(int)); 
  6.     printf("sizeof(float) = %ld\n", sizeof(float)); 
  7.     printf("sizeof(long) = %ld\n", sizeof(long));                                       
  8.     printf("sizeof(long long) = %ld\n", sizeof(long long)); 
  9.     printf("sizeof(double) = %ld\n", sizeof(double)); 
  10.     return 0; 

例2:結構體占用的內存大小--默認規則

考慮下面的結構體占用的位數

  1. struct yikou_s 
  2.     double d; 
  3.     char c; 
  4.     int i; 
  5. } yikou_t; 

執行結果

  1. sizeof(yikou_t) = 16 

在內容中各變量位置關系如下:

其中成員C的位置還受字節序的影響,有的可能在位置8

編譯器給我們進行了內存對齊,各成員變量存放的起始地址相對于結構的起始地址的偏移量必須為該變量類型所占用的字節數的倍數, 且結構的大小為該結構中占用最大空間的類型所占用的字節數的倍數。

對于偏移量:變量type n起始地址相對于結構體起始地址的偏移量必須為sizeof(type(n))的倍數結構體大小:必須為成員最大類型字節的倍數

  1. char: 偏移量必須為sizeof(char) 即1的倍數 
  2. int: 偏移量必須為sizeof(int) 即4的倍數 
  3. float: 偏移量必須為sizeof(float) 即4的倍數 
  4. double: 偏移量必須為sizeof(double) 即8的倍數 

例3:調整結構體大小

我們將結構體中變量的位置做以下調整:

  1. struct yikou_s 
  2.     char c; 
  3.     double d; 
  4.     int i; 
  5. } yikou_t; 

執行結果

  1. sizeof(yikou_t) = 24 

各變量在內存中布局如下:

  • 當結構體中有嵌套符合成員時,復合成員相對于結構體首地址偏移量是復合成員最寬基本類型大小的整數倍。

例4:#pragma pack(4)

  1. #pragma pack(4) 
  2.  
  3. struct yikou_s 
  4.     char c; 
  5.     double d; 
  6.     int i; 
  7. } yikou_t; 
  1. sizeof(yikou_t) = 16 

例5:#pragma pack(8)

  1. #pragma pack(8) 
  2.  
  3. struct yikou_s 
  4.     char c; 
  5.     double d; 
  6.     int i; 
  7. } yikou_t; 
  1. sizeof(yikou_t) = 24 

例6:匯編代碼

舉例:以下是截取的uboot代碼中異常向量irq、fiq的入口位置代碼:

六、匯總實力

有手懶的同學,直接貼一個完整的例子給你們:

  1. #include <stdio.h> 
  2. main() 
  3. struct A { 
  4.     int a; 
  5.     char b; 
  6.     short c; 
  7. }; 
  8.   
  9. struct B { 
  10.     char b; 
  11.     int a; 
  12.     short c; 
  13. }; 
  14. struct AA { 
  15.    // int a; 
  16.     char b; 
  17.     short c; 
  18. }; 
  19.  
  20. struct BB { 
  21.     char b; 
  22.    // int a; 
  23.     short c; 
  24. };  
  25. #pragma pack (2) /*指定按2字節對齊*/ 
  26. struct C { 
  27.     char b; 
  28.     int a; 
  29.     short c; 
  30. }; 
  31. #pragma pack () /*取消指定對齊,恢復缺省對齊*/ 
  32.   
  33.   
  34.   
  35. #pragma pack (1) /*指定按1字節對齊*/ 
  36. struct D { 
  37.     char b; 
  38.     int a; 
  39.     short c; 
  40. }; 
  41. #pragma pack ()/*取消指定對齊,恢復缺省對齊*/ 
  42.   
  43. int s1=sizeof(struct A); 
  44. int s2=sizeof(struct AA); 
  45. int s3=sizeof(struct B); 
  46. int s4=sizeof(struct BB); 
  47. int s5=sizeof(struct C); 
  48. int s6=sizeof(struct D); 
  49. printf("%d\n",s1); 
  50. printf("%d\n",s2); 
  51. printf("%d\n",s3); 
  52. printf("%d\n",s4); 
  53. printf("%d\n",s5); 
  54. printf("%d\n",s6); 

本文轉載自微信公眾號「一口Linux」,可以通過以下二維碼關注。轉載本文請聯系一口Linux公眾號。

 

責任編輯:姜華 來源: 一口Linux
相關推薦

2021-08-30 12:05:46

Linux字節對齊代碼

2021-08-17 11:45:44

LinuxC語言字節

2020-11-30 13:10:39

MySQL安全服務器

2023-07-31 08:21:22

語法校對器Pick

2022-09-09 08:08:28

開源項目服務

2017-05-15 21:50:54

Linux引號

2024-02-21 07:24:21

微服務單體架構MVC

2019-01-07 12:02:02

TCP長連接Java

2017-12-21 08:06:40

2018-04-11 08:54:16

Linux ARM存儲分布

2022-02-15 19:50:18

加載器JAVAJDK

2021-10-26 11:42:51

系統

2024-10-14 12:34:08

2020-10-30 07:43:35

Jenkins配置前端

2014-07-22 10:42:04

2020-05-09 12:16:12

中臺架構工具

2020-07-29 08:14:59

云計算云遷移IT

2011-09-19 15:40:35

2017-09-26 15:27:57

開源TiDB代碼

2014-06-06 16:08:17

初志科技
點贊
收藏

51CTO技術棧公眾號

亚洲一区二区高清| 免费在线看一区| 亚洲国产成人久久综合| 亚洲熟妇av日韩熟妇在线| 国产又粗又猛又爽| 欧美午夜在线| 亚洲精品美女网站| 99精品免费在线观看| 国产区av在线| 久久99国产乱子伦精品免费| 欧美成人自拍视频| 天天躁日日躁狠狠躁av麻豆男男| 僵尸再翻生在线观看| 国产亚洲精品精华液| 国产日韩精品一区二区| 天堂资源在线视频| 国产精品成人3p一区二区三区| 一区二区欧美视频| 欧美精品一区三区在线观看| 在线观看中文字幕2021| 午夜激情一区| 亚洲欧洲黄色网| 尤物网站在线看| 综合久久2019| 91麻豆精东视频| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 亚洲高清免费| 中文字幕不卡在线视频极品| 人妻换人妻仑乱| av成人影院在线| 中文字幕精品三区| 国产精品v欧美精品v日韩| 无码无套少妇毛多18pxxxx| 91精品成人| 日韩精品中文字幕视频在线| 中文字幕在线视频精品| 国产盗摄在线观看| 久久久久久久久99精品| 99re国产视频| 亚洲av人无码激艳猛片服务器| 亚洲欧美亚洲| 亚洲另类xxxx| 日韩精品xxx| 美女网站在线看| 一区二区三区在线观看动漫| 日韩高清国产一区在线观看| 成人激情四射网| 欧美亚洲三区| 久久久久久久97| chinese全程对白| 欧美人妖在线| 亚洲成av人片在线观看香蕉| 日本美女视频一区| 久久久成人av毛片免费观看| 午夜精品久久久久久久99樱桃| www.亚洲一区二区| 91啦中文在线| 国产欧美一区视频| 欧美黑人3p| 五月天福利视频| 成人高清在线视频| 久久精品国产精品国产精品污| 亚洲欧美日韩动漫| 久久影院电视剧免费观看| 蜜桃麻豆www久久国产精品| 手机福利小视频在线播放| 91蜜桃婷婷狠狠久久综合9色| 久久久久国产精品视频| 三级做a全过程在线观看| aaa亚洲精品| 欧美一区二区三区在线免费观看| 男女污污视频在线观看| 国产精品色哟哟| 国产精品一二三在线观看| 牛牛精品在线视频| 懂色av一区二区三区| 久久久久国产精品熟女影院| 日韩毛片一区| 欧美一区日本一区韩国一区| www.啪啪.com| 精品国产欧美日韩| 久热精品视频在线观看| 国产在线观看成人| 久久久精品日韩| 国产精品亚洲аv天堂网| www.蜜臀av.com| 91免费观看视频| 亚洲最新免费视频| 毛片在线导航| 欧美综合一区二区| 亚洲高清av一区二区三区| 欧美色资源站| 国产亚洲精品美女久久久| 69av.com| 日韩专区一卡二卡| 亚洲自拍小视频| 九九热视频在线观看| 自拍偷自拍亚洲精品播放| 国产无限制自拍| 日韩综合av| 亚洲精品720p| 国产美女久久久久久| 国产一区二区精品| 91在线国产电影| 你懂的视频在线| 亚洲一区影音先锋| 亚洲这里只有精品| 欧美顶级毛片在线播放| 久久久精品一区二区| 欧美日韩一二三四区| 国内精品免费**视频| 欧美精品国产精品久久久 | 欧美激情在线有限公司| 最近中文字幕在线观看| aaa亚洲精品| 亚洲色婷婷久久精品av蜜桃| 日韩一区二区三区在线免费观看 | 精品久久久精品| 国产乱叫456| 不卡av一区二区| 欧美一区二区三区免费视| 国产高清第一页| 国产精品久久久久三级| 免费日韩中文字幕| 另类ts人妖一区二区三区| 久久久国产成人精品| 最近国语视频在线观看免费播放| 91香蕉视频在线| 香港三级日本三级a视频| 偷拍自拍亚洲| 中文字幕亚洲综合久久| 无码人妻精品一区二区三区不卡| 成人午夜碰碰视频| 欧美日韩中文字幕在线播放| 成人在线精品| xxxx欧美18另类的高清| 中文天堂在线视频| 久久久精品免费观看| 成人在线免费在线观看| 日韩深夜福利| 91av免费观看91av精品在线| 免费a级片在线观看| 一区二区三区在线视频观看58| 色呦色呦色精品| 日本一区二区在线看| 国产精品99一区| 成人高清网站| 欧美色精品在线视频| 日韩视频在线观看免费视频| 日本最新不卡在线| 四虎影院一区二区三区 | 亚洲午夜精品久久久久久高潮| 久久香蕉精品| 色一情一区二区三区四区| 日本高清不卡一区二区三区视频 | 黄色三级生活片| 日韩精品电影一区亚洲| 日韩电影免费观看在| 亚洲第一会所| 北条麻妃99精品青青久久| 伊人网站在线观看| ...xxx性欧美| 久久久久xxxx| 欧美三级在线| 精品中文字幕一区| 日韩中文影院| 日韩在线观看免费高清| 国产熟女一区二区三区五月婷| 亚洲精品自拍动漫在线| 亚洲天堂2024| 日韩电影免费在线| 在线看成人av电影| 136导航精品福利| 91国内精品久久| www.视频在线.com| 日韩欧美亚洲国产另类| 欧美在线观看网站| 男人女人黄一级| 99热国内精品永久免费观看| 91超碰rencao97精品| 9999精品成人免费毛片在线看 | 色综合久久中文综合久久牛| 黄色三级生活片| 国产精品亚洲视频| 国产精品999视频| 精品久久久久久久| 亚洲自拍小视频免费观看| 天堂中文最新版在线中文| 一区二区三区亚洲| 精品人妻一区二区三区三区四区 | 国产在成人精品线拍偷自揄拍| 亚洲色图一区二区| 黄色性生活一级片| 精品一区二区三区久久久| 青青草国产免费| 日本一区二区高清不卡| 国产亚洲精品自在久久| 青草综合视频| 91av在线免费观看视频| 免费人成在线观看播放视频| 亚洲国产精品悠悠久久琪琪| 亚洲在线免费观看视频| 午夜天堂影视香蕉久久| 国产91在线播放九色| zzijzzij亚洲日本少妇熟睡| 午夜免费看视频| 亚洲永久视频| 国产小视频免费| 狠狠色狠狠色综合婷婷tag| 99久久久久国产精品免费| 日韩欧美一区二区三区在线观看| 九九九久久久久久| 91高清在线| 亚洲欧洲日本专区| 亚洲av无码一区二区乱子伦| 欧美体内she精视频| 在线观看国产亚洲| 亚洲你懂的在线视频| 人妻aⅴ无码一区二区三区| 国产成人免费xxxxxxxx| 美女网站色免费| 久久国产主播| 少妇高潮喷水在线观看| 91精品电影| 正在播放久久| 日韩精品一区二区久久| 久久精品国产美女| 人妻熟人中文字幕一区二区| 国产自产v一区二区三区c| 黑人糟蹋人妻hd中文字幕| 激情欧美日韩一区| 9色视频在线观看| 香蕉久久网站| 亚洲成人a**址| jlzzjlzz亚洲女人| 日本在线成人一区二区| 亚洲永久精品唐人导航网址| 九9re精品视频在线观看re6| 1204国产成人精品视频| 超碰在线97av| 一区二区三区四区高清视频 | 欧美国产日韩中文字幕在线| 国产精品扒开做爽爽爽的视频| 中文字幕精品一区久久久久| 免费动漫网站在线观看| 精品视频久久久| 毛片在线免费| 在线观看视频99| 婷婷免费在线视频| 久久精品久久久久电影| 日本视频在线观看| 久久精品2019中文字幕| 成人福利片网站| 九九精品在线观看| 91av久久| 国产v综合ⅴ日韩v欧美大片 | 亚洲狠狠婷婷综合久久久久图片| av电影在线观看完整版一区二区| 加勒比精品视频| 26uuu精品一区二区在线观看| 免费在线观看污| 国产日韩视频一区二区三区| 性猛交娇小69hd| 亚洲丝袜制服诱惑| 欧美一级高潮片| 精品女厕一区二区三区| 国产区一区二区三| 欧美自拍丝袜亚洲| 国产日韩在线观看一区| 日韩女优视频免费观看| 午夜在线观看视频18| 亚洲欧洲av一区二区| 黄色大片在线播放| 欧美高清无遮挡| 亚洲精品中文字幕| 91色琪琪电影亚洲精品久久| 国产精品三p一区二区| 日本在线观看不卡| 一区二区三区在线电影| 日韩欧美视频网站| 欧美a一区二区| 亚洲妇女无套内射精| 91在线观看一区二区| 亚洲精品天堂网| 亚洲一区二区三区三| 日本免费在线观看视频| 日韩一级在线观看| 色视频在线观看免费| 美女福利视频一区| 国产不卡网站| 91沈先生播放一区二区| 精品国产一区一区二区三亚瑟| 国产精品久久久影院| 先锋影音国产一区| 中文字幕av一区二区三区人妻少妇| 91麻豆国产在线观看| 欧美成人一区二区三区高清| 日韩欧美在线免费| 成人h动漫精品一区二区无码| 亚洲视频在线看| h片精品在线观看| 成人黄色生活片| 一区三区在线欧| 久草视频这里只有精品| 麻豆久久久久久久| 国产精品一级黄片| 又紧又大又爽精品一区二区| 中国女人真人一级毛片| 亚洲精品国产成人| 日本大胆在线观看| 成人精品一区二区三区电影免费| 日韩中出av| 成人免费视频91| 国产一区二区不卡| jizzjizzjizz国产| 在线日韩国产精品| 爽爽视频在线观看| 97国产精品久久| 97久久综合精品久久久综合| 亚洲一区二区三区免费观看| 久久久久欧美精品| 国产激情视频网站| 亚洲综合丝袜美腿| av网站在线免费看| 久久久成人精品| 婷婷久久免费视频| 一区二区国产日产| 日韩va欧美va亚洲va久久| 亚洲黄色免费在线观看| 亚洲成人自拍偷拍| 亚洲男人第一天堂| 欧美高清在线视频观看不卡| 日韩精品视频中文字幕| 黄色免费高清视频| 国模无码大尺度一区二区三区| 中文字幕第二区| 欧美日韩一区在线观看| 成全电影播放在线观看国语| 国产www精品| 国产成人手机高清在线观看网站| 国产一区二区三区精彩视频 | 99成人在线观看| 91久久国产最好的精华液| 五十路在线视频| 欧美做受高潮电影o| 亚洲涩涩av| 亚洲黄色a v| 国产精品视频一二| 国产精品一区二区免费视频| 久久精品视频在线播放| 成人豆花视频| 国产乱子伦精品无码专区| 国产大陆精品国产| 久久精品视频国产| 日韩精品免费在线| 偷拍中文亚洲欧美动漫| 先锋影音网一区| 久久狠狠亚洲综合| 国产av无码专区亚洲av毛网站| 日韩三级在线观看| 欧美另类老肥妇| 欧美综合激情| 狠狠色伊人亚洲综合成人| 欧产日产国产v| 亚洲国产中文字幕久久网| 婷婷综合六月| 桥本有菜av在线| 99热在这里有精品免费| 无码人妻久久一区二区三区| 久久精品福利视频| 伊人久久大香线蕉av超碰| 欧美一级在线看| 亚洲欧洲日韩综合一区二区| 亚洲精品无amm毛片| 欧洲精品在线视频| 91亚洲自偷观看高清| 国产xxx在线观看| 色婷婷亚洲一区二区三区| 国产美女在线观看| 国产日韩欧美一区二区| 日本不卡一区二区| 欧美黄色一级网站| 亚洲视频免费一区| 国内不卡的一区二区三区中文字幕| 国产传媒久久久| 久久九九国产精品| 亚洲AV无码国产精品午夜字幕 | 老司机亚洲精品一区二区| 波多野结衣之无限发射| 中文一区二区在线观看| 丰满少妇被猛烈进入| 国产精品久久久久国产a级| 欧美不卡高清| 亚洲一区视频在线播放| 欧美不卡一区二区三区| 澳门av一区二区三区| 99国产精品白浆在线观看免费| 国产欧美日韩不卡免费| 欧洲精品久久一区二区| 91精品久久久久久久久久久久久|