博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sizeof 计算 struct 占字节数的方法总结
阅读量:5237 次
发布时间:2019-06-14

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

矛盾焦点:

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 一 trystruct 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大于等于结构体所占最大空间的类型的字节数的情况,按照默认对齐方式处理

上述代码有一个疑问点:

 

//try 一 trystruct 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 = 24struct G{};int GCount = sizeof(G);cout << "G count = " << GCount << endl;  //G count = 1

 

 

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

转载于:https://www.cnblogs.com/azbane/p/11299353.html

你可能感兴趣的文章
php学习笔记
查看>>
28 hashlib 模块 logging 模块 和 configparser模块 functools模块的偏函数partial
查看>>
普通求素数和线性筛素数
查看>>
React Router 4.0 基本使用
查看>>
作业完成2
查看>>
PHP截取中英文混合字符
查看>>
HTA - OnKeyDown
查看>>
【洛谷P1816 忠诚】线段树
查看>>
CDN 学习笔记
查看>>
电子眼抓拍大解密
查看>>
Linux系统下 /etc/shadow 档案结构
查看>>
多线程---线程间的通信
查看>>
poj 1331 Multiply
查看>>
严重: 文档无效: 找不到语法。 at (null:2:19)
查看>>
tomcat7的数据库连接池tomcatjdbc的25个优势
查看>>
Html 小插件5 百度搜索代码2
查看>>
nodejs-Path模块
查看>>
P1107 最大整数
查看>>
EasyDarwin开源手机直播方案:EasyPusher手机直播推送,EasyDarwin流媒体服务器,EasyPlayer手机播放器...
查看>>
监控CPU和内存的使用
查看>>