C 语言内存对齐

===============================   博客点滴积累,部分话语和知识点来源于网络,感谢网络资源的提供者======


1 为什么会有内存对齐?(参考网上资料)
1)平台原因:不是所有的硬件地址都可以随意访问,有些地址的访问可能会出现硬件异常
2)性能原因:自然边界内存访问只要一次,而非自然边界内存访问需要两次(自然边界指偶数地址,被4除尽的地址,被8除尽的地址)。
2 内存对齐的规则(理论总是相同的,来源:http://blog.chinaunix.net/uid-7319742-id-2059621.html)
1)数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2)结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
3)结合1、2颗推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
3 内存对齐实验
1)测试平台:gcc 4.4.3  VC++6.0
2)对齐方式的修改
一般的可视化IDE都都选项修改内存对齐的字节数,VC++6.0 工程=》设置=》C/C++=》code generation =》struct member alignment,默认8字节对齐,关于默认gcc 字节对齐,未找到资料说明。内存对齐也可以使用#pragma pack()实现
#pragma pack(n)  // n = 1,2,4,8,16 ,以n字节对齐
#pragma pack()   // 取消自定义字节对齐方式
3)测试(通过gcc,vc++6.0)
a  8字节
struct test1
{
char i;  //0
char k;  //1
short m; //2,3
int n;   //4,5,6,7
}test_11;
b 12字节
struct test2

char i;  //0 *
short m; //2,3
char k;  //4 ,***
int n;   //8,9,10,11
}test_22;
c 9字节
#pragma pack(1)
struct test3
{
char i;   //0
short m;  //1,2
char k;   //3
int n;    //4,5,6,7
char j;   //8
}test_33;
d 12字节
#pragma pack(2)
struct test7
{
char i;   //0,*
short m;  //2,3
char k;   //4 * 
int n;    //6,7,8,9
char j;   //10,*
}test_77;
#pragma pack()
e 16字节
#pragma pack(4)
struct test4
{
char i;  //0 *
short m; //2,3
char k;  //4,***
int n;   //8,9,10,11
char j;  //12 * * *
}test_44;
#pragma pack()
f  16字节
#pragma pack(8)
struct test5
{
char i;  //0 *
short m; //2,3
char k;  //4,***
int n;  //8,9,10,11
char j; //12 * * *
}test_55;
#pragma pack()
g  9字节
#pragma pack(1)
struct test6
{
char i;  
double j; 
}test_66;
#pragma pack()
h 10字节
#pragma pack(2)
struct test6
{
char i;  
double j;  
}test_66;
#pragma pack()
i 12字节
#pragma pack(4)
struct test6
{
char i;  
double j;  
}test_66;
#pragma pack()

j gcc  12字节, VC6.0 16字节(查网上资料说明:gcc 对齐模数最大为4,即大于4偏移地址是4的倍数)

#pragma pack(8)
struct test6
{
char i;  
double j;  
}test_66;
#pragma pack()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值