struct和union大小的计算方法

结构体占用内存大小如何确定?-->结构体字节对齐 | C语言 结构体字节对齐 阅读详情

struct

结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间。和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。看下面这样的一个结构体:

  struct stu1

  {

  int i;

  char c;

  int j;

  };

  先介绍一个相关的概念——偏移量。偏移量指的是结构体变量中成员的地址和结构体变量地址的差。结构体大小等于最后一个成员的偏移量加上最后一个成员的大小。显然,结构体变量中第一个成员的地址就是结构体变量的首地址。因此,第一个成员i的偏移量为0。第二个成员c的偏移量是第一个成员的偏移量加上第一个成员的大小(0+4),其值为4;第三个成员j的偏移量是第二个成员的偏移量加上第二个成员的大小(4+1),其值为5。

  实际上,由于存储变量时地址对齐的要求,编译器在编译程序时会遵循两条原则:一、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍) 二、结构体大小必须是所有成员大小的整数倍。

  对照第一条,上面的例子中前两个成员的偏移量都满足要求,但第三个成员的偏移量为5,并不是自身(int)大小的整数倍。编译器在处理时会在第二个成员后面补上3个空字节,使得第三个成员的偏移量变成8。

  对照第二条,结构体大小等于最后一个成员的偏移量加上其大小,上面的例子中计算出来的大小为12,满足要求。

  再看一个满足第一条,不满足第二条的情况

  struct stu2

  {

  int k;

  short t;

c语言字节对齐的计算方式 结构体的字节对齐,在笔试中经常考到,这里从下面三段代码简单的总结一下结构体字节对齐的计算方式。 计算的时候需要遵循一个原则,即每个变量的其实地址应该为它长度的整数倍。 struct Data{ int a; char b; short c; }; int main() { struct Data data; cout<<sizeof(data)<<endl; } 输出为8. a的其实地址为0,结束地址为3,起始地址4是1(char的长度) 阅读详情

相关推荐

【Bug已解决】NCCL timeout for validation 解决方案

训练用多卡 DDP / FSDP 正常,但一到或者进程直接 hang 在 eval 的某个集合通信上。最迷惑的是:训练阶段(有集合通信)完全正常,偏偏 eval 阶段(看起来更轻量)超时。因为 eval 阶段某些 rank 没参 collective,导致参的那部分 rank 永远等不到同伴。

一键难忘的博客 123

计算结构体的大小

结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间。数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。看下面这样的一个结构体:   struct stu1   {   int i;   char c;   int j;   };   先介绍一个相关的概念——偏移量。偏移量指的是结构体变

csw_100的专栏 4万+

用C#+Avalonia写跨平台串口工具:Windows/macOS/Linux通吃,还能解析Modbus+画实时曲线

不管是串口还是蓝牙,核心操作都是“打开连接、发数据、收数据、关连接”,先定义一个// 通信设备接口:统一串口/蓝牙的操作// 连接状态变化事件(UI层订阅)// 接收数据事件(收到数据后触发)// 通信配置(不同设备配置不同,用泛型)// 通信设备接口:统一串口/蓝牙的操作 public interface ICommDevice : IDisposable {// 连接状态变化事件(UI层订阅) event Action < bool > OnConnectionChanged;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 947

sizeof(结构体)的大小判断

结构体字节数大小的计算(多种情况)

ajin156的博客 8232

结构体所占内存的字节数如何计算?

我们知道,为了提高内存寻址的效率,很多处理器体系结构为特定的数据类型引入 了特殊的内存对齐需求。不同的系统编译器,内存对齐的方式有所不同,为了满足 处理器的对齐要求,可能会在较小的成员后加入补位,从而导致结构体实际所占内存的 字节数比我们想象的多出一些字节。 下面从4个方面进行阐述: (1)结构体只包含基本数据类型; (2)结构体含有复合数据类型(例如包含strcut uni...

xia__mu的博客 1万+

简单理解C语言结构体长度字节对齐

C语言中结构体长度计算,结构体如何占用空间,结构体的字节对齐宽度,结构体的成员的排列顺序对结构体长度的影响。

denton88的博客 1061

unionstruct大小计算

<br />整理自网络。<br /> <br /> <br /><br />规则:<br />1,对于union,对齐的大小是最大的基本元素的对齐大小;对象的大小必须是该基本元素大小的整数倍;<br />2,对于struct,对齐的大小也是最大的基本元素的对齐大小,对象的大小需要考虑元素的对齐,并且需要是最大基本元素的整数倍;同时有#pragma pack修饰的情况,关于struct请详细参考另外一个帖子。<br />3,这里所说的structunion的对齐,是指其作为其他复杂对象中的元素的时候要求的对

johnnyshao的专栏 1112

unionstruct类型的大小计算

对齐就是要满足存储变量的起始地址对齐大小余数为0。 对于union,分两步:先算union对齐大小,对齐的大小是取决于union成员中字节对齐最大的那个;再算union实际分配的空间,而分配给union的实际大小不仅要满足是对齐大小的整数倍,同时要满足实际大小不能小于最大成员的大小。 如: Union U1 { Char a[9]; Int b; }; 成员a是char数组,对

talentluke的专栏 9264

[C/C++基础知识] 面试再谈structunion大小问题

最近找工作参加了很多笔试,其中考察结构体联合体的大小问题是经常出现的一个问题。虽然题目简单而且分值比较低,但是还是想再给大家回顾下这些CC++的基础知识。希望文章对你有所帮助~ PS:意外惊喜第三部分,所有权归它们公司所有。我只想分享学习并无它,望海涵~ 这面多笔试,让我牢记一点:山外有山,人外有人,尤其是程序猿;但是什么时候都不能丢失自我自己感兴趣的东西,即使再累再苦,做自己喜欢的东西就是幸福,比如写博客、玩爬虫、赏美文、学习新知识。

杨秀璋的专栏 8676

C++中union联合体的内存公用赋值

C++中union联合体的内存公用赋值

qq_43217697的博客 3884

联合体(union)的使用方法及其本质

1.联合体union的基本特性——struct的同不同 union,中文名“联合体、共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)结构体(struct)同样可以包含很多种数据类型变量。 不过区别也挺明显: 结构体(struct)中所有变量是“共存”的——优点是“有容乃大”,全面;缺点是struct内存空间的分配是粗放的,不管用不用,全

zhangzhi123456789的专栏 585

C/C++ 内存对齐原则及作用

struct/class/union内存对齐原则有四个: 1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节, 则要从4的整数倍地址开始存储),基本类型不包括str...

diandiao4618的博客 247

C语言结构体类型占用的内存空间问题。

共用体(union)所占的字节数是最大的成员内存。 结构体(struct)类型占用的内存空间的计算方法: 首先需要确定是在32位系统,还算在64位系统     是所有成员的内存的,但是需要注意,默认情况下是按照32位4字节对齐的,64位系统是根据最大变量的长度确定对齐的,如果最长数据为8字节,则8字节对齐,如果最长数据为4字节,则4字节对齐     32系统4字节对齐时,

Yan_MF的博客 5898

sizeof()用法汇总【转载】

转载自:http://www.cnblogs.com/chengxin1982/archive/2009/01/13/1374575.html 参考:http://blog.csdn.net/freefalcon/article/details/54839    http://baike.baidu.com/view/1078660.htm sizeof()功能:...

weixin_30419799的博客 75

C语言中如何计算结构体的字节大小

结构体内存对齐 在计算结构体所占字节的大小时,不要直观地累加结构体内成员的字节大小,实际结构体存放在内存中是有一定的规则的,这里涉及的规则就是内存对齐原则。 声明一个结构体stu struct stu { char a; int b; double c; short d; }; int main() { struct stu s; printf("%d.\n",sizeof(s)); return 0; } 如果你以为这个结构体大小是(1+4+8+2)个字节,那

努力向前的未来工程师 3100

计算结构体的字节

结构体的大小计算的详细步骤

weixin_74127402的博客 711

结构体所占字节数的计算

结构体所占字节数遵循以下原则: 1、 结构体的大小等于结构体内最大成员大小的整数倍 2、 结构体内的成员的首地址相对于结构体首地址的偏移量是其类型大小的整数倍,比如说double型成员相对于结构体的首地址的地址偏移量应该是8的倍数。 3、 为了满足规则12编译器会在结构体成员之后进行字节填充! 如题 class A { int a; short b;

u012675103的专栏 9201

结构体大小的判断

首先记清楚下图  32 位 64 位C数据类型 3264位C语言内置数据类型,如下表所示: 32位64位系统的区别在于long指针,32位下他们是4字节,64位下他们是8字节 short都是2字节,float都是4字节,double都是8字节,longlong都是8字节 遵循两条原则:一、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任

DrawnBreak 1008

C语言结构体,共用体所占字节数计算

字节数: 环境 char short int long long long float double 指针 windows(64) 1 2 4 4 4 8 8 4 (无符号型在原来的基础上不变,例如 undigned int依旧为4个字节) 计算字节数*(在window环境下对齐参数原字节数相等)* 第一原则:每个变量相对于结构体的首地址的偏移量必须是对齐参数的整数倍。 第二条原则:结构体变量所占空间的大小是对齐参数的整数倍。 结构体 结构体所占内存的长度是各成员占得内存长度。 例

qq_48434912的博客 1万+

结构体长度问题

为了加快数据存取的速度,编译器默认情况下会对结构体成员结构体本身(实际上其他数据对象也是如此)存储位置进行处理,使其存放的起始地址是一定字节数的倍数,而不是顺序存放,称为字节对齐。字节对齐的规则为: (1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除; (2)结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节; (3)结构体的总大小为结构体最宽基本类型成员

qq_28249373的博客 7958

海奇B210电路参考设计 原理图PCB .pcb .DSN.asc

海奇B210电路参考设计 原理图PCB .pcb .DSN.asc

上一篇: zImage和uImage的区别
下一篇: c语言,数据类型转换
金玲郎
博客等级 码龄12年 38粉丝 7原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值