结构体字节对齐的规则
2016-09-07 07:12
423 查看
字节对齐的计算规则
1、先看结构中最大类型的数据,包括嵌套结构体(如果有)。确定一行的最大数(如果有double,那一行就是8个字节,如果最大是int或者long,那一行就是4个字节,原来一直以为是编译器决定,这不对的)。
2、如果只有一个元素,那就是这个元素的大小,不需要补齐。
3、单一变量,先看看元素放到这一排的剩余位置能否完全放下,如果放不下,则从下一行的首地址开始放。
4、嵌套子结构体则要看看这个元素的整个大小(就是累加的大小,不是对齐的大小)放到这一排的剩余位置能不能放下,放不下则从下一行开始,子结构体中的元素排列规则和单一变量相同)
char(1),short(2),int(4),float(4),long(4),double(8)
例1
struct {
int a;
//第一行,最大元素,所以每行有4个字节
short b;
//第二行首位,第二行还有两个2字节的剩余空间
char c1;
//第二行
char c2;
//第二行
} a1; //大小为8
空间分布(8个字节)
例2
struct A{
char
e; short
f; int
g};
typedef
struct
B{ int
a; char
b; struct
A c; char
d}B;
最大类型是int,所以一行4个字节
空间分布(20个字节)
例3
struct
A{ char
e; short
f; double
g};
typedef
struct
B{ int
a; char
b; struct
A c; char
d}B;
最大是double类型,所以一行有8个字节
空间分布(32字节)
结论:
只有一个元素:那就是这个元素的大小
多于两个元素:先看所有元素中最大的是多少,确定一行到底有多少字节,
再看每一个元素能不能这一行完全放下(子结构体要看整个的大小),
放不下,另起一行开始放。最后一个元素再填充补齐这一行
指定字节对齐
#pragma pack(xx) //xx必须是2的n次方
#pragma
pack(1) //1字节对齐
#pragma
pack(2) //2字节对齐
#pragma
pack(4) //4字节对齐
#pragma
pack(8) //8字节对齐
#pragma
pack(16) //16字节对齐
1、先看结构中最大类型的数据,包括嵌套结构体(如果有)。确定一行的最大数(如果有double,那一行就是8个字节,如果最大是int或者long,那一行就是4个字节,原来一直以为是编译器决定,这不对的)。
2、如果只有一个元素,那就是这个元素的大小,不需要补齐。
3、单一变量,先看看元素放到这一排的剩余位置能否完全放下,如果放不下,则从下一行的首地址开始放。
4、嵌套子结构体则要看看这个元素的整个大小(就是累加的大小,不是对齐的大小)放到这一排的剩余位置能不能放下,放不下则从下一行开始,子结构体中的元素排列规则和单一变量相同)
char(1),short(2),int(4),float(4),long(4),double(8)
例1
struct {
int a;
//第一行,最大元素,所以每行有4个字节
short b;
//第二行首位,第二行还有两个2字节的剩余空间
char c1;
//第二行
char c2;
//第二行
} a1; //大小为8
空间分布(8个字节)
a | a | a | a |
b | b | c1 | c2 |
struct A{
char
e; short
f; int
g};
typedef
struct
B{ int
a; char
b; struct
A c; char
d}B;
最大类型是int,所以一行4个字节
空间分布(20个字节)
a | a | a | a |
b | x | x | x |
e | f | f | x |
g | g | g | g |
d | x | x | x |
struct
A{ char
e; short
f; double
g};
typedef
struct
B{ int
a; char
b; struct
A c; char
d}B;
最大是double类型,所以一行有8个字节
空间分布(32字节)
a | a | a | a | b | x | x | x |
e | f | f | x | x | x | x | x |
g | g | g | g | g | g | g | g |
d | d | d | d | d | d | d | d |
只有一个元素:那就是这个元素的大小
多于两个元素:先看所有元素中最大的是多少,确定一行到底有多少字节,
再看每一个元素能不能这一行完全放下(子结构体要看整个的大小),
放不下,另起一行开始放。最后一个元素再填充补齐这一行
指定字节对齐
#pragma pack(xx) //xx必须是2的n次方
#pragma
pack(1) //1字节对齐
#pragma
pack(2) //2字节对齐
#pragma
pack(4) //4字节对齐
#pragma
pack(8) //8字节对齐
#pragma
pack(16) //16字节对齐
相关文章推荐
- 结构体的字节对齐规则
- 结构体4字节对齐规则的详解
- 结构体字节对齐规则
- 结构体字节对齐规则
- C 结构体字节对齐规则
- 字节字符和整数转换-大小端转换-结构体内存(文件)对齐规则之总结
- 结构体自身字节对齐
- 结构体字节对齐笔记(Mac OS 10.9 中测试)
- 结构体在内存中的对齐规则
- 关于C语言中结构体字节对齐问题
- 详解结构体、类等内存字节对齐
- C语言中结构体的对齐规则
- C语言结构体的字节对齐原则
- C/C++结构体字节对齐详解
- 结构体字节对齐和位域对齐——VC、gcc
- 详解结构体、类等内存字节对齐
- 结构体字节对齐
- 结构体内存对齐规则
- 结构体对齐规则
- 关于C语言字节对齐之结构体 共用体占用字节数的快速计算方法总结