内存对齐的原因和规则

内存对其的解释:

对齐规则是按照成员的声明顺序,依次安排内存,其偏移量为成员大小的整数倍,0看做任何成员的整数倍,最后结构体的大小为最大成员的整数倍。

为什么要内存对齐?原因有以下几点:

1、CPU对内存的读取不是连续的,而是分成块读取的,块的大小只能是1、2、4、8、16…字节;
参考:https://blog.csdn.net/mtv_zmx/article/details/8995456
2、当读取操作的数据未对齐,则需要两次总线周期来访问内存,因此性能会大打折扣;
参考:https://blog.csdn.net/chen895281773/article/details/9567337
3、某些硬件平台只能从规定的相对地址处读取特定类型的数据,否则会产生异常。

数据成员对齐规则:

结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset(偏移)为0的地方,以后每个数据成
员的对齐按照 #pragma pack 指定的数值和这个数据成员自身长度中,比较小的那个进行

结构(或联合)的整体对齐规则:

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

结构体作为成员:

如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。
#pragma pack(n) 对齐系数
Linux 32 默认 #pragma pack(4)
Linux 64 默认 #pragma pack(8)

#include 
/*#pragma pack(4)*/

using std::cout;
using std::endl;

struct x
{
    char a;   
    int b;    
    short c;  
    char d;   

}MyStructX;//12

struct y
{
    int b;   
    char a;  
    char d;  
    short c;  

}MyStructY;//8

struct SS
{
    int a;     
    char b;    
    short c;   
    int d;     
    struct FF   
    {
        int a1;  
        char b1;  
        short c1;  
        char d1;   

    }MyStructFF;  //24

#if 1
    /* char e;//28 */
    int e;  //32
    double ww;//40
#endif
}MyStructSS;


struct DD
{
    int a;
    char b;
    short c;
    int d;

    struct FF
    {
        double a1;
        char b1;
        short c1;
        char d1;

    }MyStructFF;

    char e;


}MyStructDD;//40

struct GG
{
    char e[2];  
    short h;  

    struct A   //8
    {
        int a;  
        double b;  //16
        float c; //24

    }MyStructA;

}MyStructGG;//32

int main(int argc, char **argv)
{
    cout <<"sizeof(MyStructX) = " << sizeof(MyStructX) << endl;
    cout <<"sizeof(MyStructY) = " << sizeof(MyStructY) << endl;
    cout <<"sizeof(MyStructSS) = " << sizeof(MyStructSS) << endl;
    cout <<"sizeof(MyStructDD) = " << sizeof(MyStructDD) << endl;
    cout <<"sizeof(MyStructGG) = " << sizeof(MyStructGG) << endl;

    return 0;

}

程序运行结果如下图所示:

sizeof(MyStructX) = 12
sizeof(MyStructY) = 8
sizeof(MyStructSS) = 40
sizeof(MyStructDD) = 40
sizeof(MyStructGG) = 32

你可能感兴趣的:(C/C++面试题)