结构体内存对齐;内存优化

news2024/10/7 14:27:30

结构体需要根据数据类型进行内存对齐。

所有数据类型占据空间的大小,一定是它基础类型的倍数。

首先按照最大数据类型格式来作为最小分割单元。


最大整数倍

struct stu
{
	char gender;
	unsigned int age;
}student1;

int main()
{
	printf("sizeof this struct is %d。\n", sizeof(student1));


	getchar();
	return 0;
}

最大的数据类型是int,占据4个字节。然后首先age,占满第一个4字节分割单元。

然后char gender,1个字节,也要占据一个4字节大小的分割字节。不满也是一个分割单元。

所以整体占据8字节。


顺序分配

struct stu
{
	char name[20];    // 20
	unsigned int age; // 4
	char tel[15];     // 15
	float scores[3];  // 12  
	char gender;      // 1        // 20 + 4 + 15 + 12 + 1 = 52

}student1;


int main()
{
	printf("sizeof this struct is %d。\n", sizeof(student1));
	getchar();
	return 0;
}

基础内存分割(对齐)单元,根据最大基础类型确认。当前为int4字节。

  • char name[20]为20字节,占5个单元。20个字节。
  • unsigned int age4字节,占1个单元。4个字节。
  • char  tel[15]15字节,占4个单元,最后一个单元差一个字节占满。看做占用16字节。
  • float score[3]34字节的float。占3个单元。  占用12个字节。
  • char gender虽然只占一个字节,但是单独开辟了一个分割单元。因此看做占据4字节

  • 20 + 4 + 16 + 12 + 4 = 56字节。

优化内存

 将gender上移一行。快捷键Alt + 向上箭头。

struct stu
{
	char name[20];    // 20
	unsigned int age; // 4
	char tel[15];     // 15
	char gender;      // 1        // 20 + 4 + 15 + 12 + 1 = 52
	float scores[3];  // 12  

}student1;

此时由56变为52。

所以写结构体的一般建议:按照数据类型,从大到小往下写。

例如:

struct stu
{
	char* p;   // 4
	char arr[2];  // 2
	int c;   // 4
	short d; // 2
	double f;  // 8
	long g;   // 4
	float h[2]; // 8
}student1;

int main()
{
	printf("sizeof this struct is %d。\n", sizeof(student1));
	getchar();
	return 0;
}

 输出为40个字节;

但是我们优化一下;按照从大到小往下写:

struct stu
{
	float h[2]; // 8
	double f;  // 8
	char* p;   // 4
	int c;   // 4
	long g;   // 4
	char arr[2];  // 2
	short d; // 2
}student1;

int main()
{
	printf("sizeof this struct is %d。\n", sizeof(student1));
	getchar();
	return 0;
}

输出32个字节。 

 但是这样的问题是:可能结构体的顺序不利于大部分场景下的代码阅读。

这也是一种tradeoff。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/195540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud Config分布式配置中心

目录 一、概述 二、Config服务端配置与测试 配置读取规则 三、Config客户端配置与测试 bootstrasp.yml 四、Config客户端之动态刷新 一、概述 官网:Spring Cloud Config 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对…

【Java】IDEA调试线上服务

目录IEDA打开线上服务对应的代码,Edit Configuration创建与远程服务的连接复制黄匡生成的参数,添加到服务器启动命令中服务器的服务重新启动,并注意调试端口5005是否被防火墙拦截本地IDEA启动,控制台打印如图即成功代码上加断点&a…

Linux做选择题时的要点

1.线程独有:栈,寄存器,信号屏蔽字,errno...等信息,因此各个线程各自有各自的栈区,但是堆区共用。 2.用户态线程的切换在用户态实现,不需要内核支持。 3.每个线程在进程虚拟地址空间中会分配拥…

部署在Docker中的iServer进行服务迁移

目录前言一:备份与恢复1.备份2.恢复二:迁移配置文件作者:kxj 前言 Linux 容器虚拟技术(LXC,Linux Container)是一种轻量级的虚拟化手段,它利用内核虚拟化技术提供轻量级的虚拟化,来…

【八大数据排序法】希尔排序法的图形理解和案例实现 | C++

第十七章 希尔排序法 目录 第十七章 希尔排序法 ●前言 ●认识排序 ●一、希尔排序法是什么? 1.简要介绍 2.图形理解 3.算法分析 ●二、案例实现 1.案例一 ●总结 前言 排序算法是我们在程序设计中经常见到和使用的一种算法,它主要是将一…

C++引用(特性+使用场景+常引用)

文章目录1. 概念2. 关于别名的理解3. 引用的特性1.引用必须在定义时初始化2.一个变量可以有多个别名3.引用一旦引用一个实体,再不能引用其他实体4.使用场景1. 引用做参数2. 引用做返回值1. 传值返回是否为n直接返回临时变量作为返回值2. 传引用返回编译器傻瓜式判断…

11、循环语句

目录 一、while语句 二、do…while语句 三、for语句 一、while语句 使用while语句可以执行循环结构,其一般形式如下: while语句的执行流程图: while语句首先检验一个条件,也就是括号中的表达式。当条件为真时,就执…

跟同事杠上了,用雪花算法生成的id做主键对MySQL性能有影响?

公司最近开发了一个新项目,设计表时由于有些字段需要对外展示,所以使用了雪花算法生成的id做主键。 不过有位同事对此提出了异议,认为雪花算法生成的id不是顺序递增的,会对MySQL的性能造成影响。 经过交流,发现持有这…

【Linux 系统运维基础】Linux目录 以及重要配置文件

Linux目录 以及重要配置文件 文本讲述了Linux中目录含义 以及我们工作中常用到的路径 1. 目录含义 2. 常用路径地址 2.1 网卡配置文件 /etc/sysconfig/network-scripts但是网卡的名称是有区别的,使用不同服务器生产商的名称是不同的。如下图: 网卡配置…

Window10下FFMPEG的安装与使用

文章目录一.FFMPEG介绍FFMPEG组成二.Windows10下FFMPEG安装三.FFMPEG的使用1.关键指令一.FFMPEG介绍 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它…

字节前端面试题目2

1.为什么通常在发送数据埋点请求的时候使用的是 1x1 像素的透明 gif 图片? 1. 没有跨域问题,一般这种上报数据,代码要写通用的;(排除 ajax) 2. 不会阻塞页面加载,影响用户的体验,只…

基于SSM的图书购物商城设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

【C++】三大特性之继承

目录 一、继承的概念及定义 1.继承的概念 2. 继承定义 2.1定义格式 2.2继承关系和访问限定符 2.3继承基类成员访问方式的变化 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 五、友元与继承 六、继承与静态成员 七、复杂的菱形继承及菱…

机器学习中的数学原理——线性不可分

这个专栏主要是用来分享一下我在 机器学习中的 学习笔记及一些感悟,也希望对你的学习有帮助哦!感兴趣的小伙伴欢迎 私信或者评论区留言!这一篇就更新一下《 白话机器学习中的数学——线性不可分》! 目录 一、什么是线性不可分 二…

用125行C语言编写一个简单的16位虚拟机

改博文用图文代码的方式详细描述了实现的具体过程,包含每一条指令的含义。 虚拟机 在计算领域,VM(虚拟机)是一个术语,指的是模拟/虚拟化计算机系统/架构的系统。 从广义上讲,有两类虚拟机: 系统…

每日一练11——最近公共祖先求最大连续bit数

文章目录最近公共祖先思路:代码:求最大连续bit数思路:代码:最近公共祖先 题目链接 思路: 题目所描述的满二叉树如下: 上述树中子节点与父节点之间的关系为root child / 2 所以如果a ! b&a…

递归算法整理

一、概述:递归算法是一种直接或者间接调用自身函数或者方法的算法。说简单了就是程序自身的调用。类似于数列,通过前几项的值推出后几项 二、递归算法的使用条件1.大问题可以拆分为若干小问题2.原问题与子问题除数据规模不同,求解思路完全相同…

自助Active Directory组订阅

在任何基于Windows的企业的身份与访问管理(IAM)战略中,Active Directory组扮演了至关重要的角色,因为它们用来控制对几个资源(包括电子邮件通讯组)的用户访问。反复地添加用户到组中和从组中移除用户构成了IT管理员工作的有机组成…

C#windows竞赛管理系统

中文摘要 为了提高竞赛项目信息的管理效率,本课题使用C#语言和SQL Server数据库系统开发了一个WinForm类型的竞赛管理系统对竞赛项目信息进行高效管理,以提升管理质量。本系统包含教师登录注册、教师信息修改模块、添加学生信息模块、删除学生信息模块、…

可编程直流电源的介绍 什么是可编程直流电源

现在各种的电子设备不断地发展,它们对直流供电的电源也有了更高的要求,相对于电子设备来说,用单一的直流电源是没有办法达到供电的要求,所以需要不同的直流电源来给电子设备供电。可编程直流电源就是这一种。在生产测试中&#xf…