结构体内存对齐
2014-10-26 13:20
246 查看
看了一些内存对齐的文章后,自己做的一个小笔记。
内存对齐注意点:
1.确定对齐模数:结构体变量类型,所占字节最多的
2.对齐时,注意存储变量的首地址要能被变量类型所占字节数整除
3.结构体最后的大小要是对齐模数的整数倍
例子1:
struct a
{
char c;
int b;
};
结构体大小为 :1 + 3 + 4 = 8;
由于int 的地址为1,不能被4整除,故c填充3个字节(起始地址为0)
例子2:
struct a
{
int b;
char c;
};
结构体大小为: 4 + 1 +3 = 8;
由于b+c共5个字节,为了能被对齐模数整除,c后面填充3个字节
例:子3:
struct a
{
char b;
short c;
int d;
};
结构体大小:1 + 1 + 2 + 4 = 8;
由于short的地址为1,且sizeof(short) = 2; 不能被2整除,故b后面填充一个地址
例子4:
struct a
{
char b;
char c;
short d;
int e;
};
结构体大小:1 + 1 + 2 +4 =8;
例子5:
struct a
{
char b;
short c;
char d;
int e;
};
结构体大小: 1 + 1 + 2 +1 +3 + 4 = 12
由于c 的地址为1,故b填充1个字节,由于e的地址为5,故d后填充3个字节
例子6:
struct b
{
short c;
struct a d; //a为例子5结构体
};
结构体大小:2 + 2 + 12 =16
由于sizeof(c) = 2;结构体a 的对齐模数是4,且d的地址为2,故c后填充2个字节
内存对齐注意点:
1.确定对齐模数:结构体变量类型,所占字节最多的
2.对齐时,注意存储变量的首地址要能被变量类型所占字节数整除
3.结构体最后的大小要是对齐模数的整数倍
例子1:
struct a
{
char c;
int b;
};
结构体大小为 :1 + 3 + 4 = 8;
由于int 的地址为1,不能被4整除,故c填充3个字节(起始地址为0)
例子2:
struct a
{
int b;
char c;
};
结构体大小为: 4 + 1 +3 = 8;
由于b+c共5个字节,为了能被对齐模数整除,c后面填充3个字节
例:子3:
struct a
{
char b;
short c;
int d;
};
结构体大小:1 + 1 + 2 + 4 = 8;
由于short的地址为1,且sizeof(short) = 2; 不能被2整除,故b后面填充一个地址
例子4:
struct a
{
char b;
char c;
short d;
int e;
};
结构体大小:1 + 1 + 2 +4 =8;
例子5:
struct a
{
char b;
short c;
char d;
int e;
};
结构体大小: 1 + 1 + 2 +1 +3 + 4 = 12
由于c 的地址为1,故b填充1个字节,由于e的地址为5,故d后填充3个字节
例子6:
struct b
{
short c;
struct a d; //a为例子5结构体
};
结构体大小:2 + 2 + 12 =16
由于sizeof(c) = 2;结构体a 的对齐模数是4,且d的地址为2,故c后填充2个字节
相关文章推荐
- 结构体内存对齐
- 结构体在内存中的对齐规则
- 关于结构体的内存对齐
- 结构体与内存对齐
- 结构体内存对齐
- 内存中结构体字节对齐
- 关于结构体内存对齐方式
- 结构体内存对齐的补充说明与总结
- 结构体(struct)的使用、内存分布以及字节对齐测试总结
- C++学习之旅——结构体和联合体的区别,以及数据对齐方式影响内存大小
- 结构体在内存中的对齐问题
- C/C++中结构体与类成员变量在存储上的内存对齐问题
- C语言 内存中结构体字节对齐
- 结构体中内存对齐问题
- 结构体(声明、初始化、内存对齐、如何传参)
- (转)sizeof()解析和结构体内存对齐
- 结构体内存对齐原则
- 32位和64位下结构体内存对齐问题
- C/C++结构体内存对齐
- C/C++结构体的内存对齐机制