struct 大小
2016-01-08 16:16
295 查看
大小计算是按照下两个原则算出的
1,结构体内成员按自身按自身长度自对齐
自身长度,如char=1,short=2,int=4,double=8,。所谓自对齐,指的是该成员的起始位置的内存地址必须是它自身长度的整数倍。如int只能以0,4,8这类的地址开始。
当成员是有结构体时,(这个结构体成员自身对齐的起始位置为其子成员中最长的长度的整数倍。)
typedef struct dd
{
char a;
int b;
short c;
}DD;
struct ee
{
char a;
int b;
char c;
int d;
char f;
dd e;
}EE;
sizeof(dd) = 1+(3) +4+2 +(2) =12;
sizeof(ee) = 1+(3) +4+1 +(3) +4+1 +(3) +12 = 32;
2.结构体的总大小为结构体的有效对齐值的整数倍
结构体的有效对齐值的确定:
1)当未明确指定时,以结构体中最长的成员的长度为其有效值(如果成员中有结构体时,则该成员不作为最长长度,也即是;结构体不作为有效对齐值)。
2)当用#pragma pack(n)指定时,以n和结构体中最长的成员的长度中较小者为其值。
3)当用__attribute__
((__packed__))指定长度时,强制按照此值为结构体的有效对齐值
typedef struct dd
{
char a;
int e;
short c;
short d;
char f;
}DD;
typedef struct ee
{
char a;
int b;
char c;
int d;
char f;
int g;
char h;//25
dd e;
}EE;
sizeof(dd) = 16;
sizeof(ee) = 25+(3)+ 16=44;
typedef struct dd
{
char a;
short c;
short d;
}DD;
typedef struct ee
{
char a;
int b;
char c;
int d;
char f;
int
g;
char
h;//25
dd e;//
}EE;
sizeof(dd) = 6;
sizeof(ee) = 25+(1) +6=32 //25+(1)刚好是结构体dd中sizeof(short)的整数倍,此值作为成员dd在ee结构体中的自对齐位置,然后加上dd结构体的长度,最后看相加后的此值是否是有效对齐值的整数倍。
1,结构体内成员按自身按自身长度自对齐
自身长度,如char=1,short=2,int=4,double=8,。所谓自对齐,指的是该成员的起始位置的内存地址必须是它自身长度的整数倍。如int只能以0,4,8这类的地址开始。
当成员是有结构体时,(这个结构体成员自身对齐的起始位置为其子成员中最长的长度的整数倍。)
typedef struct dd
{
char a;
int b;
short c;
}DD;
struct ee
{
char a;
int b;
char c;
int d;
char f;
dd e;
}EE;
sizeof(dd) = 1+(3) +4+2 +(2) =12;
sizeof(ee) = 1+(3) +4+1 +(3) +4+1 +(3) +12 = 32;
2.结构体的总大小为结构体的有效对齐值的整数倍
结构体的有效对齐值的确定:
1)当未明确指定时,以结构体中最长的成员的长度为其有效值(如果成员中有结构体时,则该成员不作为最长长度,也即是;结构体不作为有效对齐值)。
2)当用#pragma pack(n)指定时,以n和结构体中最长的成员的长度中较小者为其值。
3)当用__attribute__
((__packed__))指定长度时,强制按照此值为结构体的有效对齐值
typedef struct dd
{
char a;
int e;
short c;
short d;
char f;
}DD;
typedef struct ee
{
char a;
int b;
char c;
int d;
char f;
int g;
char h;//25
dd e;
}EE;
sizeof(dd) = 16;
sizeof(ee) = 25+(3)+ 16=44;
typedef struct dd
{
char a;
short c;
short d;
}DD;
typedef struct ee
{
char a;
int b;
char c;
int d;
char f;
int
g;
char
h;//25
dd e;//
}EE;
sizeof(dd) = 6;
sizeof(ee) = 25+(1) +6=32 //25+(1)刚好是结构体dd中sizeof(short)的整数倍,此值作为成员dd在ee结构体中的自对齐位置,然后加上dd结构体的长度,最后看相加后的此值是否是有效对齐值的整数倍。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性