矛盾焦点:

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 占字节数的方法总结的更多相关文章

  1. js计算字符串的字节数和字符串与二进制的相互转化

    一.js计算字符串的字节数方法: //blob获取字符串的字节 var debug = "好的"; var blob = new Blob([debug],{type : 'tex ...

  2. Java不同编码方式,中英文字符所占字节数

    测试代码 public class Test { public static void main(String[] args){ String[] charsetNames={ "UTF-8 ...

  3. 10055 - Hashmat the Brave Warrior & 各数据类型所占字节数 (C语言)

    Problem A Hashmat the brave warrior Input: standard input Output: standard output Hashmat is a brave ...

  4. 数据类型对应字节数(32位,64位 int 占字节数)

    数据类型对应字节数(32位,64位 int 占字节数) 可用如sizeof(char),sizeof(char*)等得出 32位编译器: char :1个字节 char*(即指针变量): 4个字节(3 ...

  5. java 8种基本数据类型的默认值及所占字节数

    通过一段代码来测试一下 8种基本数据类型的默认值 package dierge; public class Ceshi { int a; double b; boolean c; char d; fl ...

  6. GCC下32位与64位机器类型变量所占字节数

    GCC下32位与64位机器类型变量所占字节数 在C语言中,编译器一般根据自身硬件针对类型变量来选择合适的字节大小,下面列举一下在GCC编译器下32位机器与64位机器各个类型变量所占字节数目: C语言 ...

  7. java中8种数据类型和默认值所占字节数

    java 8种基本数据类型的默认值及所占字节数 通过一段代码来测试一下 8种基本数据类型的默认值 1 package dierge; 2 3 public class Ceshi { 4 int a; ...

  8. mysql的索引key_len计算方法,及个字段所占字节数

    key_len的长度计算公式: varchr(10)变长字段且允许NULL = 10 * ( character set:utf8=3,gbk=2,latin1=1)+1(NULL)+2(变长字段) ...

  9. java基本数据类型所占字节数

    JAVA基本数据类型所占字节数是多少?(32位系统) byte     1字节                short    2字节                int      4字节      ...

随机推荐

  1. ipxe(可选):winboot:网络引导(启动)wim格式的windows PE系统:配置文件写法

    ipxe 无盘[网络]引导wim格式的pe系统 wimboot引导程序需要为其提供4个内核参数 bcd bootmgr boot.sdi boot.wim 所需文件附件 以下是我的可用的ipxe的配置 ...

  2. JavaScript 加减危机——为什么会出现这样的结果?

    在日常工作计算中,我们如履薄冰,但是 JavaScript 总能给我们这样那样的 surprise~ 0.1 + 0.2 = ? 1 - 0.9 = ? 如果小伙伴给出内心的结果: 0.1 + 0.2 ...

  3. vb Replace 实现

    今天改一个VB程序时发现程序自带的replace 函数不知什么原因竟然不好用了 所以就自己写了一个玩玩 记录一下 'XGZ '替换字符 Private Function Replace1(ByVal ...

  4. saltstack的简单搭建

    环境; centos 7     192.168.10.10    master centos 7     192.168.10.129  minion 1.为了方便关闭防火墙 [root@local ...

  5. redis的主从复制,哨兵值守

    环境: 主服务器:192.168.10.10    Centos 7  redis-5.0.4 从服务器:192.168.10.129  Centos 7  redis-5.0.4 从服务器:192. ...

  6. $.fn.extend 与 $.extend的区别

    今天看到别人写的jquery 代码都是这样的 $.fn.extend 所以查询了一下,因为自己不是前端开发,看到这样写的,感觉很牛逼.从百度上搜到的感觉解释的还是挺好的,作为记录,方便以后查找. 搜索 ...

  7. js数组去重 数组拼接 替换数组中的指定值 递归数组 判断数组中是否存在指定值 数组求和 根据条件判数组值

    这是学习过程中记录的一些关于数组操作的常用属性或方法,记录一下方便以后使用. // 数组去重 var arr1 = [1,1,2,3,4,5,6,3,2,4,5,'a','b','c','a',6,7 ...

  8. springboot 启动停止脚本

    https://www.cnblogs.com/lovychen/p/6211209.html   参考 centos 转码解决方案: yum install dos2unix dos2unix ** ...

  9. Python可视化查看数据集完整性: missingno库(用于数据分析前的数据检查)

    数据分析之前首先要保证数据集的质量,missingno库提供了一个灵活易用的可视化工具来观察数据缺失情况,是基于matplotlib的,接受pandas数据源 快速开始 样例数据使用 NYPD Mot ...

  10. bat 获取管理员权限,判断系统位数,获取当前文件所在目录,regsvr32注册DLL、OCX

    1.获取管理员权限 @echo off if exist "%SystemRoot%\SysWOW64" path %path%;%windir%\SysNative;%Syste ...