内存中的数据对齐
2014-03-20 16:15
239 查看
数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍。包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐。
当结构体某一成员后面紧跟一个要求比较大的地址对齐成员时(例如char成员变量后面跟一个double成员变量),或是在,这时要插入一些没有实际意义的填充(Padding)。而且总的结构体大小必须为最大对齐的倍数。
char(1字节),1字节对齐
short(2字节),2字节对齐
int(4字节),4字节对齐
float(4字节),4字节对齐
double(8字节),Windows系统中8字节对齐,Linux系统中4字节对齐
当结构体某一成员后面紧跟一个要求比较大的地址对齐成员时(例如char成员变量后面跟一个double成员变量),或是在,这时要插入一些没有实际意义的填充(Padding)。而且总的结构体大小必须为最大对齐的倍数。
下面是一个有char,int,short三种类型,4个成员组成的结构体,该结构体在还未编译之前是大小占8个字节。
参考地址:http://blog.csdn.net/donkeylong/article/details/4909720
#include <stdio.h>
#include <tchar.h>
#include <stdlib.h>
struct st1
{
int i;
char c;
int j;
}A;
struct st2
{
char c1;
int m;
char c2;
}B;
struct st3
{
char c3;
char c4;
int n;
}C;
struct st4
{
short x;
struct st5
{
char c5;
int y;
}D;
int z;
}E;
struct st6
{
char c6;
int p;
}F;
int _tmain(int argc, _TCHAR* argv[])
{
printf("the A in fit in %d\n",sizeof(A));
printf("the B in fit in %d\n",sizeof(B));
printf("the C in fit in %d\n",sizeof(C));
printf("the E in fit in %d\n",sizeof(E));
printf("the F in fit in %d\n",sizeof(F));
getchar();
return 0;
}
运行结果:
当结构体某一成员后面紧跟一个要求比较大的地址对齐成员时(例如char成员变量后面跟一个double成员变量),或是在,这时要插入一些没有实际意义的填充(Padding)。而且总的结构体大小必须为最大对齐的倍数。
char(1字节),1字节对齐
short(2字节),2字节对齐
int(4字节),4字节对齐
float(4字节),4字节对齐
double(8字节),Windows系统中8字节对齐,Linux系统中4字节对齐
当结构体某一成员后面紧跟一个要求比较大的地址对齐成员时(例如char成员变量后面跟一个double成员变量),或是在,这时要插入一些没有实际意义的填充(Padding)。而且总的结构体大小必须为最大对齐的倍数。
下面是一个有char,int,short三种类型,4个成员组成的结构体,该结构体在还未编译之前是大小占8个字节。
struct AlignData
{
char a;
short b;
int c;
char d;
};
编译之后,为了保持结构体中的每个成员都是按照各自的对齐,编译器会在一些成员之间插入一些padding,因此编译后得到如下的结构体:
struct AlignData
{
char a;
char Padding0[1];
short b;
int c;
char d;
char Padding1[3];
};
编译后该结构体的大小为12个字节,最后一个成员d后面填充的字节数要使该结构体的总大小是其成员类型中拥有最大字节数的倍数(int拥有最大字节数),因此d后面要填充3个字节。
下面举一些结构体例子来说明结构体的填充方式:
例子1:
struct struct1
{
char a1;
char b1;
};
结构体struct1的大小为2字节,因为char在结构体中的默认对齐是1,因此在a1和b1之间没有数据填充,而且其成员中占用字节最大的类型为char,因此结构体结束处和b1之间也没有数据填充。
例子2:
struct struct2
{
char a2;
short b2;
};
结构体struct2的大小为4字节,b2的是按2字节对齐,因此在b2于a2之间填充一个字节,而其成员中占用字节最大的类型为short,因此该结构体结束处和b2之间没有任何数据填充。
例子3:
Struct struct3
{
double a3;
char b3;
}
结构体struct3的大小为16字节,因为b3是按1字节对齐,所以b3与a3之间没有数据填充,而其成员中占用字节最大的类型为double,在Windows平台下是8字节对齐,因此该结构体结束处和b3之间有7个字节的数据填充。
参考地址:http://blog.csdn.net/donkeylong/article/details/4909720
#include <stdio.h>
#include <tchar.h>
#include <stdlib.h>
struct st1
{
int i;
char c;
int j;
}A;
struct st2
{
char c1;
int m;
char c2;
}B;
struct st3
{
char c3;
char c4;
int n;
}C;
struct st4
{
short x;
struct st5
{
char c5;
int y;
}D;
int z;
}E;
struct st6
{
char c6;
int p;
}F;
int _tmain(int argc, _TCHAR* argv[])
{
printf("the A in fit in %d\n",sizeof(A));
printf("the B in fit in %d\n",sizeof(B));
printf("the C in fit in %d\n",sizeof(C));
printf("the E in fit in %d\n",sizeof(E));
printf("the F in fit in %d\n",sizeof(F));
getchar();
return 0;
}
运行结果:
相关文章推荐
- 数据对齐---C语言:内存字节对齐详解
- 内存对齐与ANSI C中struct型数据的内存布局
- 内存中的数据对齐
- 【2015/11/1】C学习日志_Day11&12 数据类型 指针 内存对齐 函数指针
- 内存对齐与ANSI C中struct型数据的内存布局 (ZT)
- gpu显存(全局内存)在使用时数据对齐的问题
- 内存对齐与ANSI C中struct型数据的内存布局(转载)
- 内存数据对齐(翻:Data alignment:straighten up and fly right)
- 内存对齐与ANSI C中struct型数据的内存布局 【转】
- 内存对齐与ANSI C中struct型数据的内存布局 选择自 soloist 的 Blog
- VC中结构体内存分配问题透析(“字节对齐”访问数据)
- C++学习之旅——结构体和联合体的区别,以及数据对齐方式影响内存大小
- 数据对齐/内存对齐 && 数据格式
- 内存数据对齐
- C++中数据的内存对齐原则
- C结构体中数据的内存对齐问题
- 明明两个数据看的一样,但比较的结果就是不相等 (内存对齐,debug没问题,release 有问题)
- 关于内存中的数据对齐
- 程序员面试宝典学习记录004(内存中的数据对齐)
- 内存对齐与ANSI C中struct型数据的内存布局