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

隨筆-145  評論-173  文章-70  trackbacks-0

上面講到了關于pack的內存對齊和計算方法,這里繼續(xù)講實現(xiàn)內存對齊的另一種方式:__declspec( align(#) )

__declspec( align(#) )#pragma pack( n )有密切聯(lián)系。

當一個變量或結構體同時受兩者影響時,前者的優(yōu)先級高。

成員的地址決定于前者及后者,其要么是前者的倍數(shù),要么是后者的倍數(shù),要么是成員的大小的倍數(shù),取最小。

結構體最后的大小于前者有關,其要么是前者的倍數(shù),要么是結構體中最大偏移量的倍數(shù),取最大。

要算出最后結果,必須知道兩者的值或缺省值。

 

下面舉一個例子來詳細的分析:

#include <stdio.h>

#include 
"stdafx.h"
#include 
<stdlib.h>
//using namespace std;

#pragma pack( push, 
4 )

__declspec( align(
32) )struct D
{
    
int i1;
    
double d1;
    
int i2;
    
int i3;
};

int main()
{
    cout 
<< "sizeof(int) = "<<sizeof(int<< endl;
    cout 
<< "sizeof(char) = " << sizeof(char<< endl;
    cout 
<< "sizeof(double) = " << sizeof(double<< endl;
    cout 
<< sizeof(D) << endl;
    system(
"PAUSE");
    
return 0;
}

 

這段代碼在VS 2010中的運行結果是,sizeof(D)的大小為32,而在Dev C++C-Free 5.0以及gcc中的結果都似乎20。下面我們來著重講講關于__declspec( align(#) )的用法:

正如前面所說的,當有__declspec( align(#) )pack的時候,__declspec( align(#) )的優(yōu)先級要高些。所以對于上面這個例子,我們首先來計算出來每一個的大小。

 

1.       成員的地址如何取?

規(guī)則:成員的地址要取pack(n)__declspec( align(m) ),以及成員自身大小這三者之間的最小值,也就是,min(n,m,sizeof(成員變量類型)),那么我們可以對每一個結構體的成員都進行分析。

 

第一個為int類型,占據(jù)4B,所以地址是[0~3].

第二個為double類型,它的地址要根據(jù)min(4,32,sizeof(double))來判斷,所以應該是4的倍數(shù),也就是相鄰著int類型的i1存放。地址是[4~11]

第三個為int類型,占據(jù)4B,同樣應該是4的倍數(shù),地址是[12~15].

第四個為int類型,占據(jù)4B,地址為[16~19].

 

從而總的地址是從[0~19]連續(xù)存放的20個字節(jié),那么是否sizeof(D)的大小就是20呢?

 

經過測試,我們可以看到,在VS 2010中,結果是32why

 

這就要用__declspec( align(#) )來解釋了。也就是下面第二點的內容。

 

2.       結構體最后的大小如何決定?

規(guī)則:結構體最后的大小與__declspec( align(m) )有關,其要么是它的倍數(shù),要么是結構體中最大偏移量的倍數(shù),取最大

 

根據(jù)這個規(guī)則,這里align32,而結構體中最大的是double類型,也就是應該是max(32,8)=32,所以最后結構體的大小應該是32的倍數(shù),而明顯上面我們看到的實際大小是20B,從而需要擴展到32B

 

在這里,就體現(xiàn)了__declspec( align(m) )的強大作用!

 

同樣的,為了體現(xiàn)該語句的作用,我們去掉這個語句,運用我們前面一節(jié)內容的知識,來計算并測試sizeof(D),最終不論是在VS 2010還是Dev C++中,運行的結果都是上面我們所預測的20B

 

OK,下面回到最后的疑問,也就是前面我們提出的,為何加入了__declspec( align(m) )語句之后,在DevC++VS 2010的結果不同?

 

實際上,對于這些內存對齊的處理,不同的編譯器可能采取不同的處理,就像前面一節(jié)中所說的,我將pack誤用為package,導致根本沒有達到按照我要求的字節(jié)對齊的目的,而且編譯器根本不提供任何警告信息。那么,這里合理的解釋是:Dev C++不支持這種用法。

 

通過查閱資料,參照這篇文章【 SSE指令介紹及其CC++應用 】(http://blog.csdn.net/delphihero/archive/2006/09/24/1270069.aspx),我們可以看到作者有這么一段話:

 

接下來我舉一個例子來說明SSE的指令函數(shù)是如何使用的,必須要說明的是我以下的代碼都是在VC7.1的平臺上寫的,不保證對其它如Dev-C++Borland C++等開發(fā)平臺的完全兼容。

 

這里要注意一下,我使用了__declspec(align(16))做為數(shù)組定義的修釋符,這表示該數(shù)組是以16字節(jié)為邊界對齊的,因為SSE指令只能支持這種格式的內存數(shù)據(jù)。

  我們在這里看到了SSE算的強大,相信它會成為多媒體程序員手中用來對付無窮盡流媒體數(shù)據(jù)的一把利劍。我后面還會寫一些關于SSE算法更復雜應用的文章,敬請關注,感謝您抽時間閱讀!

 

從這篇文章我們可以看到,SSE指令集的情況下,在VC 7.1下才支持__declspec(align(16))這種用法,而對于其他平臺不一定有效。而前面我們使用的Dev C++以及C-Free,都是基于g++或者MinGW,不一定會支持這種方式,或者說,不一定按照這種內存對齊的建議來做,也就造成了結果的不同。

 

 

下面我們來繼續(xù)探討結構體中有結構體的情況。

 

先看看下面這段代碼:

#include <stdio.h>

#include 
"stdafx.h"
#include 
<stdlib.h>
//using namespace std;

#pragma pack( push, 
4 )

__declspec( align(
32) )struct D
{
    
int i1;
    
double d1;
    
int i2;
    
int i3;
};

__declspec( align(
16) ) struct E
{
     
int i1;
     D m_d;
     
int i2;
};

int main()
{
    cout 
<< "sizeof(int) = "<<sizeof(int<< endl;
    cout 
<< "sizeof(char) = " << sizeof(char<< endl;
    cout 
<< "sizeof(double) = " << sizeof(double<< endl;
    cout 
<< sizeof(D) << endl;
    cout 
<< sizeof(E) << endl;
    system(
"PAUSE");
    
return 0;
}

 

最后運行的結果是sizeof(E)96,為何會是這個結果呢?我們來詳細講解下。

 

對于結構體E,第一個元素為int類型,所以占據(jù)[0~3]地址單元。

第二個元素是一個結構體,該結構體由于受上面__declspec( align(32) )的影響,優(yōu)先級高,所以起始地址是32的倍數(shù),而且大小為32B,從而應該放置在[32~63]單元處。

最后一個是int類型的變量,大小為4,所以應該是4的倍數(shù),地址為[64~67]

 

故結構體E的大小應該是從[0~67],占據(jù)68B,而由于前面還有限制__declspec( align(16) ),同時成員變量的最大偏移是sizeof(D)=32,所以我們最后這個結構體的大小應該是他們中最大值的倍數(shù),也就是32的倍數(shù),68向上取32的倍數(shù)應該是96.故結果為96.

 

最后仍然是上面平臺的問題,在Dev C++G++下面的結果不同,原因上面解釋了。


MSDN:

The sizeof value for any structure is the offset of the final member, plus that member's size, rounded up to the nearest multiple of the largest member alignment value or the whole structure alignment value, whichever is greater.

中文:

sizeof的結果都是結構體中最后的一個成員變量加上它的大小,再加上一個填充容量(padding),這個填充大小是成員變量最大的一個對齊參數(shù)或整個結構體的對齊參數(shù)的倍數(shù),取哪個決定于哪個對齊參數(shù)較大

 

ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/dv_vclang/html/e4209cbb-5437-4b53-b3fe-ac264501d404.htm

ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/dv_vclang/html/9cb63f58-658b-4425-ac47-af8eabfc5878.htm




P.S.:上面是關于內存對齊的研究,如有謬誤,歡迎指出!


附參考資料和拓展:

1. #pragma pack :http://blog.sina.com.cn/s/blog_492aa57901008y3h.html
2. #pragma pack( n )和__declspec( align(#) ) 的偏移量計算方法: http://blog.csdn.net/whoismickey/archive/2009/03/28/4032155.aspx
3. #pragma pack(push,1) (pop) :http://blog.csdn.net/jiang1013nan/archive/2009/11/25/4861248.aspx
4. 關于pragma pack的用法(四) C++中的內存對齊問題: http://m.shnenglu.com/xczhang/archive/2007/12/23/39396.html
5. SSE指令介紹及其C、C++應用:http://blog.csdn.net/delphihero/archive/2006/09/24/1270069.aspx
6. c++中__declspec用法總結: http://sealbird.javaeye.com/blog/855096

 


posted on 2011-03-13 22:30 deercoder 閱讀(10039) 評論(5)  編輯 收藏 引用 所屬分類: C++

評論:
# re: 【內存對齊(二)】__declspec( align(#) )的用法和大小計算 2011-03-14 00:21 | fazhang
內存對齊是在筆試題中才開始接觸的。   回復  更多評論
  
# re: 【內存對齊(二)】__declspec( align(#) )的用法和大小計算 2011-03-14 09:39 | 劉暢
@fazhang
是的,面試中也會出現(xiàn),這個是有感于我在一次面試中的經歷來進行深入研究的。  回復  更多評論
  
# re: 【內存對齊(二)】__declspec( align(#) )的用法和大小計算 2011-03-14 11:42 | Husiwa
VS2008下驗證通過  回復  更多評論
  
# re: 【內存對齊(二)】__declspec( align(#) )的用法和大小計算 2011-03-14 12:19 | 劉暢
@Husiwa
嗯,VS的后續(xù)版本估計都會支持。不過VC 6.0還不支持。  回復  更多評論
  
# re: 【內存對齊(二)】__declspec( align(#) )的用法和大小計算 2012-02-23 23:06 | 游客
成員的地址決定于前者及后者,其要么是前者的倍數(shù),要么是后者的倍數(shù),要么是成員的大小的倍數(shù),取最小。

這個不太對。成員地址跟結構提前的__declspec( align(#) )沒關系。

另外,MSDN中說到__declspec(align( # )) can only increase alignment restrictions.所以__declspec(align( # ))是不可能和別的來取最小值,只可能往大的取  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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一区二区| 亚洲视频一二区| 亚洲欧美日韩精品久久亚洲区 | 亚洲视频精选在线| 亚洲综合国产激情另类一区| 久久国产综合精品| 你懂的亚洲视频| 亚洲精品日韩综合观看成人91| 99成人精品| 亚久久调教视频| 欧美黑人国产人伦爽爽爽| 欧美视频免费看| 狠狠色狠狠色综合日日五| 一区二区日韩伦理片| 久久精品一二三| 亚洲第一黄网| 亚洲欧美日韩中文播放| 免费不卡在线视频| 国产欧美亚洲精品| 99热这里只有精品8| 久久激情五月婷婷| 99爱精品视频| 蜜桃av一区二区三区| 国产日韩精品入口| 亚洲一卡久久| 欧美gay视频| 亚洲免费影视| 欧美性事在线| 日韩视频二区| 欧美大色视频| 久久久久久久一区二区三区| 欧美午夜一区二区三区免费大片| 亚洲国产日韩一区| 久久精品亚洲精品国产欧美kt∨| 在线视频日韩精品| 欧美精品v日韩精品v韩国精品v| 国产欧美精品| 亚洲影院污污.| 亚洲国产高清在线| 久久夜色撩人精品| 韩国精品久久久999| 午夜一区二区三区不卡视频| 亚洲人成网站精品片在线观看 | 久久精品99无色码中文字幕| 日韩视频一区二区在线观看 | 国产精品高潮在线| 亚洲免费大片| 国产精品影院在线观看| 欧美大色视频| 亚洲欧洲日产国产网站| 欧美大片一区二区| 美女精品在线| 亚洲免费不卡| 99视频精品全部免费在线| 欧美大片一区二区| 亚洲九九九在线观看| 欧美激情一区二区三区在线| 欧美激情亚洲视频| 一区二区三区欧美激情| 日韩一区二区精品在线观看| 欧美四级在线观看| 久久成人资源| 久久野战av| 一本色道精品久久一区二区三区| 99热在这里有精品免费| 国产精品久久亚洲7777| 欧美一区二区三区视频在线观看| 午夜精品久久久久久久男人的天堂| 国产精品伊人日日| 女同性一区二区三区人了人一 | 国产日韩av在线播放| 久久电影一区| 久久一区二区精品| 亚洲伦伦在线| 亚洲一级黄色| 国产综合视频| 亚洲国产成人av在线| 欧美视频免费在线观看| 久久精品成人| 欧美成人69av| 欧美一二三区在线观看| 久久久久久久999| 日韩一本二本av| 亚洲欧美日韩国产中文| 亚洲国产精品久久久久秋霞蜜臀 | 国产精品日日摸夜夜添夜夜av| 久久av一区二区三区亚洲| 美女脱光内衣内裤视频久久影院| 亚洲视频播放| 久久久一区二区| 亚洲欧美日韩在线播放| 久久精品道一区二区三区| 一本色道久久综合狠狠躁篇怎么玩| 亚洲欧美电影在线观看| 亚洲国产小视频在线观看| 一区二区日韩欧美| 在线视频观看日韩| 亚洲欧美日韩成人| 亚洲精品乱码久久久久久蜜桃91| 亚洲免费影视第一页| 日韩视频一区二区三区在线播放| 欧美在线观看视频一区二区| 一本久久青青| 国产欧美日韩91| 亚洲日本中文字幕免费在线不卡| 国产精品毛片a∨一区二区三区| 久久蜜桃资源一区二区老牛| 欧美人在线视频| 欧美高清视频| 伊人伊人伊人久久| 午夜精品亚洲| 亚洲欧美日韩成人| 欧美日韩久久精品| 欧美国产精品v| 精品电影一区| 欧美一区二区三区啪啪| 亚洲女同性videos| 欧美色网一区二区| 日韩午夜剧场| 日韩亚洲在线| 欧美日本不卡高清| 亚洲精品影视在线观看| 亚洲人成高清| 欧美激情视频网站| 亚洲国产成人精品视频 | 亚洲视频一区二区在线观看| 欧美成人免费全部观看天天性色| 欧美肥婆在线| 91久久综合亚洲鲁鲁五月天| 免费的成人av| 亚洲激情第一页| 亚洲人成在线播放| 欧美大片国产精品| 亚洲国内高清视频| 99国产精品国产精品久久| 欧美精品二区三区四区免费看视频| 91久久精品国产91性色| 99国产精品自拍| 欧美私人网站| 香蕉乱码成人久久天堂爱免费 | 亚洲第一毛片| 蜜桃久久精品一区二区| 亚洲国产美女| 亚洲网站视频| 国产区二精品视| 久久精品国亚洲| 亚洲国产成人精品女人久久久| 在线一区日本视频| 国产精品久久久久免费a∨| 亚洲欧美日本视频在线观看| 蜜桃伊人久久| 亚洲蜜桃精久久久久久久| 国产精品久久久久久久app| 欧美一区三区二区在线观看| 久久综合99re88久久爱| 亚洲精品久久久蜜桃| 国产精品视频一二| 久久久久久久久久久一区| 91久久国产综合久久蜜月精品| 亚洲一区3d动漫同人无遮挡| 国产亚洲一区在线播放| 欧美精品粉嫩高潮一区二区| 性色av一区二区三区在线观看| 免费在线欧美黄色| 亚洲欧美久久| 亚洲人成77777在线观看网| 国产精品女人毛片| 亚洲亚洲精品三区日韩精品在线视频| 欧美久久久久免费| 好吊色欧美一区二区三区视频| 久久国产精品久久久久久| 亚洲品质自拍| 久久久精品一品道一区| 99精品视频网| 国模大胆一区二区三区| 欧美三级电影一区| 六月天综合网| 性欧美video另类hd性玩具| 亚洲国产99精品国自产| 欧美在线播放视频| aa级大片欧美三级| 韩日成人在线| 国产精品久久久久久久久久妞妞 | 午夜视频在线观看一区| 亚洲人成绝费网站色www| 久久亚洲春色中文字幕| 亚洲欧美日韩视频二区| 99国产精品久久久久老师| 亚洲丰满在线| 激情综合亚洲| 国户精品久久久久久久久久久不卡 |