到底为什么要进行字节对齐?
最近一段时间总是被内存对齐这个问题困扰着,上网查找了一些资料,可以说这些资料讲解的都是一个模板,就是为了提高cpu的访问效率,如果对齐的话需要一个时钟周期访问,那么不对齐的话就需要两个时钟周期访问,所以要进行字节对齐,说一句不太好听的话,全是废话,谁不知道是为了提高访问效率,还用他们说,都没有讲解出到底为什么要进行内存对齐(不需要告诉我这是为了提高cpu的效率,呵呵!),cpu是如何通过数据总线来读取内存中的数据?
这个是我个人的理解(不知道对不对):
内存访问粒度是不变的,现在的计算机中cpu的内存访问粒度是四个字节,也就是每次从内存中总是取四个字节的数据,如果不存在char与short类型的数据的话cpu每次都会取得想要的值,不用进行一个剔除就能够得到想要的,可是事实上是存在char类型与short类型的数据,这样cpu在取这两种类型的数据的时候就需要进行剔除了,因此在效率上就存在了一个损失,但是永远都不可能实现“利益”的最大化,虽然在效率上存在一定的损失,可是却节约了一部分的内存空间,字节对齐只是一个折中的方法,这种方法并不是十全十美的!!
计算机都有一个默认的对齐模数,如果说默认对齐的模数是四个字节的话,那么是不是每个类型的数据都会对齐到四个字节呢??比如说一个char类型的数据a和一个short类型的数据1 ,char类型数据起始地址是0x00的话,那么按照默认的四字节对齐,应该是这样的吗?
0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08
0a cc cc cc 01 cc cc cc cc
后面的字节是为了四字节对齐而填充的呢?
不知道我的理解是否是对的!望高手指正!!
但是如果我们设置了对齐字节数的话,比如我们设置了#pragma pack(1),这样计算机中默认的对齐字节数就不再发挥作用了??
这样对齐的字节数就会按照有效对齐字节数来进行字节对齐呢?
如:
0x00 0x01 0x02
0a 01 cc
我的这个理解是对的吗??望指正!!
如果我的理解没有问题的话,那么为什么还要设置字节对齐呢??这样不是在cpu访问效率上是一种损失吗如果是提高cpu的访问效率的话,因为数据总线的宽度是32位的,那为什么不把每一个类型的数据都设置为四个字节对齐呢???难道就是为了节约内存空间而损失了访问效率?
希望高手能够给出一个全面的解释呀!呵呵!