关于内存中的数据对齐

概念:

数据对齐指的是,数据所在的内存地址必须是该数据长度的整数倍。比如在32位机中int 所在的内存起始地址能被4整除,short可以被2正处,double被8整除。

为什么要进行数据对齐?

x86CPU能直接访问对齐的数据,当它试图访问一个未对齐的数据时,会在内部进行一系列的调整,这些调整对程序来说是透明的,但是会降低运行速度,所以编译器在编译程序时会尽量保证让数据对齐。对于访问内存的硬件电路,地址总线总是按照对齐后的地址来访问的。假如你想得到0x00000001处的4字节内容,系统首先需要以0x00000000读4字节,从中取得3字节,在用0x00000004作为开始地址获得下一个4字节,再从中获得1字节,将两者组合出想得到的内容, 但是若一开始就对齐到0x00000000,则系统只需要读取一次即可。可见对齐对于效率的重要性。

结构体中成员的对齐原则:(VC环境编译器)

保证每个成员的起始地址是该成员长度的整数倍;结构体总长度必须是最大长度成员的整数倍。

几个典型例子:

struct _A{
	int a;
	char b;
	short c;
}A;

struct {
	int a;
	long b;
	short c;
}B;

typedef struct _C{
	double a;
	char b;
	short c;
}C;

struct _D{
	char a;
	short b;
	short c;
	static int d;//静态变量存储在全局区,sizeof只计算栈中大小

};

typedef struct _D D;


void main(){
	cout<<sizeof(A)<<endl;
	cout<<sizeof(B)<<endl;
	cout<<sizeof(C)<<endl;
	cout<<sizeof(D)<<endl;
}


输出为:8,12,16,6.


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值