青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

elva

細(xì)說 #pragma pack(n)

在C語言中,結(jié)構(gòu)是一種復(fù)合數(shù)據(jù)類型,其構(gòu)成元素既可以是基本數(shù)據(jù)類型(如int、long、float等)的變量,也可以是一些復(fù)合數(shù)據(jù)類型(如數(shù)組、結(jié)構(gòu)、聯(lián)合等)的數(shù)據(jù)單元。在結(jié)構(gòu)中,編譯器為結(jié)構(gòu)的每個成員按其自然對界(alignment)條件分配空間。各個成員按照它們被聲明的順序在內(nèi)存中順序存儲,第一個成員的地址和整個結(jié)構(gòu)的地址相同。

例如,下面的結(jié)構(gòu)各成員空間分配情況:
struct test
{
     char x1;
     short x2;
     float x3;
     char x4;
};

結(jié)構(gòu)的第一個成員x1,其偏移地址為0,占據(jù)了第1個字節(jié)。第二個成員x2為short類型,其起始地址必須2字節(jié)對界,因此,編譯器在x2和x1之間填充了一個空字節(jié)。結(jié)構(gòu)的第三個成員x3和第四個成員x4恰好落在其自然對界地址上,在它們前面不需要額外的填充字節(jié)。在test結(jié)構(gòu)中,成員x3要求4字節(jié)對界,是該結(jié)構(gòu)所有成員中要求的最大對界單元,因而test結(jié)構(gòu)的自然對界條件為4字節(jié),編譯器在成員x4后面填充了3個空字節(jié)。整個結(jié)構(gòu)所占據(jù)空間為12字節(jié)。

更改C編譯器的缺省字節(jié)對齊方式
在缺省情況下,C編譯器為每一個變量或是數(shù)據(jù)單元按其自然對界條件分配空間。一般地,可以通過下面的方法來改變?nèi)笔〉膶鐥l件:
     · 使用偽指令#pragma pack (n),C編譯器將按照n個字節(jié)對齊。
     · 使用偽指令#pragma pack (),取消自定義字節(jié)對齊方式。

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

以上的n = 1, 2, 4, 8, 16... 第一種方式較為常見。

( via http://blog.csdn.net/wenddy112/articles/300583.aspx )

下面有一道在 CSDN論壇 上討論火熱的題:

Intel和微軟和本公司同時出現(xiàn)的面試題

#pragma pack(8)

struct s1{
short a;
long b;
};

struct s2{
char c;
s1 d;
long long e;
};

#pragma pack()


1.sizeof(s2) = ?
2.s2的c后面空了幾個字節(jié)接著是d?

感謝 redleaves(ID最吊的網(wǎng)友) 的解答,結(jié)果如下:

sizeof(S2)結(jié)果為24.
成員對齊有一個重要的條件,即每個成員分別對齊.即每個成員按自己的方式對齊.
也就是說上面雖然指定了按8字節(jié)對齊,但并不是所有的成員都是以8字節(jié)對齊.其對齊的規(guī)則是,每個成員按其類型的對齊參數(shù)(通常是這個類型的大小)和指定對齊參數(shù)(這里是8字節(jié))中較小的一個對齊.并且結(jié)構(gòu)的長度必須為所用過的所有對齊參數(shù)的整數(shù)倍,不夠就補空字節(jié).
S1中,成員a是1字節(jié)默認(rèn)按1字節(jié)對齊,指定對齊參數(shù)為8,這兩個值中取1,a按1字節(jié)對齊;成員b是4個字節(jié),默認(rèn)是按4字節(jié)對齊,這時就按4字節(jié)對齊,所以sizeof(S1)應(yīng)該為8;
S2中,c和S1中的a一樣,按1字節(jié)對齊,而d 是個結(jié)構(gòu),它是8個字節(jié),它按什么對齊呢?對于結(jié)構(gòu)來說,它的默認(rèn)對齊方式就是它的所有成員使用的對齊參數(shù)中最大的一個,S1的就是4.所以,成員d就是按4字節(jié)對齊.成員e是8個字節(jié),它是默認(rèn)按8字節(jié)對齊,和指定的一樣,所以它對到8字節(jié)的邊界上,這時,已經(jīng)使用了12個字節(jié)了,所以又添加了4個字節(jié)的空,從第16個字節(jié)開始放置成員e.這時,長度為24,已經(jīng)可以被8(成員e按8字節(jié)對齊)整除.這樣,一共使用了24個字節(jié).
                          a    b
S1的內(nèi)存布局:11**,1111,
                          c    S1.a S1.b     d
S2的內(nèi)存布局:1***,11**,1111,****11111111

這里有三點很重要:
1.每個成員分別按自己的方式對齊,并能最小化長度
2.復(fù)雜類型(如結(jié)構(gòu))的默認(rèn)對齊方式是它最長的成員的對齊方式,這樣在成員是復(fù)雜類型時,可以最小化長度
3.對齊后的長度必須是成員中最大的對齊參數(shù)的整數(shù)倍,這樣在處理數(shù)組時可以保證每一項都邊界對齊

補充一下,對于數(shù)組,比如:
char a[3];這種,它的對齊方式和分別寫3個char是一樣的.也就是說它還是按1個字節(jié)對齊.
如果寫: typedef char Array3[3];
Array3這種類型的對齊方式還是按1個字節(jié)對齊,而不是按它的長度.
不論類型是什么,對齊的邊界一定是1,2,4,8,16,32,64....中的一個.

測試的編譯器:

GCC 2.95 3.1 3.3 3.4 4.0
MS C/C++ 7.0 7.1 8.0 beta
Borland C/C++ 5.6 6.0
Intel C/C++ 7.0 8.0 8.1
DigitalMars C/C++ 8.4
OpenWatcom 1.3
Codeplay C/C++ 2.1.7

( 原帖:http://community.csdn.net/Expert/topic/3804/3804035.xml?temp=.2412836 )


posted on 2008-09-22 10:24 葉子 閱讀(1843) 評論(1)  編輯 收藏 引用 所屬分類: C\C++

Feedback

# re: 細(xì)說 #pragma pack(n) 2012-11-20 11:18 Jacc.Kim

寫的非常好。受益匪淺啊。
內(nèi)存對齊在處理圖像方面也是相當(dāng)有用的。
記得上次在識別tga與dds圖片資源時,就用到了這個技術(shù)。起初,在沒有加上:#pragma pace(push,1)時,效果怎么調(diào)都不對,后來加上了這個,一切都解決了。
今日看完文章,對這個技術(shù)的理解也更加的深刻。
收藏了。  回復(fù)  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            免费美女久久99| 一区二区国产日产| 久久久人成影片一区二区三区| 国产精品久久二区| 亚洲永久免费av| 亚洲一区观看| 国产日韩欧美二区| 美女视频黄免费的久久| 久久福利资源站| 亚洲日本中文| 99视频一区二区| 国产日韩免费| 欧美成人伊人久久综合网| 欧美大片免费观看| 亚洲欧美三级伦理| 久久久国产成人精品| 亚洲精品护士| 亚洲专区在线视频| 亚洲国产精品成人综合| 亚洲美女视频网| 国产日韩一区| 亚洲日本欧美天堂| 国产精品毛片| 欧美国产日韩在线观看| 欧美日韩国产在线播放| 久久精品国产亚洲5555| 欧美成人精品福利| 亚洲欧美日韩一区二区| 裸体一区二区| 亚洲欧美国产高清va在线播| 久久亚洲春色中文字幕久久久| 一本久久综合亚洲鲁鲁| 久久精品30| 亚洲午夜一级| 女女同性精品视频| 久久激五月天综合精品| 欧美日韩少妇| 欧美国产日本| 国产欧美日本一区二区三区| 亚洲国产精品久久久久秋霞不卡| 国产欧美精品日韩区二区麻豆天美| 欧美高清在线观看| 国产亚洲精久久久久久| 一本久久青青| 99re视频这里只有精品| 久久国产一二区| 亚洲欧美国产日韩天堂区| 欧美国产日韩a欧美在线观看| 欧美在线播放高清精品| 欧美日韩免费观看中文| 欧美黑人在线观看| 精品动漫3d一区二区三区免费版 | 99国产欧美久久久精品| 欧美在线3区| 性做久久久久久久久| 欧美日韩精品一二三区| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品拍天天在线| 亚洲乱码国产乱码精品精天堂| 一区在线免费| 久久狠狠婷婷| 久久精品人人做人人综合| 国产精品毛片一区二区三区| 亚洲精品美女在线观看| 亚洲精品久久久久久下一站| 老司机67194精品线观看| 老色批av在线精品| 国产一区欧美| 久久久久欧美| 欧美电影在线观看完整版| 精品不卡一区二区三区| 欧美在线资源| 欧美 日韩 国产一区二区在线视频| 国产主播一区二区三区四区| 欧美亚洲自偷自偷| 玖玖玖国产精品| 在线精品国精品国产尤物884a| 久久天堂精品| 亚洲国产裸拍裸体视频在线观看乱了中文 | 久久精品成人欧美大片古装| 国产日韩精品在线观看| 欧美中文在线视频| 蜜桃av一区二区三区| 亚洲国产精品久久久久秋霞不卡| 久久综合图片| 亚洲日本欧美天堂| 亚洲欧美国产毛片在线| 国产女主播一区二区| 久久精品国产一区二区电影 | 亚洲麻豆av| 欧美午夜精品久久久久久超碰| 亚洲一区制服诱惑| 裸体歌舞表演一区二区 | 欧美视频久久| 亚洲欧美在线视频观看| 久久夜色精品亚洲噜噜国产mv | 欧美日韩免费高清一区色橹橹| 一区二区三区精品视频| 久久精品视频亚洲| 最新成人av在线| 欧美午夜电影在线| 久久久久久亚洲精品杨幂换脸| 亚洲第一精品影视| 亚洲欧美日韩另类| 在线欧美影院| 国产精品xnxxcom| 久久久久国产一区二区| 亚洲乱码一区二区| 久久久精品国产99久久精品芒果| 91久久精品国产91久久性色tv| 欧美日韩一区三区| 久久久久免费观看| 亚洲午夜在线观看视频在线| 欧美成年视频| 久久国产精品毛片| 一区二区三区日韩在线观看| 国产一区二区三区视频在线观看| 欧美第一黄网免费网站| 欧美一区二区精品| 亚洲美女视频在线观看| 老司机成人网| 欧美一级视频| 亚洲一区二区精品视频| 亚洲经典一区| 黄色日韩精品| 国产精品天美传媒入口| 欧美精品一区二区三区在线播放 | 亚洲理伦电影| 牛牛精品成人免费视频| 久久国产精品黑丝| 亚洲欧美美女| 中日韩美女免费视频网站在线观看| 激情久久中文字幕| 国产日韩一区欧美| 国产精品日韩在线| 欧美性做爰毛片| 欧美日韩亚洲天堂| 欧美人在线观看| 欧美激情一区二区三区四区| 久久久999| 久久精品国产v日韩v亚洲 | 你懂的国产精品| 久久综合色综合88| 久久综合中文色婷婷| 噜噜噜噜噜久久久久久91| 欧美在线视频网站| 欧美在线观看一区二区| 午夜视频在线观看一区| 午夜在线视频观看日韩17c| 亚洲一二三四区| 亚洲免费视频网站| 欧美一区二区视频在线观看| 午夜激情久久久| 久久国产一区二区三区| 久久精品国产99国产精品| 久久久久久久网站| 久久综合伊人77777麻豆| 美女脱光内衣内裤视频久久网站| 久久综合久久综合久久综合| 久久综合久久美利坚合众国| 免费亚洲电影在线| 亚洲第一在线| 一本久久综合亚洲鲁鲁| 亚洲一区中文| 久久久91精品| 欧美人与性禽动交情品| 国产精品a级| 国产亚洲欧洲| 亚洲人成亚洲人成在线观看图片| 夜夜精品视频一区二区| 午夜宅男欧美| 另类综合日韩欧美亚洲| 91久久国产综合久久蜜月精品 | 久久精品一区蜜桃臀影院 | 亚洲桃色在线一区| 欧美一区二区三区视频| 老司机免费视频久久| 最新日韩在线视频| 亚洲欧美日本日韩| 理论片一区二区在线| 欧美视频一区二区三区四区| 国产欧美日韩专区发布| 亚洲国产精品一区二区www在线 | 国产视频欧美视频| 日韩天堂av| 欧美中文字幕久久| 亚洲国产福利在线| 亚洲欧美日韩一区二区三区在线| 久久久久青草大香线综合精品| 欧美日韩国产成人在线| 国内一区二区在线视频观看| 亚洲日韩视频| 久久久99爱| 一区二区黄色| 久久婷婷久久一区二区三区| 欧美先锋影音| 亚洲激情黄色| 久久视频一区| 亚洲欧美综合| 国产精品成人v|