C语言复习--内存对齐

#pragma pack(n) //内存对齐的指定方式

内存对齐就是不同类型的数据在内存中按照一定的规则排列。而不一定是顺序的一个接一个的排列。

比如

struct Test1

{

char c1;

short s1;

char c2;

int i;

};

struct Test2

{

char c1;

char c2;

short s1;

int i;

};

他们占的内存是不一样的。第一个占12个字节,第二个占8个字节。为什么呢?这就是内存对齐

原因如下

 cpu对内存的读取不是连续的,而是分块的读取的,块的大小只能是1,2,4,8...等等。读取的数据没对齐,则需要两次总线周期访问内存,因此性能会打折扣。

而#pragma pack 可以用来指定内存对齐方式,能改变内存对齐的方式。

比如#pragma pack(1);

#pragma pack(1)
struct Test1

{

    char c1;

    short s1;

    char c2;

    int i;
};
#pragma pack(1)
struct Test2
{

    char c1;

    char c2;

    short s1;

    int i;
        
};

结构体占用内存大小的规则

1第一个成员起始于0偏移处。

2每个成员按其大小和pack参数中较小的一个进行对齐

偏移地址必须能被对齐参数整除,结构体成员的大小取其内部长度最大的数据成元作为其大小。

3机构体长度必须被所有对齐参数的整数倍。

编译器默认为4字节对齐。

#pragma pack(4)
struct Test1

{
                      //对齐参数(模数)      偏移地址    大小
    char c1;    //  1                    0                  1

    short s1;  //   2                    2                  2

    char c2;  //   1                     4                  1

    int i;        //   4                     8                  4
};

#pragma pack(8)//注意这里有的编译器不支持8字节对齐。会自动变成4字节对齐

struct Test3
{                //对齐参数      偏移地址    大小
    short c1;   //2                       0        2
    long l;        //4                      4        4        
};
struct Test4
{
                    //对齐参数      偏移地址    大小
    short c1;        //    2                0           2
    struct Test3 t3;//    4              4            8
    double e;        //  8 (4)     16 (12)         8       8字节对齐大小为24。4字节对齐大小为20
};

学习交流群199546072

猜你喜欢

转载自blog.csdn.net/qq_39809601/article/details/81709844