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
追加:类类型占据字节数跟结构体的计算方法一致。
sizeof 计算 struct 占字节数的方法总结的更多相关文章
- js计算字符串的字节数和字符串与二进制的相互转化
一.js计算字符串的字节数方法: //blob获取字符串的字节 var debug = "好的"; var blob = new Blob([debug],{type : 'tex ...
- Java不同编码方式,中英文字符所占字节数
测试代码 public class Test { public static void main(String[] args){ String[] charsetNames={ "UTF-8 ...
- 10055 - Hashmat the Brave Warrior & 各数据类型所占字节数 (C语言)
Problem A Hashmat the brave warrior Input: standard input Output: standard output Hashmat is a brave ...
- 数据类型对应字节数(32位,64位 int 占字节数)
数据类型对应字节数(32位,64位 int 占字节数) 可用如sizeof(char),sizeof(char*)等得出 32位编译器: char :1个字节 char*(即指针变量): 4个字节(3 ...
- java 8种基本数据类型的默认值及所占字节数
通过一段代码来测试一下 8种基本数据类型的默认值 package dierge; public class Ceshi { int a; double b; boolean c; char d; fl ...
- GCC下32位与64位机器类型变量所占字节数
GCC下32位与64位机器类型变量所占字节数 在C语言中,编译器一般根据自身硬件针对类型变量来选择合适的字节大小,下面列举一下在GCC编译器下32位机器与64位机器各个类型变量所占字节数目: C语言 ...
- java中8种数据类型和默认值所占字节数
java 8种基本数据类型的默认值及所占字节数 通过一段代码来测试一下 8种基本数据类型的默认值 1 package dierge; 2 3 public class Ceshi { 4 int a; ...
- mysql的索引key_len计算方法,及个字段所占字节数
key_len的长度计算公式: varchr(10)变长字段且允许NULL = 10 * ( character set:utf8=3,gbk=2,latin1=1)+1(NULL)+2(变长字段) ...
- java基本数据类型所占字节数
JAVA基本数据类型所占字节数是多少?(32位系统) byte 1字节 short 2字节 int 4字节 ...
随机推荐
- Flink基本的API(续)
上一篇介绍了编写 Flink 程序的基本步骤,以及一些常见 API,如:map.filter.keyBy 等,重点介绍了 keyBy 方法.本篇将继续介绍 Flink 中常用的 API,主要内容为 指 ...
- jquery-ajax请求.NET MVC 后台
在ajax的URL中写上"/你的控制器名/你方法名" 在后台控制器中对应有两个常用类型一个是ActionResult还有一个是JsonResult 在访问时需要在类型上加上publ ...
- axios FastMock 跨域 代理
发送请求: 实现:发送请求,获取数据. 原本想自己写服务,后来无意间找到FastMock这个东东,于是就有了下文... 首先我安装了axios,在fastmock注册好了并创建了一个接口,怎么搞自行百 ...
- 通用高效字符串匹配--Sunday算法
字符串匹配(查找)算法是一类重要的字符串算法(String Algorithm).有两个字符串, 长度为m的haystack(查找串)和长度为n的needle(模式串), 它们构造自同一个有限的字母表 ...
- beyond compare全文件夹比较,仅显示变化的文件
beyond compare是一款非常优秀的文件夹同步比较工具,赞. 非常强大的一点就是给定两个文件夹可以自动列出所有不同的文件和子文件夹,但是有一点可能很多人碰到过,也就是需要一个个点开才能重新比 ...
- 学习笔记之Web
学习笔记之JavaScript - 浩然119 - 博客园 https://www.cnblogs.com/pegasus923/p/9436340.html 学习笔记之PHP - 浩然119 - 博 ...
- three 3D实例学习
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 在dockers中调试dump的dotnet程序
其他调试参考文章 centos7使用lldb调试netcore应用转储dump文件 centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试) 生成dump文件 如何在 ...
- linux 下 Google配置SwitchyOmega
本文是在linux配置shadowssocks中配置的,windows也可以 通过上一篇文章我们学会了如何科学上网, 但是我们使用SwitchyOmega时选择的是proxy的代理模式 就是说我们不 ...
- Python自动化:自动化发送邮件之SMTP
自动发送邮件,作为自动化测试的流程之一,可以将运行后的测试报告自动发送至指定的对象,形成一次自动化的完整闭环,基于Python来实现的有关自动化发送邮件的内容,加上注释做了一个小小的整理. 话不多说直 ...