结构体所占空间大小的运算

结构体在内存中所占字节大小计算 今天上课,老师给我们演示了一下,计算结构体在内存中所占的字节大小。开始给了我们几个例子,然后要我们自己mo 阅读详情

在C/C++中我们常常会看到有求一个结构体的大小的情况,有时候我们就会想:不就是结构体中各个数据类型所占的空间加起来就行啦,那么事实上是不是这样呢?答案:不是滴。原因是:为了加快读写数据的速度,编译器就实现了数据对其的做法来为每一个结构体分配空间。

这里我只讲结构体中数据对其的一个要点:2倍。

2倍(本人自己总结的)是指有两个倍数要记住,第一就是结构中的各类型的倍数,第二就是结构体这个类型的倍数。

那么具体怎么理解这两个倍数呢?举个例子就好理解了。如

struct A
{
char a;
double b;
int c;
};
 
(说明:在VS中char占有1个字节,double占了8个字节,int占了4个字节)
计算的时候是这样子的:首先是按照自上向下为结构体分配空间,并在其之间作调整。首先为char分配一个空间,接着编译器为了实现数据的对其,所以在分配double的时候会对之前所分配的空间进行一些调整,调整方式是按照原先分配的空间的大小和当前要分配的大小来决定将要分配的空间,因为double为8字节,所以编译器要求在double之前所分配的空间大小应该是当期要分配的空间的倍数,在这里也就是说在double前面分配的应该是8的倍数空间才行,所以原来的char被迫扩展到8个字节,然后才为double分配8个字节,这样这两个变量就占了16字节。接着就是到了int了,因为int需要4个字节,而前面所分配的为16个字节,是4的倍数,所以接着就为int分配了4个字节,也就是到了目前编译器为这个结构体分配了20个字节,那么是否就是这个答案呢?哈哈,你试一下就知道这个答案不正确,因为这只是其中的一个倍数(按照我所说的两个倍数中的一个),那么还有一个倍数是什么呢?其实还有一个就是前面所说的对结构体整体的一个倍数处理,已经为结构体分配好20个字节空间,那么接下来就是编译器要求整个结构体所分配的空间大小是结构体中占用空间最多的类型所占用空间大小的倍数,如上面的例子,结构体中占用空间最多的就是double这种了类型,那么就要求结构体总大小是这个类型的倍数,在这里也就是要求结构体所占用空间大小要是8 的倍数,因为20不是8的倍数,所以结构体被迫扩展自己的空间,以满足需要,所以就扩展到24个字节。所以结果为24.不知道你学会了没有,如果有什么不同的见解,不如在下面回复一下,不胜感激。

 

LabVIEW+数据库应用系列保姆级教程,第一篇数据库连接 目录LabVIEW连接数据库的方法连接MySQL连接Oracle,SQL Server,Access等 LabVIEW连接数据库的方法 1、创建udl(Universal Data Link)是通用数据连接文件。界面操作,简单快捷。 2、编写连接字符串。需要熟悉连接字符串的结构,容易出错。 3、其他… 本教程教你使用第1种方法,也是最简单、最常用的方法。 连接MySQL 1、在MySQL Installer内安装MySQL Connector/ODBC,建议安装32位(X86),如下图: 2、创建ODBC 阅读详情

相关推荐

串口调试神器诞生记:我是如何用Cursor+AI自动生成C#上位机的(含VSCode插件清单)

本文详细介绍了如何利用Cursor和AI技术快速开发C#上位机程序,实现高效的串口通讯调试。从开发环境搭建到代码自动生成,再到性能优化和功能增强,全面展示了AI辅助开发在串口调试中的实际应用和显著效率提升。

weixin_28340315的博客 301

C的实用笔记39——结构体占用内存大小(了解)

规则1(为结构体开辟内存的基本单位)规则2(内存对齐原则)规则3(指定对齐)​​​​​​​。

lzh201864031的博客 3228

手把手教你用FPGA+AD9822搭建300DPI的CIS高速图像采集系统(附时序调试心得)

本文详细介绍了如何利用FPGA作为核心控制器,结合AD9822三通道采样保持放大器/ADC,构建一套完整的300DPI CIS高速图像采集系统。内容涵盖从CIS传感器驱动时序、AD9822寄存器配置与协同调试,到采用千兆以太网替代USB实现稳定高速数据传输的完整实战指南,并分享了关键的时序调试心得与系统集成经验。

weixin_29306261的博客 134

c语言中关于结构体所占内存大小及内存对齐详解

则需要再变量a后面填充3个空字节,使得变量b相对于首地址的偏移量为4,才能满足规则2,填充完之后,其最大自身字节对齐数位4,此时的结构体大小为8,满足结构体大小为最大自身字节对齐数的整数倍规则。变量c相对于首地址的偏移量为8(a,b已经占了8个字节),其自身有效对齐字节数为min(2,16),即2,符合规则2,最大自身有效对齐字节数为4(int),此时结构体大小为10,然而10贝能被4整除,所以不符合规则三,需要再变量c后继续填充2个字节才能满足条件,填充后,结构体大小为12.

2301_76164438的博客 2896

VS Code+ESP-IDF开发避坑指南:头文件标红报错的5种解决方法(附CMakeLists.txt配置)

本文详细解析了在VS Code中使用ESP-IDF开发ESP32时头文件标红报错的5种解决方法,包括环境配置检查、CMakeLists.txt规范配置、路径解析策略、缓存清理技巧和高级调试手段。特别提供了CMakeLists.txt的实战配置示例,帮助开发者彻底解决头文件路径问题,提升开发效率。

weixin_33670786的博客 560

Python 中 dpkt 库的详细使用指南(强大的 Python 数据包解析库)

dpkt 是一个功能强大的 Python 网络数据包解析库,支持解析和构造以太网、IP、TCP/UDP 等多种协议的数据包。其核心功能包括解析各层协议头部、读写 pcap 文件、构造自定义数据包及分析 HTTP 流量等。dpkt 提供简单易用的 API,适用于网络分析、安全研究和流量监控场景。优化技巧包括数据包过滤、批量处理和选择性解析以提高性能,常见问题如数据不完整或协议识别错误可通过异常处理和字段验证解决。典型应用场景涵盖协议分析、网络调试和自定义数据包生成。

数据知道的博客 1万+

结构体所占字节数的计算

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

u012675103的专栏 9205

国科大学习资料--遥感原理集图像处理(尤红建)--2019年期末考试

国科大学习资料–遥感原理集图像处理(尤红建)–2019年期末考试 国科大学习资料–遥感原理集图像处理(尤红建)–2019年期末考试 国科大学习资料–遥感原理集图像处理(尤红建)–2019年期末考试 ================================================================== ================================================================== ==============

无名何许人的博客 1469

结构体的字节是多大

{int a;char b;int c;};//12个字节​复制代码偏移量指的是结构体变量中成员的地址和结构体变量地址的差。结构体大小等于最后一个成员的偏移量加上最后一个成员的大小。显然,结构体变量中第一个成员的地址就是结构体变量的首地址。比如上面的结构体,第一个成员a的偏移量为0。第二个成员b的偏移量是第一个成员的偏移量加上第一个成员的大小(0+4),其值为4;第三个成员c的偏移量是第二个成员的偏移量应该是加上第二个成员的大小(4+1)。12。

Maisucsdn的博客 2952

亚马逊爬虫实战:中国商家信息(电话)爬取

import os), # 保存图片的路径# 搜索关键词"keywords":["毛巾","衣服"],"product_number": 1000000000000000, # 分页获取数量# 和url一一对应 个数要一样"remarks": ["备注1"],# 以下内容非专业人员请勿更改,请找开发人员更改. 对应的是amazon_product_url_setting文件中名称.},

youbingchen的博客 1524

A100 NVLink集群极致优化指南

《A100 NVLink集群通信优化指南》摘要:针对A100 80G SXM机型NVLink 3.0集群,提供硬件配置检查方法(nvidia-smi topo -m)和强制启用指令。重点介绍NCCL参数调优(算法选择、低延迟协议配置)、GPUDirect RDMA启用步骤,以及单机/多机场景下的通信模式选择。包含PyTorch all_reduce基准测试方法,并给出带宽异常排查方案(dmesg检查、NCCL缓存重置)。通过CUDA Graph通信重叠和混合精度优化,可实现90%+带宽利用率。附猿界算力监控

2401_89353317的博客 589

C语言中结构体占用内存大小

这个问题很经典,很容易出现,也叫内存的4k对齐吧 相关知识: cpu传输数据的方式: cpu每次传输数据大小由它的总线条数决定,32位传输4个字节,64位传输8个字节。 这里以64位系统举例,若声明一个变量大小为8字节,起始地址位1,而cpu读取的地址为0~7, 则该变量需要读取两次,显然降低了cpu的性能。 为提高cpu读取的性能,采用补齐的方法提高cpu...

入门记 9904

Diffusion models代码实战:从零搭建自己的扩散模型

这个系列曾经写过三篇文章专门讲代码,分别从数据集、超参数、loss设计、参数计算、Unet结构、正向过程、逆向过程等部分详细介绍了如何搭建DDPM。Diffusion models领域发展神速,最近半年代表作品有OpenAI的GLIDE、DALL-E 2,Google Brain的ImageGen,海森堡大学的Latent Diffusion。这篇博客针对入门新手讲解一下如何利用已有的资源快速搭建自己的Diffusion models。.........

沉迷单车的追风少年 1万+

sizeof判断所占空间大小

功能:计算数据类型所占空间大小; 返值:返回数据类型所占空间大小,如果判断字符串实际长度,包括‘\0’在内; 与strlen比较: 功能:计算字符串长度 返值:返回字符串实际长度,不包括‘\0’在内; 1 #include <stdio.h> 2 #include <string.h> 3 4 int main(int argc, cons...

weixin_30398227的博客 108

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

c++中有什么数据类型?在vs2019中各占多少字节?

在 C++ 中,数据类型的大小(占用的字节数)是由编译器和操作系统决定的,不同的编译器和操作系统可能会有不同的规定。需要注意的是,以上数据类型的大小只是一种常见的情况,实际情况可能会因编译器、操作系统、编译选项等因素而有所不同。在编写代码时,应尽量避免依赖于数据类型的大小,而是使用 sizeof 运算符来动态获取数据类型的大小。

weixin_42195477的博客 1129

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

结构体对齐问题详解

在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐。 内存对齐的原因: 1)某些平台只能在特定的地址处访问

ljtyzp的专栏 726

结构体字节对齐

在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列, 而不是简单地顺序排列,这就是内存对齐。 内存对齐的原因: 1)某些平台只能在特定的地址处访问特定类型的数据

qq_25248939的专栏 418

https://www.cnblogs.com/dolphin0520/archive/2011/09/17/2179466.html

在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐。

wy8888888888888888的博客 1425

sizeof

#include struct AA { char a; double b; float c; }; struct BB{ int a; double b; float c; }; struct CC{

迷糊的佳佳不迷糊 412

从‘Hello, World!’的14字节说起:手把手教你用sizeof调试C++中的内存布局

本文以C++中的`sizeof`运算符为核心,深入解析了内存布局的调试技巧。从'Hello, World!'字符串的14字节内存占用入手,详细讲解了字符数组、结构体内存对齐、动态内存分配及跨平台开发中的`sizeof`应用,帮助开发者精准诊断内存问题,优化程序性能。

weixin_30457465的博客 284

灵活数组成员

C99对结构体中的灵活数组成员有一定限制:结构中至少有1个其它成员灵活数组成员必须是最后一个成员包含灵活数组成员的结构体不能是其它结构体或数组的一部分对包含灵活数组成员的结构体使用sizeof,得到的值不包括灵活数组成员的尺寸,但包括该灵活数组成员之前的填充字节的长度。

shine3935的专栏 824

又见 sizeof

计算下面sizeof的大小: #include #include #include int main(int argc, char **argv) { char b[100]="0123456789"; char c[]={"0123456789"}; printf("%d \n",sizeof(b)); printf("%d \n",s

wjw7869的专栏 386

朗讯笔试题目--C语言部分(zz)

标  题: 朗讯笔试题目--C语言部分跳出main()函数后还能不能执行其他代码不使用第三个变量,将两个变量a,b得值互换(不准用函数)如何判断一个文件是由C编译环境还是C++编译环境编译完成的? 不用任何条件语句求两个整形数的最大值?(不准用函数)struct student {long ..; char .. float .. } 所占空间多大?下面是一些解法,又可以从中学习到新东西了,赫赫:

joshua的专栏 4229

结构体在内存中所占空间大小的计算

这篇文章写的很好,与大家分享一下。 转载自:http://blog.youkuaiyun.com/grantxx/article/details/7577730 作者:grantxx 一个结构体变量定义完之后,其在内存中的存储并不等于其所包含元素的宽度之和。 例一:                                       #include       

Cast 979

C语言的sizeof运算符计算结构体大小

C语言的sizeof运算符运算规则 sizeof运算符 **sizeof 是一个运算符,不是函数(方法)。** 例子: 当想打印一个变量的存储区域大小时,可以直接写 int a = 5; printf("%d\n",sizeof a); 当想打印一个数据类型的存储区域大小时,因为int是数据类型,所以要加小括号提高int的运算优先级 printf("%d\n",sizeof(int)); C中不同数据类型所占用的内存大小 对于32位系统来说,大小如下(单位:字节) sizeof计算结构体大小 结构体的成

小小的星球 7596

数组、结构体、基本数据类型所占的空间大小

sizeof()运算符用来求对象所占内存空间的大小。下面是一些常见数据类型所占的空间大小char。

buzhengli的博客 3690

【C语言】结构体的大小是如何计算的?(结构体对齐详解)

使用sizeof计算结构体大小,影响结构体内存大小的三种因素,结构体的对齐规则详解

C/C++领域,数据结构,linux,MySQl学习者 9963
上一篇: 数据结构重现之一 ----------栈
下一篇: mysql创建存储过程
对方感受到
博客等级 码龄16年 97粉丝 50原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值