亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

淺談C語言的字節對齊 #pragma pack(n)2

2020-01-26 14:17:59
字體:
來源:轉載
供稿:網友

#pragma pack(n)

這是給編譯器用的參數設置,有關結構體字節對齊方式設置, #pragma pack是指定數據在內存中的對齊方式。

#pragma pack (n)             作用:C編譯器將按照n個字節對齊。
#pragma pack ()               作用:取消自定義字節對齊方式。


#pragma  pack (push,1)     作用:是指把原來對齊方式設置壓棧,并設新的對齊方式設置為一個字節對齊

#pragma pack(pop)            作用:恢復對齊狀態

因此可見,加入push和pop可以使對齊恢復到原來狀態,而不是編譯器默認,可以說后者更優,但是很多時候兩者差別不大

如:

#pragma pack(push) //保存對齊狀態

#pragma pack(4)//設定為4字節對齊

相當于 #pragma  pack (push,4) 

解釋一:

每個特定平臺上的編譯器都有自己的默認“對齊系數”(也叫對齊模數)。程序員可以通過預編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一系數,其中的n就是你要指定的“對齊系數”。

規則:

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

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

解釋二:

n 字節的對齊方式 VC 對結構的存儲的特殊處理確實提高 CPU 存儲變量的速度,但是有時候也帶來 了一些麻煩,我們也屏蔽掉變量默認的對齊方式,自己可以設定變量的對齊方式。 VC 中提供了#pragma pack(n)來設定變量以 n 字節對齊方式。n 字節對齊就是說 變量存放的起始地址的偏移量有兩種情況:

第一、如果 n 大于等于該變量所占用的字 節數,那么偏移量必須滿足默認的對齊方式。

第二、如果 n 小于該變量的類型所占用 的字節數,那么偏移量為 n 的倍數,不用滿足默認的對齊方式。結構的總大小也有個 約束條件,分下面兩種情況:如果 n 大于所有成員變量類型所占用的字節數,那么結 構的總大小必須為占用空間最大的變量占用的空間數的倍數; 否則必須為 n 的倍數。

下面舉例說明其用法。 #pragma pack(push) //保存對齊狀態

#pragma pack(4)//設定為 4 字節對齊

struct test { char m1; double m4; int m3; }; #pragma pack(pop)//恢復對齊狀態 以上結構體的大小為 16:

下面分析其存儲情況,首先為 m1 分配空間,其偏移量 為 0,滿足我們自己設定的對齊方式(4 字節對齊),m1 大小為 1 個字節。接著開始 為 m4 分配空間,這時其偏移量為 1,需要補足 3 個字節,這樣使偏移量滿足為 n=4 的倍數(因為 sizeof(double)大于 4),m4 占用 8 個字節。接著為 m3 分配空間,這時 其偏移量為 12,滿足為 4 的倍數,m3 占用 4 個字節。這時已經為所有成員變量分配 了空間,共分配了 16 個字節,滿足為 n 的倍數。如果把上面的#pragma pack(4)改為 #pragma pack(8),那么我們可以得到結構的大小為 24。

大家看了這些文字描述頭也一定會發麻吧,我堅持讀完后,然后自己編寫了一個程序:

#pragma pack(4)struct node{ int e; char f; short int a; char b;};struct node n;printf("%d/n",sizeof(n));

我自己算的結果是16,結果實際結果是:

12

然后結構體內部數據成員變動一下位置:

#pragma pack(4)struct node{ char f; int e; short int a; char b;};struct node n;printf("%d/n",sizeof(n));12

將對齊位數強制定位2

#pragma pack(2)struct node{ char f; int e; short int a; char b;};struct node n;printf("%d/n",sizeof(n));10

將對齊位數強制定位1

#pragma pack(1)struct node{ char f; int e; short int a; char b;};struct node n;printf("%d/n",sizeof(n));8

看著輸出結果和文字描述有點暈,下面簡單說一下俺的判定規則吧:

其實之所以有內存字節對齊機制,就是為了最大限度的減少內存讀取次數。我們知道CPU讀取速度比內存讀取速度快至少一個數量級,所以為了節省運算花費時間,只能以犧牲空間來換取時間了。

下面舉例說明如何最大限度的減少讀取次數。

#pragma pack(1)struct node{ char f; int e; short int a; char b;};struct node n;printf("%d/n",sizeof(n));

這里強制按照1字節進行對齊,可以理解成所有的內容都是按照1字節進行讀?。〞呵疫@樣理解,因為這樣可以很好的理解內存對其機制),其他所有的數據成員都是1字節的整數倍,所以也就不用進行內存對其,各個成員在內存中就按照實際順序進行排列,結構體實際長度為8

#pragma pack(2)struct node{ char f; int e; short int a; char b;};struct node n;printf("%d/n",sizeof(n));

這里強制按照2字節進行對齊。如果內存分布仍然是連續的話,那么int e就得三次才能讀到CPU中,所以為了“講究”int e的讀取,所以在char f之后預留1BYTE,最后的char b也是如此,所以長度為10

#pragma pack(4)struct node{ char f; int e; short int a; char b;};struct node n;printf("%d/n",sizeof(n));

這里強制按照4字節進行對齊。所以char f后要預留3BYTE,而short int a 和 char b可以一次讀取到CPU(按照4字節讀取),所以長度為12

如果#pramga pack(n)中的n大于結構體成員中任何一個成員所占用的字節數,則該n值無效。編譯器會選取結構體中最大數據成員的字節數為基準進行對其

以上這篇淺談C語言的字節對齊 #pragma pack(n)2就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线视频日韩精品| 国产精品视频一区二区三区四| 欧美另类极品videosbest最新版本| 精品成人在线视频| 亚洲欧美精品一区二区| 国产男人精品视频| 日韩av网站电影| 91久久嫩草影院一区二区| 亚洲国产精品字幕| 中文字幕少妇一区二区三区| 欧美极度另类性三渗透| 久久国产精彩视频| 精品美女久久久久久免费| 亚洲自拍偷拍色图| 亚洲视频视频在线| 九色精品免费永久在线| 国产美女精彩久久| 久久亚洲私人国产精品va| 日韩电影在线观看永久视频免费网站| 欧美激情高清视频| 欧美刺激性大交免费视频| 欧美国产精品人人做人人爱| 国产91精品黑色丝袜高跟鞋| 久久久久久久久久久免费精品| 日韩精品www| 丰满岳妇乱一区二区三区| 国产欧美精品久久久| 欧美影院在线播放| 欧美老肥婆性猛交视频| 日韩黄在线观看| 777午夜精品福利在线观看| 亚洲日本中文字幕免费在线不卡| 中文国产成人精品久久一| 亚洲自拍在线观看| 精品久久久久国产| 欧美日韩国产专区| 欧美午夜激情在线| 亚洲天堂成人在线| 成人综合网网址| 亚洲精品久久久久久久久久久久久| 亚洲无av在线中文字幕| 国产精品第一页在线| 欧美激情乱人伦| 久久99热这里只有精品国产| yw.139尤物在线精品视频| 亚洲福利视频免费观看| 精品国产乱码久久久久久婷婷| 亚洲xxx大片| 国产精品久久久久久久久久久不卡| 国产成人av在线| 一本色道久久综合亚洲精品小说| 精品动漫一区二区| 欧美黑人狂野猛交老妇| 亚洲第一综合天堂另类专| 欧美日韩国产一区中文午夜| 欧日韩在线观看| 日韩电影在线观看免费| 精品国产区一区二区三区在线观看| 亚洲九九九在线观看| 久久69精品久久久久久久电影好| 亚洲一品av免费观看| 91精品国产九九九久久久亚洲| 国产精品一区av| 国产精品吊钟奶在线| 日本久久久久久久久久久| 97在线看福利| 欧美亚洲国产视频| 92看片淫黄大片欧美看国产片| 欧美日韩亚洲视频一区| 91av在线看| 国产一区二区三区精品久久久| 国产精品久久久久秋霞鲁丝| 午夜精品视频在线| 色av中文字幕一区| 欧美专区国产专区| 麻豆国产va免费精品高清在线| 欧美性生活大片免费观看网址| 精品中文字幕在线观看| 欧美日韩福利视频| 日韩电影中文字幕| 91经典在线视频| 国产精品极品美女粉嫩高清在线| 国内精品久久久久久影视8| 国产色综合天天综合网| 久久久精品美女| 欧美日韩一区二区在线| 亚洲视频综合网| 国产免费观看久久黄| 96pao国产成视频永久免费| 97超碰蝌蚪网人人做人人爽| 欧美日韩国产精品专区| 欧美孕妇孕交黑巨大网站| 久久青草精品视频免费观看| 久久影院免费观看| 亚洲国产日韩欧美在线动漫| 亚洲系列中文字幕| 欧美激情一级欧美精品| 91日韩在线播放| 7777kkkk成人观看| 久久久久中文字幕| 粗暴蹂躏中文一区二区三区| 97不卡在线视频| 中文字幕久精品免费视频| 国产丝袜视频一区| 亚洲一二在线观看| 亚洲图片欧洲图片av| 国产精品爽黄69| 国产精品日日摸夜夜添夜夜av| 午夜精品久久久久久久白皮肤| 亚洲天堂av电影| 欧美日韩高清在线观看| 亚洲国产精品一区二区三区| 97av视频在线| 国产精品午夜视频| 久久久久北条麻妃免费看| 亚洲免费中文字幕| 91精品91久久久久久| 中文字幕精品影院| 亚洲一二三在线| 久久99视频精品| 北条麻妃在线一区二区| 精品一区二区电影| 欧美成人中文字幕| 久久这里只有精品99| 欧美高清不卡在线| 国产综合视频在线观看| 国产精品吴梦梦| 亚洲人午夜精品| 日韩免费在线免费观看| 北条麻妃一区二区在线观看| 欧美亚洲日本网站| 欧美国产精品人人做人人爱| 欧美精品久久久久久久久| 日韩a**站在线观看| 午夜精品久久久久久久久久久久久| 国产精品中文久久久久久久| xx视频.9999.com| 久久九九亚洲综合| 欧美肥臀大乳一区二区免费视频| 日韩中文在线中文网在线观看| 2019亚洲日韩新视频| 国产亚洲精品久久久久久777| 91精品视频网站| 亚洲高清不卡av| 欧美日韩一区免费| 97在线观看免费| 国产98色在线| 日韩不卡中文字幕| 久热精品视频在线观看| 亚洲一区二区三区乱码aⅴ蜜桃女| 在线视频欧美性高潮| 91久久中文字幕| 久久综合伊人77777| 欧美国产日韩一区二区三区| 欧美中文在线观看| 欧美成aaa人片免费看| 久久中文久久字幕| 亚洲国产精品福利| 国产成人精品优优av| 日韩精品欧美国产精品忘忧草| 亚洲自拍av在线| 4k岛国日韩精品**专区| 久久久久亚洲精品成人网小说| 精品久久久久久久久久ntr影视|