sizeof 计算 struct 占字节数的方法总结

矛盾焦点:

1、结构体的内存对齐方式

 

字节对齐的目的:

1、提高CPU存储变量的速度

 

计算的核心点(默认对齐方式):

1、结构体内的每一个成员的起始地址跟结构体起始地址的偏移量要刚好是自己字节数的整数倍,不足则自动填充。

2、结构体总的字节大小要刚好是结构体的字节边界数的倍数,不足则自动填充。(字节边界数:结构体中占用最大空间的类型的字节数)

3、static修饰的结构体成员不占用结构体字节数,因为静态变量的存储地址跟结构体的实例地址无关。

4、空结构体的字节数为1,因为必须保证结构体的实例地址唯一。

 

计算的核心点(#pragma pack设置字节对齐大小):

#pragma pack(push)

#pragma pack(n)

...

#pragma pack(pop)

一、结构体每个成员的地址偏移量

1、如果n大于等于当前成员的字节数,则当前成员的地址偏移量要刚好是自己字节数的整数倍,不足则自动填充。

2、如果n小于当前成员的字节数,则当前成员的地址偏移量要刚好是n的整数倍,不足则自动填充。

二、结构体总的字节数

1、如果n大于等于结构体中占用最大空间的类型的字节数,则结构体总字节数大小要刚好是结构体中占用最大空间的类型的字节数的整数倍。

2、如果n小于结构体中最大空间的类型的字节数,则结构体总字节数的大小要刚好是n的整数倍。

 

计算的核心(补充):

1、static修饰的结构体成员不占用结构体字节数,因为静态变量的存储地址跟结构体的实例地址无关。

2、空结构体的字节数为1,因为必须保证结构体的实例地址唯一。

 

//try 一 try

struct F
{
    char a;
    short b;
    double c;
    float d;
    char e;
};
int FCount = sizeof(F);
cout << "F count = " << FCount << endl;  //F count = 24

#pragma back(push)
#pragma pack(2)
struct E
{
    char a;
    short b;
    double c;
    float d;
    char e;
};
#pragma back(pop)

int ECount = sizeof(E);
cout << "E count = " << ECount << endl;  //E count = 18

//n大于等于结构体所占最大空间的类型的字节数的情况,按照默认对齐方式处理

上述代码有一个疑问点:https://www.cnblogs.com/azbane/p/11299354.html

 

//try 一 try
struct FF
{
    char a;
    short b;
    double c;
    float d;
    char e;
    static double h;
};

int FFCount = sizeof(FF);
cout << "FF count = " << FFCount << endl;  //FF count = 24

struct G
{

};
int GCount = sizeof(G);
cout << "G count = " << GCount << endl;  //G count = 1

 

 

追加:类类型占据字节数跟结构体的计算方法一致。

原文链接: https://www.cnblogs.com/azbane/p/11299353.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    sizeof 计算 struct 占字节数的方法总结

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/398573

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月12日 上午9:44
下一篇 2023年4月12日 上午9:44

相关推荐