字节对齐原则

1 字节对齐的定义

        (1)在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然边界(alignment)分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。
        (2)为了使CPU能够对变量进行快速的访问,变量的起始地址应该具有某些特性,即所谓的”对齐”.比如4字节的int型,其起始地址应该位于4字节的边界上,即起始地址能够被4整除.

2 字节对齐的好处

        (1)字节对齐的作用不仅是便于cpu快速访问。
        (2)同时合理的利用字节对齐可以有效地节省存储空间。
        (3)对于32位机来说,4字节对齐能够使cpu访问速度提高,比如说一个long类型的变量,如果跨越了4字节边界存储,那么cpu要读取两次,这样效率就低了。
        (4)但是在32位机中使用1字节或者2字节对齐,反而会使变量访问速度降低。所以这要考虑处理器类型,另外还得考虑编译器的类型。在vc中默认是4字节对齐的,GNU gcc 是默认4字节对齐。

3 字节对齐原则

        (1)第一个成员的首地址为0.

        (2)每个成员的首地址是自身大小的整数倍

        (3)结构体的总大小,为其成员中所含最大类型的整数倍。

4 自定义字节对齐的方式

        (1)使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。
        (2)使用伪指令#pragma pack(),取消自定义字节对齐方式。

        (3)__attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。 ·
        (4)attribute ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。

5 举例


typedef struct data_type1{
    char a[2];
    short b;
    int c;
} Data_type1;// 8字节
typedef struct data_type2{
    short a;
    Data_type1 b; //Tips: 这部分按里面最大成员大小对齐 所以要补. 至于补多少……
    char c[2];
} Data_type2;// 16 字节,对于结构体中套结构体需要解析到最终的类型

typedef struct data_type3{
    short a;
    double b; 
    char c[2];
} Data_type3; // 24 字节  2 + 6 + 8 + 2 + 6 ,符合一般的字节对齐原则

上述代码中Data_type1 的大小为8字节,Data_type2的大小为16字节,Data_type3的大小为24字节。对于结构体中套结构体,需要展开到基本数据类型,来进行对齐。     

你可能感兴趣的:(C++精进之路,c语言,c++)