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

posts - 311, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
 首先請大家先看下面代碼:
typedef struct
{
UINT32 NumElements;
union
{
UINT32 ObjectHandle;
}Entry;
}STR_ARRAY, *PSTR_ARRAY;

還有這兩句#pragma pack(push, 1)
#pragma pack(pop)
#pragma pack( [ n ] )

該指令指定結(jié)構(gòu)和聯(lián)合成員的緊湊對齊。而一個完整的轉(zhuǎn)換單元的結(jié)構(gòu)和聯(lián)合的緊湊對齊由/ Z p 選項設(shè)置。緊湊對齊用p a c e 編譯指示在數(shù)據(jù)說明層設(shè)置。該編譯指示在其出現(xiàn)后的第一個結(jié)構(gòu)或聯(lián)合說明處生效。該編譯指示對定義無效。當(dāng)你使用#pragma pack ( n ) 時, 這里n 為1 、2 、4 、8 或1 6 。第一個結(jié)構(gòu)成員之后的每個結(jié)構(gòu)成員都被存儲在更小的成員類型或n 字節(jié)界限內(nèi)。如果你使用無參量的#pragma pack , 結(jié)構(gòu)成員被緊湊為以/ Z p 指定的值。該缺省/ Z p 緊湊值為/ Z p 8 。

編譯器也支持以下增強型語法:
#pragma pack( [ [ { p u s h | p o p } , ] [ 標(biāo)識符, ] ] [ n] )若不同的組件使用p a c k 編譯指示指定不同的緊湊對齊, 這個語法允許你把程序組件組合為一個單獨的轉(zhuǎn)換單元。帶p u s h 參量的p a c k 編譯指示的每次出現(xiàn)將當(dāng)前的緊湊對齊存儲到一個內(nèi)部編譯器堆棧中。編譯指示的參量表從左到右讀取。如果你使用p u s h , 則當(dāng)前緊湊值被存儲起來; 如果你給出一個n 的值, 該值將成為新的緊湊值。若你指定一個
標(biāo)識符, 即你選定一個名稱, 則該標(biāo)識符將和這個新的的緊湊值聯(lián)系起來。帶一個p o p 參量的p a c k 編譯指示的每次出現(xiàn)都會檢索內(nèi)部編譯器堆棧頂?shù)闹?并且使該值為新的緊湊對齊值。如果你使用p o p 參量且內(nèi)部編譯器堆棧是空的,則緊湊值為命令行給定的值, 并且將產(chǎn)生一個警告信息。若你使用p o p 且指定一
個n 的值, 該值將成為新的緊湊值。若你使用p o p 且指定一個標(biāo)識符,  所有存儲在堆棧中的值將從棧中刪除, 直到找到一個匹配的標(biāo)識符, 這個與標(biāo)識符相關(guān)的緊湊值也從棧中移出, 并且這個僅在標(biāo)識符入棧之前存在的緊湊值成為新的緊湊值。如果未找到匹配的標(biāo)識符, 將使用命令行設(shè)置的緊湊值, 并且將產(chǎn)生一個一級警告。缺省緊湊對齊為8 。p a c k 編譯指示的新的增強功能讓你編寫頭文件, 確保在遇到該頭文件的前后的緊湊值是一樣的。

什么是內(nèi)存對齊

考慮下面的結(jié)構(gòu):

struct foo
{
char c1;
short s;
char c2;
int i;
};

假設(shè)這個結(jié)構(gòu)的成員在內(nèi)存中是緊湊排列的,假設(shè)c1的地址是0,那么s的地址就應(yīng)該是1,c2的地址就是3,i的地址就是4。也就是
c1 00000000, s 00000001, c2 00000003, i 00000004。

可是,我們在Visual c/c++ 6中寫一個簡單的程序:

struct foo a;
printf("c1 %p, s %p, c2 %p, i %p\n",
(unsigned int)(void*)&a.c1 - (unsigned int)(void*)&a,
(unsigned int)(void*)&a.s - (unsigned int)(void*)&a,
(unsigned int)(void*)&a.c2 - (unsigned int)(void*)&a,
(unsigned int)(void*)&a.i - (unsigned int)(void*)&a);
運行,輸出:
c1 00000000, s 00000002, c2 00000004, i 00000008。

為什么會這樣?這就是內(nèi)存對齊而導(dǎo)致的問題。

為什么會有內(nèi)存對齊

以下內(nèi)容節(jié)選自《Intel Architecture 32 Manual》。
字,雙字,和四字在自然邊界上不需要在內(nèi)存中對齊。(對字,雙字,和四字來說,自然邊界分別是偶數(shù)地址,可以被4整除的地址,和可以被8整除的地址。)
無論如何,為了提高程序的性能,數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地在自然邊界上對齊。原因在于,為了訪問未對齊的內(nèi)存,處理器需要作兩次內(nèi)存訪問;然而,對齊的內(nèi)存訪問僅需要一次訪問。
一個字或雙字操作數(shù)跨越了4字節(jié)邊界,或者一個四字操作數(shù)跨越了8字節(jié)邊界,被認(rèn)為是未對齊的,從而需要兩次總線周期來訪問內(nèi)存。一個字起始地址是奇數(shù)但卻沒有跨越字邊界被認(rèn)為是對齊的,能夠在一個總線周期中被訪問。
某些操作雙四字的指令需要內(nèi)存操作數(shù)在自然邊界上對齊。如果操作數(shù)沒有對齊,這些指令將會產(chǎn)生一個通用保護(hù)異常(#GP)。雙四字的自然邊界是能夠被16 整除的地址。其他的操作雙四字的指令允許未對齊的訪問(不會產(chǎn)生通用保護(hù)異常),然而,需要額外的內(nèi)存總線周期來訪問內(nèi)存中未對齊的數(shù)據(jù)。

編譯器對內(nèi)存對齊的處理

缺省情況下,c/c++編譯器默認(rèn)將結(jié)構(gòu)、棧中的成員數(shù)據(jù)進(jìn)行內(nèi)存對齊。因此,上面的程序輸出就變成了:
c1 00000000, s 00000002, c2 00000004, i 00000008。
編譯器將未對齊的成員向后移,將每一個都成員對齊到自然邊界上,從而也導(dǎo)致了整個結(jié)構(gòu)的尺寸變大。盡管會犧牲一點空間(成員之間有空洞),但提高了性能。
也正是這個原因,我們不可以斷言sizeof(foo) == 8。在這個例子中,sizeof(foo) == 12。

如何避免內(nèi)存對齊的影響

那么,能不能既達(dá)到提高性能的目的,又能節(jié)約一點空間呢?有一點小技巧可以使用。比如我們可以將上面的結(jié)構(gòu)改成:

struct bar
{
char c1;
char c2;
short s;
int i;
};
這樣一來,每個成員都對齊在其自然邊界上,從而避免了編譯器自動對齊。在這個例子中,sizeof(bar) == 8。

這個技巧有一個重要的作用,尤其是這個結(jié)構(gòu)作為API的一部分提供給第三方開發(fā)使用的時候。第三方開發(fā)者可能將編譯器的默認(rèn)對齊選項改變,從而造成這個結(jié)構(gòu)在你的發(fā)行的DLL中使用某種對齊方式,而在第三方開發(fā)者哪里卻使用另外一種對齊方式。這將會導(dǎo)致重大問題。
比如,foo結(jié)構(gòu),我們的DLL使用默認(rèn)對齊選項,對齊為
c1 00000000, s 00000002, c2 00000004, i 00000008,同時sizeof(foo) == 12。
而第三方將對齊選項關(guān)閉,導(dǎo)致
c1 00000000, s 00000001, c2 00000003, i 00000004,同時sizeof(foo) == 8。

如何使用c/c++中的對齊選項

vc6中的編譯選項有 /Zp[1|2|4|8|16] ,/Zp1表示以1字節(jié)邊界對齊,相應(yīng)的,/Zpn表示以n字節(jié)邊界對齊。n字節(jié)邊界對齊的意思是說,一個成員的地址必須安排在成員的尺寸的整數(shù)倍地址上或者是n的整數(shù)倍地址上,取它們中的最小值。也就是:
min ( sizeof ( member ), n)
實際上,1字節(jié)邊界對齊也就表示了結(jié)構(gòu)成員之間沒有空洞。
/Zpn選項是應(yīng)用于整個工程的,影響所有的參與編譯的結(jié)構(gòu)。
要使用這個選項,可以在vc6中打開工程屬性頁,c/c++頁,選擇Code Generation分類,在Struct member alignment可以選擇。

要專門針對某些結(jié)構(gòu)定義使用對齊選項,可以使用#pragma pack編譯指令。指令語法如下:
#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n )
意義和/Zpn選項相同。比如:

#pragma pack(1)
struct foo_pack
{
char c1;
short s;
char c2;
int i;
};
#pragma pack()

棧內(nèi)存對齊

我們可以觀察到,在vc6中棧的對齊方式不受結(jié)構(gòu)成員對齊選項的影響。(本來就是兩碼事)。它總是保持對齊,而且對齊在4字節(jié)邊界上。

驗證代碼

#include <stdio.h>

struct foo
{
char c1;
short s;
char c2;
int i;
};

struct bar
{
char c1;
char c2;
short s;
int i;
};

#pragma pack(1)
struct foo_pack
{
char c1;
short s;
char c2;
int i;
};
#pragma pack()


int main(int argc, char* argv[])
{
char c1;
short s;
char c2;
int i;

struct foo a;
struct bar b;
struct foo_pack p;

printf("stack c1 %p, s %p, c2 %p, i %p\n",
(unsigned int)(void*)&c1 - (unsigned int)(void*)&i,
(unsigned int)(void*)&s - (unsigned int)(void*)&i,
(unsigned int)(void*)&c2 - (unsigned int)(void*)&i,
(unsigned int)(void*)&i - (unsigned int)(void*)&i);

printf("struct foo c1 %p, s %p, c2 %p, i %p\n",
(unsigned int)(void*)&a.c1 - (unsigned int)(void*)&a,
(unsigned int)(void*)&a.s - (unsigned int)(void*)&a,
(unsigned int)(void*)&a.c2 - (unsigned int)(void*)&a,
(unsigned int)(void*)&a.i - (unsigned int)(void*)&a);

printf("struct bar c1 %p, c2 %p, s %p, i %p\n",
(unsigned int)(void*)&b.c1 - (unsigned int)(void*)&b,
(unsigned int)(void*)&b.c2 - (unsigned int)(void*)&b,
(unsigned int)(void*)&b.s - (unsigned int)(void*)&b,
(unsigned int)(void*)&b.i - (unsigned int)(void*)&b);

printf("struct foo_pack c1 %p, s %p, c2 %p, i %p\n",
(unsigned int)(void*)&p.c1 - (unsigned int)(void*)&p,
(unsigned int)(void*)&p.s - (unsigned int)(void*)&p,
(unsigned int)(void*)&p.c2 - (unsigned int)(void*)&p,
(unsigned int)(void*)&p.i - (unsigned int)(void*)&p);

printf("sizeof foo is %d\n", sizeof(foo));
printf("sizeof bar is %d\n", sizeof(bar));
printf("sizeof foo_pack is %d\n", sizeof(foo_pack));

return 0;


}

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲图片在线观看| 亚洲男同1069视频| 尤物99国产成人精品视频| 激情另类综合| 亚洲精品九九| 午夜精品视频| 麻豆久久精品| 亚洲天堂偷拍| 久久一区二区视频| 欧美日韩亚洲国产精品| 国产自产女人91一区在线观看| 在线成人免费观看| 伊人春色精品| 久久精品亚洲精品国产欧美kt∨| 亚洲电影在线| 亚洲欧美偷拍卡通变态| 欧美激情综合五月色丁香小说| 欧美日韩一区不卡| 一本大道av伊人久久综合| 久久激情视频免费观看| 亚洲毛片视频| 欧美va亚洲va香蕉在线| 欧美激情女人20p| 久久九九国产| 欧美视频精品一区| 亚洲三级性片| 欧美一区二区大片| 欧美一区二区三区在线观看| 欧美三区在线视频| 亚洲美女视频在线观看| 男人的天堂亚洲| 亚洲天堂av在线免费| 国产精品视频专区| 亚洲先锋成人| 亚洲精选国产| 久久精品夜色噜噜亚洲a∨| 国产日韩一区欧美| 日韩一二在线观看| 亚洲缚视频在线观看| 久久久噜噜噜久久中文字幕色伊伊| 欧美日韩免费一区| 亚洲自拍都市欧美小说| 亚洲老司机av| 欧美日本韩国一区二区三区| 亚洲精品一区二区三区婷婷月| 久久久精品国产一区二区三区 | 欧美一区二区在线视频| 欧美亚一区二区| 久久er99精品| 久久都是精品| 在线日本成人| 亚洲大胆视频| 欧美国产一区二区在线观看 | 国产精品综合| 欧美一区二区三区免费看| 久久电影一区| 亚洲国产婷婷香蕉久久久久久99 | 亚洲精品免费一区二区三区| 欧美激情综合五月色丁香| 中文有码久久| 欧美中文字幕在线视频| 亚洲国产精品黑人久久久| 亚洲国产精品va在线看黑人动漫| 欧美亚洲一级| 久久亚洲综合色| 在线日韩中文字幕| 久久亚洲私人国产精品va| 久久激情网站| 日韩一级黄色片| 亚洲欧美另类中文字幕| 99爱精品视频| 久久av老司机精品网站导航| 免费看的黄色欧美网站| 国产精品一区二区三区成人| 免费在线观看日韩欧美| 国产精品久久一区二区三区| 欧美成人精品h版在线观看| 国产精品久久久久久超碰| 亚洲国产精选| 国产一区自拍视频| 亚洲电影免费在线观看| 国产欧美精品xxxx另类| 亚洲人成7777| 在线精品国精品国产尤物884a| 亚洲午夜三级在线| 99精品欧美一区二区三区| 久久精品九九| 久久九九热re6这里有精品| 国产精品久久久久久久久免费| 亚洲国产你懂的| 亚洲高清影视| 久久久99国产精品免费| 久久精品一二三区| 国产女主播一区二区三区| 一区二区三区日韩| 亚洲一区高清| 国产精品人人爽人人做我的可爱 | 伊人影院久久| 99精品国产一区二区青青牛奶| 欧美一区二区日韩一区二区| 亚洲一区影院| 欧美视频日韩视频| 日韩亚洲欧美一区二区三区| 亚洲精品一二三区| 欧美精品成人| 91久久国产综合久久| 亚洲人成毛片在线播放| 美女精品在线观看| 亚洲三级电影在线观看| 一本一本a久久| 欧美日韩不卡一区| aa日韩免费精品视频一| 亚洲男同1069视频| 国产视频一区在线| 久久精品人人做人人综合| 欧美电影电视剧在线观看| 亚洲欧洲日韩在线| 欧美日韩国产天堂| 国产日韩欧美综合精品| 亚洲欧洲日本专区| 猛干欧美女孩| 欧美激情视频一区二区三区在线播放| 亚洲第一区在线| 欧美国产精品一区| 99国产精品久久久久久久| 亚洲在线一区| 国产午夜精品一区二区三区欧美| 久久精品九九| 亚洲人在线视频| 欧美一区二区三区免费在线看| 国产欧美一区二区三区久久人妖| 欧美影院成年免费版| 欧美高清在线一区二区| 中文在线一区| 在线视频日韩| 欧美在线黄色| 最新日韩中文字幕| 亚洲欧美日韩区| 曰本成人黄色| 亚洲视频精选在线| 欧美一级片在线播放| 国产精品亚洲网站| 久久久精品一区| 亚洲精品日本| 欧美在线高清| 日韩视频免费观看高清完整版| 国产精品成人在线观看| 久久久久久免费| 一区二区三区回区在观看免费视频| 欧美主播一区二区三区| 亚洲精品一区二区网址| 国产农村妇女精品一区二区| 女仆av观看一区| 亚洲一区二区三区在线看| 欧美不卡在线| 欧美一级久久久| 亚洲精品综合精品自拍| 国产一区二区三区观看| 欧美日韩在线影院| 欧美88av| 久久夜色精品一区| 午夜精品一区二区在线观看| 一区二区三区久久| 亚洲欧洲精品一区二区三区波多野1战4| 久久久久综合| 午夜精品久久久久久| 99精品欧美一区二区三区综合在线 | 久久国产欧美日韩精品| 国产精品va在线播放| 91久久国产综合久久| 欧美一区二区三区在线| 亚洲麻豆国产自偷在线| 韩国精品一区二区三区| 国产日韩欧美在线看| 国产精品久久久久毛片软件 | 欧美一区二区三区日韩视频| 亚洲免费观看视频| 欧美激情第9页| 美国成人毛片| 久久久久九九视频| 欧美在线视频一区| 亚洲国产精品va在看黑人| 久久一区二区三区av| 中文欧美在线视频| 亚洲视频精品| 亚洲欧美日韩人成在线播放| 亚洲深夜激情| 亚洲性色视频| 亚洲欧美成人在线| 性18欧美另类| 久久久久成人精品| 久久躁日日躁aaaaxxxx| 欧美成人中文字幕在线| 欧美激情中文不卡| 亚洲欧洲视频| 中日韩美女免费视频网址在线观看 | 蜜臀av性久久久久蜜臀aⅴ| 免费亚洲一区| 亚洲精品免费看| 亚洲一区二区免费看|