C/C++中结构体占用内存大小的计算方法

C++类所占内存大小计算 C++类所占内存大小计算 转载时请注明出处和作者联系方式 文章出处:http://blog.youkuaiyun.com/chenchong08 作者联系方式:vision_chen@yeah.net 说明:笔者的操作系统是32位的。 class A {}; sizeof( A ) = ? sizeof( A ) = 1 明明是空类,为什么编译器说它是1呢? 空类同样可以实例化,每个实例在 阅读详情

引言


结构体在C语言中虽然经常使用,但是怎么计算一个结构体占用多大的内存,很多C语言的新手都没注意过,其实C语言的语法简单,难就难在它更偏向于与底层,与内存打交道。对于嵌入式方面来说,对C语言的要求更高,因为有些硬件的内存并不像我们使用的电脑的内存那么充裕,所以需要节约内存。

结构体中同样的变量个数,却可能导致占用内存的大小不同。


例子1:

#include <stdio.h>
int main()
{
	typedef struct a
	{
		int c;
		double d;		     
		char b[10];
	}test;
	test  e;
	printf("%d", sizeof(test));
	return 0;
} 
输出的结果为:32


例子2:

#include <stdio.h>
int main()
{
	typedef struct a
	{
		double d;
		int c;		     
		char b[10];
	}test;
	test  e;
	printf("%d", sizeof(test));
	return 0;
} 


输出的结果为:24

只是调换了一下int c和double d的位置,就导致了前者比后者多占用了8个字节的内存。这只是一个小例子。那么,结构体中到底怎么计算内存的呢。

计算规则

首先需要介绍<b>有效对齐值</b>:每个平台上的编译器都有默认对齐系数n,可以通过#pragma pack(n)来指定。有效对齐值就等与该对齐系数和结构体中最长的数据类型的长度两者最小的那一个值,比如对齐系数是8,而结构体中最长的是int,4个字节,那么有效对齐值为4。

结构体的内存计算方式遵循以下规则:

1.数据成员对齐规则:第一个数据成员放在offset为0的地方,以后的每一个成员的offset都必须是该成员的大小与有效对齐值相比较小的数值的整数倍,例子1中第一个数据成员是int 型,第二个是double,有效对齐值为8,所以double的起始地址应该为8,所以第一个int加上内存补齐用了8个字节

2.结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部有效对齐值的整数倍地址开始存储。(比如struct a中存有struct b,b里有char, int, double,那b应该从8的整数倍开始存储)

3.收尾工作:结构体的总大小,必须是其有效对齐值的整数倍,不足的要补齐。

有了这些规则,再来看上面的两个例子。

例子1中,int为第一个数据成员,所以下一个存储的起始位置是4,但是double占8个字节,按规则一,不满足8的倍数,填充到16,char一共有10个字节(数组在内存中的表示会分解成单个的),即总共26,进行收尾工作,有效对齐值为8,26不满足8的倍数,填充到32。

例子2中,double为第一个数据成员,所以下一个存储的起始位置是8,按规则一,占用了12个字节,char有10个字节,一共用了22个字节,进行收尾工作,该结构体中有效对齐值为8,22不满足8的倍数,填充到24。

例子

下面给你一个question,考察你是否懂了上面的规则

#include <stdio.h>
#pragma pack(8)
int main()
{
	struct Test
	{
		int a;
		//long double大小为16bytes
		long double b;		     
		char c[10];
	};
	printf("%d", sizeof(Test));
	return 0;
} 


#include <stdio.h>
#pragma pack(16)
int main()
{
	struct Test
	{
		int a;
		//long double大小为16bytes
		long double b;		     
		char c[10];
	}
	printf("%d", sizeof(Test));
	return 0;
}


如果你计算得出的答案分别为40和48,那我相信你就懂了内存对齐的奥秘了。




        
C++结构体占用内存大小浅析 以下是结合之前计算机组成原理的知识,实践总结的两条规律 阅读详情

相关推荐

2024年C C++最全C语言结构体占用空间内存大小解析_c语言 结构体所占内存,2024大厂C C++春招面试经历

以int型占用4个来作为倍数,因为A占用一个字节后,B放不下,所以开辟新的单元,然后开辟新的单元放C,所以格式一占用的字节数为:3*4=12;第三种写法,最节省空间的写法,也是使用 sizeof 求大小与预期一样的写法,但是全部使用字节类型,丢失了字段本生的数据类型,不方便使用;我们都知道,char类型占用1个字节,int型占用4个字节,short类型占用2个字节,long占用8个,double占用16个;第二种写法,介于第一种和第三种写法之间,其空间上比较紧凑,同时又保持了结构体中字段的数据类型。

2401_84976285的博客 613

C++--问题22--struct结构体计算占内存大小

C++--问题22--struct结构体计算占内存大小 先得列出在32位编译环境下的字节大小: 1字节:char 2字节:short (不管是不是signed或unsigned) 4字节:int、long、float (不管是不是signed或unsigned) 8字节:double 如果等号是 '=' 这种字符常量的话,当然是1字节,如果是 “=” 这种字符串常量当然是2字节。 注意:struct 的{}后面要加上分号";" ...

数组越界,数组进栈 883

关于结构体占用空间大小总结

之前一直以为把这个问题搞清楚了,今天看到一道题,发现之前的xing

Netown_Ethereal的专栏 2637

2021-1-17.c++第一周

一.c++基本框架加粗样式 #include using namespace std; int main() { cin>>a;//输入a cout<<a;//输出a cout<<endl;//换行 return 0; } 二.string定义

qq_52546901的博客 330

结构体占用内存大小

【代码】结构体占用内存大小。

621

【C/C++】联合体union和结构体struct占用内存大小情况分析

【代码】【C/C++】联合体union和结构体struct占用内存大小情况分析。

weixin_41796265的博客 1751

C++结构体占内存计算方式

计算规则 首先需要介绍<b>有效对齐值</b>:每个平台上的编译器都有默认对齐系数n,可以通过#pragma pack(n)来指定。有效对齐值就等与该对齐系数和结构体中最长的数据类型的长度两者最小的那一个值,比如对齐系数是8,而结构体中最长的是int,4个字节,那么有效对齐值为4。 结构体的内存计算方式遵循以下规则: 1.数据成员对齐规则:第一个数...

weixin_46414967的博客 449

【CSharp】获得结构体内字段占用的内存大小

但是,对于复杂类型(如嵌套结构体、引用类型等),返回的大小可能并不是其实际的内存占用情况。博主以为最大的区别:struct结构体是值类型,而class类是引用类型。换句话说,只要结构体内部只要是相同的,就可以认为两个struct结构体相等,但是class类完全没这个概念。在 C# 中,IntPtr 是一个平台相关的整数类型,即是一个值类型,而不是引用类型。总之,您可以简单理解为简单的数据结构struct实现,复杂的class类去实现。可以理解成class类是struct结构体的升级版。

jn10010537的博客 683

关于C语言中结构体内存的计算

C语言结构体内存计算

m0_75079625的博客 752

Android手机免root玩转Kali NetHunter:Termux保姆级安装指南(附Kex VNC配置)

本文提供了一份详细的Android手机免root安装Kali NetHunter的保姆级指南。通过使用Termux终端模拟器,用户无需解锁Bootloader或获取root权限,即可在普通安卓设备上部署完整的Kali Linux渗透测试环境。教程涵盖了从环境准备、NetHunter核心安装到配置Kex VNC实现图形桌面访问的全过程,并附带了电脑投屏与常见问题解决方案,旨在打造一个便携的移动安全学习与测试平台。

weixin_29208327的博客 299

Wider Face+YOLOV7人脸检测

使用Wider Face数据集训练YOLOV7

chen_znn的博客 8408

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

C/C++中不同数据类型所占用的内存大小 32位64位 char11 int4大多数4,少数8 short2...

husion01的专栏 677

【AI基础学习系列】二十一、一文搞懂GPT

本文系统介绍了GPT(Generative Pre-trained Transformer)模型的核心内容。首先阐述了GPT的本质是基于Transformer的预训练语言模型,其创新在于使用单向Transformer编码器。其次详细解析了GPT架构,包括输入层的Tokenization和Embedding处理、Transformer解码器堆叠的核心组件(自注意力机制、前馈神经网络等)以及预训练和微调两阶段训练过程。接着说明了GPT的工作原理:通过无监督预训练学习语言统计规律,再结合有监督微调适应具体任务。

ASH_GUARDIAN的博客 1688

sizeof()求所占内存的长度

C/C++中不同数据类型所占用的内存大小 32位 64位 char 1 1 int 4 大多数4,少数8 short 2 ...

qq_40316360的博客 709

使用Kolla部署多节点Rocky版本OpenStack

openstack命令行客户端使用,post-deploy会在 /etc/kolla/目录下生成文件admin-openrc.sh。每次使用openstack命令时执行source /etc/kolla/admin-openrc.sh(manager节点执行)source /etc/kolla/admin-openrc.sh (将文件内容复制到/etc/profile中,即可一直生效)3.2.2 开始安装kolla-ansible,要带上--ignore-installed PyYAML,否则可能会报错。

gyc1206的博客 1927

手把手教你:在openEuler 22.03上离线搞定OpenSSH 9.8升级(CentOS 7.9通用)

本文详细介绍了在openEuler 22.03和CentOS 7.9系统上离线升级OpenSSH 9.8的完整流程,包括准备工作、离线包获取、安装步骤、服务管理及回滚方案。特别针对无外网环境的企业服务器,提供安全可靠的离线升级解决方案,帮助运维人员有效提升系统安全性。

weixin_30682415的博客 192

C/C++ sizeof用法以及结构体占用内存大小问题

参考链接:https://www.jb51.net/article/136259.htm sizeof用法 1.它是什么? 2.可不可以跟变量名,其调用方式是什么样的? 3.C语言中sizeof函数的基本使用总结 4.C/C++ 中sizeof(‘a’)的值对比? 5.答案是什么?为什么? int i; i = 10; printf("%d\n", i); printf("%d...

郑丹丹的博客 799

win 11bitlocker恢复密匙一般情况的解决方式(这里指的是你现在使用的微软账户一直没有变更过)

本来没有打算写这一篇解决帖子的,但是最近好多微博的友友都在私我询问解决方法,孩子虽然很热心,但是真的回复不过来了,打字太累了,这里给大家简单指个路,希望能够对大家有所帮助。 当时出现这个问题的时候,一搜网上的解决方法都是重装系统什么的,真是吓死孩子啦。后来去微软的官网倒腾了半天解决了问题。其实只要你没有改过微软账户,你可以直接试试我这个方法,大概三到五分钟解决问题吧。 和我情况不一样的也可以参考一下贴吧里一些大佬的分享,或者实在着急我感觉去淘宝上找个解决也不是未尝不可。 出现问题: 解决方案: 直接去微软

zhiqingxue的博客 2万+

C语言结构体,共用体占用内存原理解析

C语言结构体占用内存原理解析结构体内存原理解析:共用体内存原理解析: 结构体内存原理解析: 结构体在内存中的存储有以下规则: 结构体成员中的其实地址应该是该成员所占内存的整数倍,如果不足整数倍需要补齐 结构体所占内存为结构体成员中最大基础数据类型的整数倍。 这里说下基础类型:int,char,long,long long,double,float 规则1解析: typedef struct{ char a; int b; }Msg; 结构体Msg在内存中的存储方式如下图所示: a占用了第

qq_33865609的博客 4609

HFSS实战项目——基片集成波导(SIW)带通滤波器

设计了一款直接耦合的SIW带通滤波器, 采用直接耦合的形式, 工作频率覆盖19~21 GHz, 通带内插入损耗小于1.5 dB, 回波损耗小于-20 dB, 带外抑制特性良好.

2401_87464239的博客 4897

一文看懂 SAP Integration Suite:从架构治理、接口编排到事件驱动的集成全景

SAP Integration Suite是企业数字化转型中的关键集成平台,通过统一的方法论和工具链解决系统互联、数据对齐和流程协同等复杂问题。其核心能力包括:1)集成评估(Integration Assessment)提供战略规划框架;2)迁移评估(Migration Assessment)支持从传统平台向云的平滑过渡;3)云集成(Cloud Integration)实现日常业务流程编排;4)集成顾问(Integration Advisor)简化B2B标准映射;5)贸易伙伴管理(TPM)优化外部协作流程;

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 505

C/C++ 结构体模块

结构体通过struct关键字创建,可封装多种数据类型成员,实现逻辑关联数据的聚合。核心特点1.成员类型灵活:支持基本类型(charint等)、数组、指针,甚至嵌套其他结构体。2.内存占用:结构体变量的内存大小由成员类型及内存对齐规则共同决定)。结构体是 C/C++ 构建复杂数据模型的基础,内存对齐则是平衡效率与空间的关键设计。基础语法:定义、声明、成员访问(与->内存对齐:理解成员自身对齐、总体大小对齐规则,通过合理成员顺序优化内存占用。技巧:动态内存管理(避免内存泄漏)、深拷贝(处理指针成员)、

2201_75342864的博客 608

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

class占用的的内存大小怎么计算?

类型大小示例(64位)备注空类 / 空结构体1 字节必须可寻址仅 int 成员4 × 个数注意对齐int + char8 字节(含 padding)char后面可能补 3 字节指针成员每个 8 字节64 位平台有虚函数的类至少 8 字节(vptr)即使无其他成员多继承 / 虚继承更大多一个 vtable 或偏移表空基类优化(EBO)可能优化为 0 字节只适用于非虚继承。

qq_44815135的博客 995

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C/C++结构体内对指针开辟空间(变长结构体、构造函数实现)

前言 最近实验室的小伙伴们突然问我,在结构体内创建指针,如何开辟其内存大小,有种极其简单且易想到的方法,就是在外部对其malloc空间,但是本文可以给出两种比较优雅的实现方式。 1.利用构造结构体构造函数实现 跟类的实现方式十分接近,在构造函数里实现指定的指针开辟长度,代码很简单,且因为结构体成员共有的问题,在外部也可以对内存做释放。 #include <iostream> #include <map> #include <string> using na.

SUST_DOG_MASTER博客 4025

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

sizeof()计算方法 c/c++

sizeof 是计算分配内存的大小 int    整型  占4个字节 int i,sizeof(i)=4;int a1[9],sizeof(a1)=4*9=36; double 浮点型占8个字节 double b,sizeof(b)=8;double b[3],sizeof(b)=8*3=24; char   字符  占1个字节 char a,sizeof(a)=1;char b1[9],s

cddchina的专栏 5340

C/C++内存占用相关

最近面试遇到了几个和内存相关的问题,索性把这些相关知识都整理一下。 1.C语言的动态内存分配 malloc是C语言的动态内存分配(当然C++也可以使用,以下代码基于C++编译),函数是void *malloc(unsigned int size),它会在内存的动态存储区(堆上)中分配一个长度为size的连续空间。 int *p; p = (int*)malloc(sizeof(int) * 10)...

cpf945的博客 538
上一篇: 数据结构与算法学习-二叉树
下一篇: C语言中如何避免memset的坑
UKey_
博客等级 码龄10年 258粉丝 186原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值