关于C++内存对齐的问题
要想弄清楚C++的内存对齐,需要从以下几个方面入手:
1.什么是内存对齐?
2.为什么要内存对齐?
3.如何做到内存对齐?
这方面内容有点繁琐,慢慢讲下去吧!
1.什么是内存对齐?
所谓内存对齐,就是根据一定的规则将变量存储在内存中。这样说可能有些笼统,大部分人还理解不了。请大家跟着下面的讲解慢慢体会。
2.为什么要内存对齐?
从平台的角度来讲,并不是所有的硬件平台都可以访问任意地址上的任意数据,某些硬件收到限制,只能获取某些地址上的某一类型的数据。这时候通过内存对齐就可以解决硬件异常的问题。
从性能角度来讲,CPU在读取内存数据的时候,如果是内存对齐的,那么CPU会根据对齐的方式读一次,否则,CPU会来回读很多次才能读到数据。这样就大大提高了CPU的访问速度。
3.如何做到内存对齐?
先来测试一下:
定义一个结构体:
Struct A
{
Char a;
Int b;
Short c;
}
请问这个结构体所占用的内存空间是多少字节?
有人肯定毫不犹豫,感觉很简单,说是7个字节。Char占1个字节,int占4个字节,short占2个字节,1+4+2=7.呵呵。。,告诉你答案是12.
对齐规则:
1、 对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是min(#pragma pack()指定的数,这个数据成员的自身长度) 的倍数。
2、 在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
#pragma pack(n) 表示设置为n字节对齐。 VC6默认8字节对齐。
按照这一规则我们就可以算出:
a变量的偏移量是0,b变量的偏移量是4,c变量的偏移量是8,所以大致分布是这样的:0xxx|4567|89|xx
记得补齐最后一个规则,因为int占4个字节,整个结构体所占的字节也应该是4的倍数,所以最后补上2个字节成为12字节。