关于C++内存对齐的问题

来源:互联网 发布:白蚂蚁网络技术论坛 编辑:程序博客网 时间:2024/05/18 18:03


关于C++内存对齐的问题

 

要想弄清楚C++的内存对齐,需要从以下几个方面入手:

1.什么是内存对齐?

2.为什么要内存对齐?

3.如何做到内存对齐?

这方面内容有点繁琐,慢慢讲下去吧!

 

1.什么是内存对齐?

所谓内存对齐,就是根据一定的规则将变量存储在内存中。这样说可能有些笼统,大部分人还理解不了。请大家跟着下面的讲解慢慢体会。

2.为什么要内存对齐?

从平台的角度来讲,并不是所有的硬件平台都可以访问任意地址上的任意数据,某些硬件收到限制,只能获取某些地址上的某一类型的数据。这时候通过内存对齐就可以解决硬件异常的问题。

从性能角度来讲,CPU在读取内存数据的时候,如果是内存对齐的,那么CPU会根据对齐的方式读一次,否则,CPU会来回读很多次才能读到数据。这样就大大提高了CPU的访问速度。

3.如何做到内存对齐?

先来测试一下:

定义一个结构体:

Struct A

{

Char a;

Int b;

Short c;

}

请问这个结构体所占用的内存空间是多少字节?

有人肯定毫不犹豫,感觉很简单,说是7个字节。Char1个字节,int4个字节,short2个字节,1+4+2=7.呵呵。。,告诉你答案是12.

对齐规则:

1  对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是min(#pragma pack()指定的数,这个数据成员的自身长度的倍数。

2  在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。

 

#pragma pack(n) 表示设置为n字节对齐。 VC6默认8字节对齐

按照这一规则我们就可以算出:

       a变量的偏移量是0b变量的偏移量是4c变量的偏移量是8,所以大致分布是这样的:0xxx|4567|89|xx

    记得补齐最后一个规则,因为int4个字节,整个结构体所占的字节也应该是4的倍数,所以最后补上2个字节成为12字节。

 

 

 

0 0
原创粉丝点击