以下内容摘自此处:
作者:太平小小草
链接:https://www.jianshu.com/p/e772fff47465
来源:简书

结构体大小计算有三个原则:
一,结构体变量的首地址,必须是结构体 "最宽基本类型成员" 大小的整数倍(0被认为是任何数的整数倍)。
二,结构体每个成员相对于结构体首地址的偏移量,都是该成员的整数倍
三,结构体的总大小,为结构体 “最宽基本类型成员” (将嵌套结构体里的基本类型也算上,得出的最宽基本类型) 大小的整数倍

个人理解其中最宽基本类型成员:指的就是占字节数最大的类型成员。下面给出一个表格,方便查看各个类型的字节数:

下面给出一些计算结构体大小的例子:

1.简单结构体

1.1

struct s1{char ch1;
char ch2;
int i;
};

这个结构体的大小容易计算,为8。ch1和ch2共同占4字节,i占4字节,共8字节。

1.2

struct s1{char ch1;
int i;
char ch2;
};

这个和上面哪个只是结构体成员顺序换了一下,但大小就变成了12。是因为要满足偏移量是成员的整数倍,ch1偏移量是0,i的偏移量不可能是1,因为1不是i(大小4)的倍数,所以i的偏移量是4,ch2的偏移量就变为了8,加ch2是9,要满足结构体大小是成员大小整数倍,就是12。

2.成员包含数组的结构体

2.1

struct s2{char ch;
int i;
char str[10];
};

这个结构体的大小是20,先看前两个成员,大小是8,毋庸置疑,这个char类型的数组,只需要把它看做十个char连在一起即可,加起来就是18,再满足结构体大小为成员整数倍,所以大小就是20。
含数组成员A array[n],就把这个数组看成n个A类型的数据连在一起即可。

3.嵌套结构体的结构体

3.1

struct s3{char ch;int i;struct s{char ch1;int j;}sub;float f;
};

里面这个结构体的大小是8,那么是否结构体大小就要向8对齐呢?这个结构体的大小是20,很明显不是8的倍数。所以计算结构体大小时是把里面这个结构体就看做是一个char,和一个int,不是看做一个整体。
最宽基本类型成员是j (4位),则
ch占4个字节,i占4个,ch1占4个,j占4个,f占4个,一共20。

3.2

struct s3{char ch;char i;struct s{char ch1;int j;}sub;char f;
};

注意这里结构体(s3)里的结构体(s)内的数据并不能与之前的数据进行内存对齐。
s里面的ch1与上面的ch,i不能共同占用4个字节,得另外开辟4个字节内存。这点需要注意一下。故大小为4+4+4+4=16而不是4+4+4=12。

3.3

struct s3{char ch;char i;struct s{char ch1;double j;}sub;char f;
};

最宽基本类型成员是j (8位),则
ch和i共占8个字节,ch1占8个,j占8个,f占8个,一共32。

4.成员包含联合体的结构体

4.1

struct s5{char ch;
int i;
union{char ch1;
int j;
};
};

联合体大小就是成员中最大类型的大小,所以这个结构体大小是12.
4(ch)+4(i)+4(j)=12。

5.指定对齐值

指定对齐值:#pragma pack(n) //指定向n对齐
#pragma pack(n) 若以 #pragma pack()作结束,表示该种对齐方式至此为止。

5.1对齐值小于最大类型成员值

#pragma pack(4)  //指定向4对齐 最大是8
struct s6{char ch;
int i;
float f;
double d;
};

如果我们没有指定对齐值,这个结构体大小是8(ch、i)+8(f)+8(d)=24,我们指定向4对齐,所以大小是4的倍数,所以结构体大小是4(ch)+4(i)+4(f)+4(d)+4(d)=20。

5.2对齐值大于最大类型成员值

#pragma pack(10) //指定向10对齐 最大是8
struct s7{char ch;
int i;
float f;
double d;
};

我们指定的对齐值是10,最大为8,是否就向10对齐?不是,当指定对齐值大于自身对齐值时,向自身对齐值对齐,大小是24,即8(ch、i)+8(f)+8(d)=24。

总的来说,应向指定对齐值和自身对齐值中较小的那个值对齐。

结构体大小如何计算?相关推荐

  1. C语言结构体大小;结构体嵌套结构体大小的计算方法分析

    C语言结构体大小:结构体嵌套结构体大小的计算方法分析! 在了解结构体大小如何计算之前,我们首先得了解结构体的对齐规则: 第一个成员在与结构体变量偏移量为0的地址处: 其他成员变量要对齐到某个数字(对齐 ...

  2. 【C语言进阶深度学习记录】二十 结构体大小计算与结构体内存布局的详细方法

    结构体大小的计算往往是面试笔试常考的知识.对于简单的结构体,可以一眼看出来,对于复杂的结构体,该如何计算结构体占用内存的大小呢? 本文学习所使用的编译器是gcc 4.4.5 使用其他编译器或者使用Wi ...

  3. (C语言)计算结构体大小——结构体内存对齐

    本篇文章计划用简单的方式向大家介绍如何计算结构体大小这一问题 首先我们必须明确一件事,想要计算结构体大小,就不得不了解结构体内存对齐的规则 一.结构体的对齐规则 1.第一个成员在在与结构体变量为0的地 ...

  4. C/C++ sizeof函数解析——解决sizeof求结构体大小的问题

    C/C++ sizeof函数解析--解决sizeof求结构体大小的问题 参考文章: (1)C/C++ sizeof函数解析--解决sizeof求结构体大小的问题 (2)https://www.cnbl ...

  5. 【转】彻底搞清计算结构体大小和数据对齐原则

    数据对齐: 许多计算机系统对基本数据类型合法地址做出了一些限制,要求某种类型对象的地址必须是 某个值K(通常是2,4或8)的倍数.这种对齐限制简化了形成处理器和存储器系统之间的接口的硬件 设计.例如, ...

  6. C和指针之结构体大小和成员变量位置距离结构开始存储的位置偏移字节

    1.问题 1).结构体大小 结构体成员的内存分配满足下面三个条件   2 结构体第一个成员的地址和结构体的首地址相同   3 结构体每个成员地址相对于结构体首地址的偏移量是该成员大小的整数倍,如果不是 ...

  7. Windows下struct和union字节对齐设置以及大小的确定(一 简介和结构体大小的确定)...

    在windows下设置字节对齐大小的方式,目前我了解有三种: 1. 在编译程序时候的编译选项  /Zp[n],如 cl /Zp4 表示对齐大小是4字节: 2. 预处理命令   #pragma pack ...

  8. C语言结构体详解(结构体定义,使用,结构体大小等)

    c语言结构体详解 1.c语言结构体 1.1 结构体基础知识 1.2 结构体声明 1.3 结构体特殊声明 1.4 结构体的自引用 1.5 结构体的大小的计算 1.5.1了解结构体大小计算规则 1.5.2 ...

  9. std::tuple、std::tie(可用于结构体大小比较)、std::pair用法

    1.tuple应用: 解释:是一个元组,可包含无限多不同类型变量,pair的升级版,但没有pair得成员变量first.second. 1.1.代码: // tuple example #includ ...

最新文章

  1. 嵌入式开发板加载U盘,U盘测试
  2. DB2安装过程中可能遇到的错误
  3. mysql注入ctf_CTF SQL注入
  4. 1.11 抽象(abstract)类
  5. hive 字符串替换指定字符_hive学习笔记:substr()——字符串截取
  6. .NET开发者省份分布排名
  7. Kafka启动出现Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Pr
  8. Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之构建灵活的UI
  9. C# Winform 使用二维码
  10. Flink on yarn
  11. Linux 初始化之 Systemd机制简介
  12. jasper 常用知识点总结
  13. Smack+OpenFire搭建IM通信,包含心跳和自动重连(Android实现)
  14. 微服务系统和分布式系统的区别
  15. ps数位板绘画遇到问题总结
  16. 分享200个App移动端模板
  17. Win10 22H2更新时间 Win10 22H2怎么更新
  18. ASUS华硕天选2 FX506H INTELI711代CPU 原装出厂系统恢复原厂系统
  19. 1.C语言变量类型、全局变量、局部变量
  20. python爬取每日一文meiriyiwen.com

热门文章

  1. visio里去掉背景虚线
  2. 宽电压输入8-100V降压5V12V/1.5A2A电动车降压芯片方案
  3. 倍福位置记忆--TwinCAT对绝对值编码器溢出圈数的处理--以汇川IS620N为例
  4. Linux下execl函数学习
  5. Python数据分析_Pandas入门_探索酒类消费数据_Drinks
  6. Win10系统怎样关闭Windows Defende杀毒软件
  7. uniapp 全端小程序接入广告
  8. vc2010c语言使用教程,【精选】Lesson 01 C语言基础及VC2010使用指导(02.24).pdf
  9. linux没有检测到触摸板,linux – 未检测到触控板
  10. 如何简单快速卸载百度安全卫士-for win7