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

matlab特征提取和分类_SAST Weekly|MATLAB机器学习初探——做个心音分类器

SAST weekly 是由电子工程系学生科协推出的科技系列推送,内容涵盖信息领域技术科普、研究前沿热点介绍、科技新闻跟进探索等多个方面,帮助同学们增长姿势,开拓眼界,每周更新,欢迎关注!欢迎愿意分享知识的同学投稿至 eesast@mail.tsinghua.edu.cn , 期待你的作品!本期的SAST weekly,想跟大家分享一下如何用MATLAB进行初步的机器学习,构建一个正常/...

weixin_36453829的博客 5580

SAP MM 物料描述MAKTX 40个字符不够用的问题处理

SAP物料描述表,长度40个字符一般情况下,40个字符在描述中也够用了,但是要加上规格之类的额外描述就不一定了,特别是对于辅助件-刀具。解决方案一:对maktx增强,换成CHAR80或者CHAR100的,但是风险较大,涉及到好多地方,另外SAP+ 算号器 也不支持。解决方案二:增强字段。内部顾问,建议在 那就在这里加一个字段,具体过程如下:1、创建域2、创建架构3、附加架构4、GUI 设置 5、后台设置6、MASS/MM17字段新增。过程1、创建域 SE112、创建结构 se11 3、MARA附加架构

GAVIN 4731

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

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

husion01的专栏 677

Nvidia Isaac Sim图形界面 入门教程 2024(3)

在使用Isaac Sim时,最先接触到的应该是它的图形界面,此处将简单介绍图形界面中常用的一些组件:Isaac Sim的界面的常用内容可以分为几个板块。

m0_56661101的博客 4547

sizeof()求所占内存的长度

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

qq_40316360的博客 709

学习 考证 帆软 FCP-FineBI V6.0 考试经验

参加这个学习班,认识了新朋友,可能是我职业生涯中的一次重要体验,其实大家想想 IT 和 医生一样都是需要终身学习的。只是医生学习周期更长但是回报率也更高。大家觉的呢?

小 tom的博客 6226

ArcFace vs 传统算法:实测MTCNN+ArcFace在PyCharm中的识别准确率(含完整对比数据)

本文通过PyCharm开发环境实测MTCNN+ArcFace组合在人脸识别中的性能表现,并与传统算法进行多维度对比。实验数据显示,ArcFace在LFW数据集上达到99.83%的准确率,显著优于传统方法。文章还提供了完整的代码实现和工程优化建议,为开发者提供实用的技术参考。

醉三国 235

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

单片机按键识别篇---单击---双击----长按

  最近做一任务需要使用一个按键实现三种功能,分别是按键单击功能,按键双击功能和按键长按功能,可能之前没有接触过这类按键复用情况,顶多也只是简单识别单击和长按,没有想过双击以上按键功能,也是绞尽脑汁,想了半天,又上网看了些例程,算是对于按键的识别有点小小的了解,感觉这个功能挺实用,在此做个随笔。 一、思路   1.识别长按操作思路:我们使用系统定时器定时,然后让系统每过一段时间去扫描按键I/O...

weixin_30311605的博客 3660

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

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

qq_33865609的博客 4609

【Neo4j × Python】基于知识图谱的电影问答系统(含问题记录与解决)附:源代码(含Bug解决)

此前,曾介绍过Neo4j的一些基础知识,本篇将在PyCharm中与Neo4j建立关联,从0到1实现一个基于知识图谱的电影问答系统,实现过程中,没有一帆风顺,而是遇到了一些问题,因此也包含问题的记录与解决。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 3167

Ubuntu 22.04+/WSL2 中解决 `error: externally-managed-environment` 并成功安装 PyTorch + vLLM 的完整指南

Ubuntu 22.04+/WSL2 因遵循 PEP 668 规范,系统 Python 被标记为“外部管理”,导致直接使用 pip install 安装包时报错 externally-managed-environment。解决方案是创建虚拟环境: 通过 python3 -m venv ~/vllm-env 创建隔离环境 激活环境后安装 PyTorch(CUDA 12.1)和 vLLM 避免使用 sudo pip 或 --break-system-packages,防止破坏系统依赖 关键点: 虚拟环

刘一说的IT专栏 296

C/C++ 结构体模块

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

2201_75342864的博客 608

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

qq_44815135的博客 995

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

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

SUST_DOG_MASTER博客 4025

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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、付费专栏及课程。

余额充值