sizeof 与struct(2个成员的,3个成员的) ..pack(1,2,4,8,16,32)的宏测试 hxf讨论对齐的根本原因
2012-02-29 23:54
344 查看
void test_sizeof_自定义对齐pack(){
/************************************************************************/
/* sizeof考点
Sizeof 空类--》表示我存在,sizeof 含static成员的类
Sizeof 指针,数组
一阶关键点:之所以填充,是由于编译器为后面的成员填入,制造合适的身体位置。
以2成员struct为例(32bit,默认对齐)char double…>(1+7)+8; double char (8+max(4,1) );
当计算最后一个成员填充时,要记住结构大小是成员最大的整数倍,所以最后还有文章。
简言之,为后面填充;最终是最大成员整数倍。
*/
/************************************************************************/
bool testbool;
printf("sizeof(testbool) \n",sizeof(testbool));
/************************************************************************/
/* 2012年2月29日8:18:22 */
/************************************************************************/
//
//#pragma pack(push) //保存对齐状态
//#pragma pack(4)//设定为4字节对齐
// struct test
// {
// char m1;
// double m4;
// int m3;
// };
//#pragma pack(pop)//恢复对齐状态
#pragma pack(push)
#pragma pack(1)
struct char_double{
char a;
double d;
} cd;
printf("pack 1 struct char_double %d \n",sizeof( cd));
#pragma pack(pop)
#pragma pack(push)
#pragma pack(2)
struct char_double2{
char a;
double d;
} cd2;
printf("pack 2 struct char_double %d \n",sizeof( cd2));
#pragma pack(pop)
#pragma pack(push)
#pragma pack(4)
struct char_double4{
char a;
double d;
} cd4;
printf("pack 4 struct char_double %d \n",sizeof( cd4));
#pragma pack(pop)
#pragma pack(push)
#pragma pack(8)
struct char_double8{
char a;
double d;
} cd8;
printf("pack 8 struct char_double %d \n",sizeof( cd8));
#pragma pack(pop)
#pragma pack(push)
#pragma pack(16)
struct char_double16{
char a;
double d;
} cd16;
printf("pack 16 struct char_double %d \n",sizeof( cd16));
#pragma pack(pop)
#pragma pack(push)
#pragma pack(3) //warning C4086: 杂注参数应为“1”、“2”、“4”、“8”或者“16”
struct char_double3{
char a;
double d;
} cd3;
printf("-------pack 奇数3 struct char_double %d \n",sizeof( cd3));
#pragma pack(pop)
#pragma pack(push)
#pragma pack(5)
struct char_double5{
char a;
double d;
} cd5;
printf("-------pack 奇数5 struct char_double %d \n",sizeof( cd5));
#pragma pack(pop)
struct char_double0{
char a;
double d;
} cd0;
printf("默认 struct char_double %d \n",sizeof( cd0));
printf("以上2个成员,现在三个成员\n");
struct char_double_int{
char a;
double d;
int i;
}cdi;
#pragma pack(push)
#pragma pack(4)
struct char_double_int4{
char a;
double d;
int i;
}cdi4;
#pragma pack(pop)
printf("默认char_double_int %d\n",sizeof cdi);//!第三个也要占8
printf("pack 4char_double_int %d\n",sizeof cdi4);
/************************************************************************/
/*结果
sizeof(testbool)
pack 1 struct char_double 9
pack 2 struct char_double 10
pack 4 struct char_double 12
pack 8 struct char_double 16
pack 16 struct char_double 16
-------pack 奇数3 struct char_double 16
-------pack 奇数5 struct char_double 16
默认struct char_double 16
*/
/************************************************************************/
/************************************************************************/
/* 三个思考角度:
pack 的参数为2的幂次
pack 为奇数。
pack 大于最大成员的大小 */
/************************************************************************/
}
void test_sizeof_结构体专题(){
printf("这里只讨论 3个成员,多个成员的自己推广。");
struct double_char_int{
double d;
char ch;
int i;
}dci;
struct char_double_int{
char ch;
double d;
int i;
};
printf("sizeof(double_char_int) %d\n",sizeof(double_char_int));
printf("sizeof(char_double_int) %d\n",sizeof(char_double_int));//66:如果是4个成员,int可能就不填充,但它是末尾。
}
/************************************************************************/
/* sizeof考点
Sizeof 空类--》表示我存在,sizeof 含static成员的类
Sizeof 指针,数组
一阶关键点:之所以填充,是由于编译器为后面的成员填入,制造合适的身体位置。
以2成员struct为例(32bit,默认对齐)char double…>(1+7)+8; double char (8+max(4,1) );
当计算最后一个成员填充时,要记住结构大小是成员最大的整数倍,所以最后还有文章。
简言之,为后面填充;最终是最大成员整数倍。
*/
/************************************************************************/
bool testbool;
printf("sizeof(testbool) \n",sizeof(testbool));
/************************************************************************/
/* 2012年2月29日8:18:22 */
/************************************************************************/
//
//#pragma pack(push) //保存对齐状态
//#pragma pack(4)//设定为4字节对齐
// struct test
// {
// char m1;
// double m4;
// int m3;
// };
//#pragma pack(pop)//恢复对齐状态
#pragma pack(push)
#pragma pack(1)
struct char_double{
char a;
double d;
} cd;
printf("pack 1 struct char_double %d \n",sizeof( cd));
#pragma pack(pop)
#pragma pack(push)
#pragma pack(2)
struct char_double2{
char a;
double d;
} cd2;
printf("pack 2 struct char_double %d \n",sizeof( cd2));
#pragma pack(pop)
#pragma pack(push)
#pragma pack(4)
struct char_double4{
char a;
double d;
} cd4;
printf("pack 4 struct char_double %d \n",sizeof( cd4));
#pragma pack(pop)
#pragma pack(push)
#pragma pack(8)
struct char_double8{
char a;
double d;
} cd8;
printf("pack 8 struct char_double %d \n",sizeof( cd8));
#pragma pack(pop)
#pragma pack(push)
#pragma pack(16)
struct char_double16{
char a;
double d;
} cd16;
printf("pack 16 struct char_double %d \n",sizeof( cd16));
#pragma pack(pop)
#pragma pack(push)
#pragma pack(3) //warning C4086: 杂注参数应为“1”、“2”、“4”、“8”或者“16”
struct char_double3{
char a;
double d;
} cd3;
printf("-------pack 奇数3 struct char_double %d \n",sizeof( cd3));
#pragma pack(pop)
#pragma pack(push)
#pragma pack(5)
struct char_double5{
char a;
double d;
} cd5;
printf("-------pack 奇数5 struct char_double %d \n",sizeof( cd5));
#pragma pack(pop)
struct char_double0{
char a;
double d;
} cd0;
printf("默认 struct char_double %d \n",sizeof( cd0));
printf("以上2个成员,现在三个成员\n");
struct char_double_int{
char a;
double d;
int i;
}cdi;
#pragma pack(push)
#pragma pack(4)
struct char_double_int4{
char a;
double d;
int i;
}cdi4;
#pragma pack(pop)
printf("默认char_double_int %d\n",sizeof cdi);//!第三个也要占8
printf("pack 4char_double_int %d\n",sizeof cdi4);
/************************************************************************/
/*结果
sizeof(testbool)
pack 1 struct char_double 9
pack 2 struct char_double 10
pack 4 struct char_double 12
pack 8 struct char_double 16
pack 16 struct char_double 16
-------pack 奇数3 struct char_double 16
-------pack 奇数5 struct char_double 16
默认struct char_double 16
*/
/************************************************************************/
/************************************************************************/
/* 三个思考角度:
pack 的参数为2的幂次
pack 为奇数。
pack 大于最大成员的大小 */
/************************************************************************/
}
void test_sizeof_结构体专题(){
printf("这里只讨论 3个成员,多个成员的自己推广。");
struct double_char_int{
double d;
char ch;
int i;
}dci;
struct char_double_int{
char ch;
double d;
int i;
};
printf("sizeof(double_char_int) %d\n",sizeof(double_char_int));
printf("sizeof(char_double_int) %d\n",sizeof(char_double_int));//66:如果是4个成员,int可能就不填充,但它是末尾。
}
相关文章推荐
- (经典)struct和 union用 sizeof 看字节对齐,以及__declspec( align( # ) ) 和 #pragma pack()的使用方式
- struct和 union用 sizeof 看字节对齐,以及__declspec( align( # ) ) 和 #pragma pack()的使用方式
- 再谈sizeof——struct 结构存储空间的大小:与成员的顺序、#progma pack参数有关系
- struct 自然对齐和#pragma pack
- 详解struct、class中成员变量的字节对齐
- struct的成员对齐
- C语言之struct大小、首地址与内存对齐—由结构体成员地址得到结构体首地址
- 【C++ Primer】 神秘的 sizeof(union) 、sizeof(struct) 和内存对齐技术
- sizeof(struct student)(字节对齐)
- sizeof union struct 内存对齐
- 【面试题】C语言中内存对齐规则讨论(struct)
- struct成员对齐问题
- sizeof union struct 内存对齐
- struct 对齐机制和sizeof 笔记
- 神秘的 sizeof(union) 、sizeof(struct) 和内存对齐技术
- 字节对齐的根本原因。
- struct结构体和union联合体:字节对齐下的sizeof返回
- sizeof(struct )大小讨论
- C# 使用 StructLayoutAttribute 时 C# /C++ 内存空间分配与成员对齐问题
- 关于字节对齐的sizeof的讨论