内存对齐

来源:互联网 发布:mysql查询两个表 编辑:程序博客网 时间:2024/06/06 06:56
内存对齐原因
        主要是两个方面的原因:
        (1):平台原因(方便移植)
        不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常;
        (2):性能原因
        数据结构应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
对齐规则
        每个特定平台上的编译器都有自己默认的对齐系数。允许程序员通过预编译指令#pragma pack(n)来改变这一系数。其中n表示要指定的“对齐系数”。
        具体规则如下(以win32平台下结构体为例):
        (1):结构体变量的首地址为其最长基本类型成员的整数倍;
        (2):结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,需要时编译器会填充字节;
        (3):结构体的总大小为结构体最宽基本类型成员大小的整数倍,需要时,编译器会在结构体末端填充字节
        注:每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。因此,当n的值等于或者超过所有数据成员的长度时,这个值将不产生任何效果。
举例
#include <iostream>using namespace std;struct A{/* data */char a;long b;};struct B{/* data */char a;struct A b;long c;};struct C{/* data */char a;struct A b;double c;};struct D{/* data */char a;struct A b;double c;int d;};struct E{/* data */char a;int b;struct A c;double d;};int main(){cout << "A:" << sizeof(A) << endl;cout << "B:" << sizeof(B) << endl;cout << "C:" << sizeof(C) << endl;cout << "D:" << sizeof(D) << endl;cout << "E:" << sizeof(E) << endl;cin.get();return 0;}

        根据对齐规则,上述代码的运行结果为:
        A:8
        B:16
        C:24
        D:32
        E:24

        注:在结构体B中,最长的数据类型字节数为4而不是8,这里指的是基本数据类型
原创粉丝点击