内存对齐

本文探讨了C语言中内存对齐的概念及其重要性。通过一个具体的例子展示了不同编译器下(如VC6)结构体成员的内存布局差异,并解释了为何处理器偏好对齐的数据结构,以及这对程序性能的影响。

C中如下结构:

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


假设结构成员在内存中紧凑排列,c1地址0s地址应该是1c2地址3i地址4

c1 00000000
s 00000001
c2 00000003
i 00000004

VC6 

#include<stdio.h>

Struct  foo { char c1; short s; char c2; int i; }; 

int main()

 { struct foo a;

 printf("c1\t%p\ns\t%p\nc2\t%p\ni\t%p\n", (unsigned int)(void*)&a.c1 - (unsigned int)(void*)&a, (unsigned int)(void*)&a.s - (unsigned int)(void*)&a, (unsigned int)(void*)&a.c2 - (unsigned int)(void*)&a, (unsigned int)(void*)&a.i - (unsigned int)(void*)&a); 

printf("sizeof(foo)=%d\n",sizeof(foo)); return 0;

 } 

c1 00000000
s 00000002
c2 00000004
i 00000008

这就是内存对齐而导致的问题

为什么会有内存对齐

以下内容节选自《Intel Architecture 32 Manual》。
 字,双字,和四字在自然边界上不需要在内存中对齐。(对字,双字,和四字来说,自然边界分别是偶数地址,可以被4整除的地址,和可以被8整除的地址。)
 无论如何,为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。
 一个字或双字操作数跨越了4字节边界,或者一个四字操作数跨越了8字节边界,被认为是未对齐的,从而需要两次总线周期来访问内存。一个字起始地址是奇数但却没有跨越字边界被认为是对齐的,能够在一个总线周期中被访问。

    如果不在编码时指定内存对齐方式,由于不同平台有不同的默认对齐方式从而造成通讯时不同平台数据通信数据处理问题,需要注意

转载于:https://www.cnblogs.com/totem1990/archive/2012/09/08/2677117.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值