C语言复习--内存对齐
发布日期:2022-02-17 02:39:45 浏览次数:28 分类:技术文章

本文共 1015 字,大约阅读时间需要 3 分钟。

#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

转载地址:https://blog.csdn.net/qq_39809601/article/details/81709844 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:C语言复习--#和##
下一篇:Windows系统安装Linux虚拟机

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月24日 21时32分13秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章