#pramga pack(#) 与__declspec( algn(#) )

#pramga pack(#) 与__declspec( algn(#) )

 

都是内存对齐,稍有区别,这里测试平台是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;
}
;

输出:

你可能感兴趣的:(#pramga pack(#) 与__declspec( algn(#) ))