www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 芯聞號 > 充電吧
[導讀]現在的一些處理器,需要你的數據的內存地址必須是對齊(align)的,即使不是必須,如果你對齊的話,運行的速度也會得到提升。雖然對齊會產生的額外內存空間,但相對于這個速度的提升來說,是值得的。 所謂對

現在的一些處理器,需要你的數據的內存地址必須是對齊(align)的,即使不是必須,如果你對齊的話,運行的速度也會得到提升。雖然對齊會產生的額外內存空間,但相對于這個速度的提升來說,是值得的。

所謂對齊,就是地址必須能整除一個整數,這個就是對齊參數(alignment value)。合法的取值范圍是1、2、4、6、16、……、8192。

怎樣對齊呢?編譯器幫你搞定。

怎樣設置編譯器的對齊方式呢?用#pragma pack( n )和__declspec(align(#))。

依據它倆,編譯器是咋工作的?這個就是接下來要說的了。

#include?
#pragma?pack(?1?)
struct?A
{?????????????
????char?a;
????short?b;
????char?c;
};

int?main()
{
????printf("%dn",sizeof(A));
????return?0;
}
?

OK,下面對這個代碼進行詳細的分析。

?

用MSDN的話一言以蔽之:

“The alignment of a member (except the first one) will be on a boundary that is either a multiple of n or a multiple of the size of the member, whichever is smaller.”

翻譯成中文,也就是:

“結構體中的數據成員,除了第一個是始終放在最開始的地方,其它數據成員的地址必須是它本身大小或對齊參數兩者中較小的一個的倍數?!?/p>

?

P.S:注意上面所說的后面一句話,也就是說,結構體的數據成員的地址必須是本身大小和對齊參數中較小的那一個。

?

?

(1)在pack為1的時候,對齊參數是1,那么我們對這個結構體每一元素進行分析。

?

char a;??????? //??? 第一個元素在[0]位置處

?short b;?//short兩個字節(jié),地址是min(1,sizeof(short))的倍數,即1的倍數[1~2]

?char c; // 地址應該是min(1,sizeof(1))的倍數,從而即為[3]

?

故在pack為1的時候,輸出的結果應該是4([0~3]),其中所有的元素都填滿了。

?

?

(2)在pack為2的時候,同樣按照上面的方法,我們繼續(xù)來分析下。

Char a; //第一個占[0]位置。

Short b; //min(2,sizeof(short)),也就是必須為2的倍數,從而[2~3]

Char c;//min(2,sizeof(char)),也就是位1,地址為[4]

因此最后占據的大小是[0],[2~3],[4],整個結構體的大小size必須是2的倍數,所以應該是6(向上對齊至2的倍數)

?

?

(3)在pack為4的時候,同上,得到的結果是

[0],[2~3],[4],因此也是6.

?

?

然后我們對上面的這個結構體變換一下順序,可以得到。

?

struct B

{

???????? char a;

???????? char b;

???????? short c;

};

?

?

在#pragma pack(4)的情況下,輸出卻是4(注:上面的輸出時6)

解釋如下:

?

Char a;//占據一個字節(jié),地址為【0】

Char b;//地址應該是min(4,sizeof(char)) = 1的倍數,也就是地址為【1】

Short c; //地址應該是min(4,sizeof(short)) = 2的倍數,也就是【2~3】

故總體占據的是【0~3】的連續(xù)單元,也就是4.

?

?

至此,我們對#prgama pack(n)的用法和對應的判定方法有了一個全新的認識。



?

特別提出:
sizeof(ao.a )還是1,sizeof(ao.b )還是2。

?如果struct B中含有A的一個對象m_a,
struct B
{
???…
???A m_a;
???…
}
則這個m_a對齊參數是A中最大的數據類型的大?。ㄟ@里是short的2)和n中較小者。如果這個對齊參數是B中最大的話,最后B的大小也會與這個對齊參數有關。


m_a的對齊參數,由于是A的變量,所以采用A的對齊參數,也就是應該是A的最大元素個數和n中較小的值。而B的大小就要根據這個對齊參數來確定大小。


#include?
#include?

#define?NUM?1
using?namespace?std;

#pragma?pack?(?16?)

typedef?struct?{
????int?a;
????char?b;
????double?c;
}test;

struct?B
{
????int?a;
????test?b;
};
int?main()
{
????cout?< ????cout?< ????cout?< ????cout?< ????cout?< ????system("PAUSE");
????return?0;
}

?

(1)在pack為1的時候,由于min中有一個為1,所以都是相鄰存放的。

Sizeof(test)就是int+char+double的大小之和,即13.

而對應的sizeof(B)則是一個int和一個struct之和。Int占4B,而struct的對齊參數則是

Min(1,sizeof(max(A)),A中最大的元素師double類型的,也就是8,所以結果是min(1,8)=1,所以也是相鄰存放的,而sizeof(A)的結果是13,所以直接是13+4 = 17.

此時,sizeof(B)的大小是17.

?

(2)?在pack為2的時候,此時min中有一個為2,對于test結構體,它的大小是4+2+8=14,因為在double的時候,min(2,8)=2,所以double類型的變量應該是2的倍數的地址,造成了char類型處空出了一個字節(jié)??傮w就是14B。而對于B結構體而言,一個int占據4B,然后結構體的對齊參數采用min(2,max(A)),即min(2,8)= 2,由于是int,所以下一個地址是4,自然也是2的倍數,于是還是相鄰存放。而A結構體的大小時14,于是B結構體的大小時14+4=18.

(3)?在pack為4的情況下。同樣可以得到。此時對于A結構體的大小是4+4+8=16,因為double類型的必須是4的倍數,造成了char變量要占4個地方(實際只占一個,只是說這個地方空出來了3B),所以總體的大小為16.而同樣對于B結構體,sizeof的結果是16+4 = 20,因為對于里面的成員要是min(4,8) = 4,而int恰好是4的倍數,所以相鄰存放。于是就是16,20.

(4)?在pack為8的情況下(有所變化?。。。?,此時A結構體的大小是16,分析方法和上面相同,但是對于結構體B而言就有所區(qū)別,此時int還是4個字節(jié),但是對于成員test結構體,它的對齊參數是min(8,max(A)) = min(8,sizeof(double) ) = 8也就是對齊參數是8,所以結構體變量要從地址為8開始,此時int就空出來了4B,從而最后求大小的時候應該是8+sizeof(A)= 8+16=24(最終測試結果如此)

(5)在pack為16的情況(以及以后的情況),結果是:A的大小為16B,而B的大小是24B。

?

?

總結:

(1)?????? 對于一個由簡單類型組成的結構體,它的大小是由每一個成員變量的地址決定的。我們要按照定義的順序,分別求出來地址開始的地方。從地址為0開始,每一個變量都采取min(n,sizeof(x))//x表示該變量的類型;來確定起始地址是多少的倍數,然后開始計數,直到填滿該數據。最后求出來總的大小。而且在pack>=2的時候最終的大小需要時2的倍數,有時候需要向上取大為2的倍數。而在pack為1的情況則不需要。

(2)?????? 對于含有結構體成員的結構體,方法同上,只是在于對于結構體變量的對齊參數取法需要說明,具體就是min(n,結構體成員的最大元素的大小),就像上面的,結構體B中含有A成員,所以對齊參數就是min(n,sizeof(double))的大小,然后按照這個做法來取地址。


P.S:注意這里是pack而不是package,否則編譯器會直接忽略#pragma package(),因為即使發(fā)生錯誤編譯器也會直接忽略,而我們還是會默認認為編譯器已經當做了字節(jié)按照n來處理。(某些博客上面的內容很容易讓人誤解或者暈倒!)

以上代碼結果在Dev C++ , C-Free 5.0,VS 2010上均通過測試。



附注:在默認情況下,linux操作系統是以4字節(jié)對齊,windows操作系統則是以最大的內置類型對齊。

作用:指定結構體、聯合以及類成員的packing alignment;
語法:#pragma pack( [show] | [push | pop] [, identifier], n )
說明:
1,pack提供數據聲明級別的控制,對定義不起作用;
2,調用pack時不指定參數,n將被設成默認值;
3,一旦改變數據類型的alignment,直接效果就是占用memory的減少,但是performance會下降。
語法具體分析:
1,show:可選參數;顯示當前packing aligment的字節(jié)數,以warning message的形式被顯示;
2,push:可選參數;將當前指定的packing alignment數值進行壓棧操作,這里的棧是the internal compiler stack,同時設置當前的packing alignment為n;如果n沒有指定,則將當前的packing alignment數值壓棧;
3,pop:可選參數;從internal compiler stack中刪除最頂端的record;如果沒有指定n,則當前棧頂record即為新的packing alignment數值;如果指定了n,則n將成為新的packing aligment數值;如果指定了identifier,則internal compiler stack中的record都將被pop直到identifier被找到,然后pop出identitier,同時設置packing alignment數值為當前棧頂的record;如果指定的identifier并不存在于internal compiler stack,則pop操作被忽略;
4,identifier:可選參數;當同push一起使用時,賦予當前被壓入棧中的record一個名稱;當同pop一起使用時,從internal compiler stack中pop出所有的record直到identifier被pop出,如果identifier沒有被找到,則忽略pop操作;
5,n:可選參數;指定packing的數值,以字節(jié)為單位;缺省數值是8,合法的數值分別是1、2、4、8、16。


#include


int main()
{
struct B{
char b; ? //對其系數1
int a; ? ? ?//對其系數4
short c; ?//對其系數2
};//整體對其系數4
/*
struct A{
char b; ? //對其系數1
int a; ? ? ?//對其系數4
struct B f;
short c; ?//對其系數2
};//整體對其系數4*/
#pragma pack(push) //保存對齊狀態(tài)
#pragma pack (2)//無法識別的預處理命令


struct person{
/*char dda;
double dda1;
int type;
*/
char b;//整體對其系數1
double c; //整體對其系數8
char age;//整體對其系數1


};//整體對其系數8
#pragma pack(pop)//恢復對齊狀態(tài)
struct room{
char chair[5];//整體對其系數1
int computer;//整體對其系數1
struct person children;//整體對其系數8
};
int size_r = sizeof(struct room);
int size_p = sizeof(struct person);
printf("size_r = %dnsize_p = %d", size_r,size_p);
getchar();?
}


本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯合牽頭組建的NVI技術創(chuàng)新聯盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現場 NVI技術創(chuàng)新聯...

關鍵字: VI 傳輸協議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉