内存对齐

为什么要内存对齐
为了提高程序的性能,数据结构(尤其是栈)应该尽可能的在自然边界上对齐。因为访问未对齐的内存,处理器需要作两次内存访问,但是,对齐的内存访问只需要一次访问。内存对齐尽管会牺牲一些空间,但是可以提高程序的性能。
比如32位机,字长为32位即4字节。如果一个字操作数跨越了4字节边界那么就需要两次总线周期来访问内存。

对齐规则
1.每个成员分别按自己的方式对齐,并能最小化长度。
2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度。
3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐。
注意点:
a)#pragma pack(n):为编译器指定结构体或类内部的成员变量的对齐方式。
当自然边界(如int型按4字节、short型按2字节、float按4字节)比n大时,按n字节对齐。即就是min(n,sizeof(类型));
缺省或#pragma pack() ,按自然边界对齐。
b)对于数组,可以将其看作分别写相同数量的同类型变量一样

例题(在32位系统中):

struct Test
{
    char a[10];
    int b;
    short c[3];
};

sizeof(Test)=24;
a[10]为char类型,理论上占10B因为内存对齐,实际占12B,因为b为4B,要从第三个四字节开始存储。
b为int类型,理论占4B,实际也占4B。
c[3]理论占6B,实际要占8B,因为结构体大小要为最长成员整数倍,a,b,c共12+4+6=22<(4*6=24)所以c占8B

当然,也可以调整成员顺序来实现既能提高性能,也可以节约空间。
例如:struct TestStruct1
{
char c1;
short s;
char c2;
int i;
};

struct TestStruct2
{
char c1;
char c2;
short s;
int i;
};

sizeof(TestStruct1)=12,sizeof(TestStruct2)=8

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值