Where there is a dream ,there is hope

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  64 Posts :: 0 Stories :: 8 Comments :: 0 Trackbacks

常用链接

留言簿(1)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

都是内存对齐,稍有区别,这里测试平台是VS2008,其它平台为测试

#pragma pack( n ),
结构体中的数据成员,除了第一个是始终放在最开始的地方,其它数据成员的地址必须是它本身大小或对齐参数两者中较小的一个的倍数
 即:min(n, sizeof(elem))

结构体整个的大小就没有另外的要求

 

#pragma pack(1)
struct TestA
{
    
char  a;
    
short b;
    
char  c;
}
;

#pragma pack(
4)
struct TestB
{
    
char  a;
    
short b;
    
char  c;
}
;


结果:


在结构体中含有结构体的话,内结构体的大小按照此结构体内最大元素的大小来计算,各个元素的计算方法如下:
min(n, e ||max({e}) )

#pragma pack( 4 )
struct TestA
{
    
char  a;
    
short b;
    
char  c;
}
;

#pragma pack( 
8 )
struct TestB
{
    
char  a;
    
char  c;
    TestA m_a;
}
;

因为TestA最大的元素是short 2B,所以计算TestA的大小的时候,按照2来算



__declspec( align(#) )#pragma pack( n )同时修饰结构体的时候,前者的优先级高,
注意前者与后者的区别:

成员的地址决定于前者及后者,其要么是前者的倍数,要么是后者的倍数,要么是成员的大小的倍数,取最小。

结构体最后的大小于前者有关,其要么是前者的倍数,要么是结构体中最大偏移量的倍数,取最大。

要算出最后结果,必须知道两者的值或缺省值

__declspec(align(1)) struct TestA
{
    
char  a;
    
short b;
    
char  c;
    
double d;
}
;

__declspec(align(
32)) struct TestB
{
    
char  a;
    
short b;
    
char  c;
    
double d;
}
;

输出:

posted on 2011-03-14 12:21 IT菜鸟 阅读(355) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理