当前位置: 首页 > article >正文

内存优化笔记1

欢迎关注更多精彩
关注我,学习常用算法与数据结构,一题多解,降维打击。

问题提出

在很多工业软件中,需要对对象进行微分细化,这样会产生很多(几百万到几千万)对象。随着业务的发展,对象内的数据也会越来越多,导致内存成高不下。

class Property1;
class Property2;
class Element {int x, y; // 基础数据int length; // 基础数据bool selected; // 基础数据Property1 p1; // 业务数据Property2 p2; // 业务数据...
};

以上面的class 为例, 基础数据是程序一直要用的。业务数据可能是在某个过程使用为中间过程数据。

一般会创建很多个Element
vector 表示 。

p1, p2也都被被动创建了。带来了很多内存浪费

优化思路

利用内存排布原理

每个变量总是从自身长度的整数倍地址开始排布。

可以按照size小到大的数据排列。

使用内存压缩机制

bool 类型的数据是占用一个字节,但只使用1位就可以表示true, false。这里存在了内存浪费。

又比如uint类型,但是数据大小最大是16, 可以使用5位就可以表示。

C++ 高版本支持位数设定。

bool selected : 1; // 代表只使用其中1位
uint enum_type : 5; // 代表只使用其中5位,业务最大值存储值为16

使用指针管理业务数据

使用智能指针管理

class Property1;
class Property2;
class Element {int x, y; // 基础数据int length; // 基础数据bool selected; // 基础数据shared_ptr<Property1> p1; // 业务数据shared_ptr<Property2> p2; // 业务数据...
};shared_ptr<Property1> Element::GetP1() {if (p1==NULL) p1 = make_shared<Property1>();return p1;
}

由于是在堆上申请空间,上述方法GetP1调用数量大时,可能会导致花多时间在make_shared上。

可以利用缓存池的概念,考虑事先申请好比较多的内存,然后通过指针或索引的方式来访问。

vector<Element> eles;
vector<Property1> p1s;void newP1() {if(!p1s.empty()) return;p1s.resize(eles.size());
}

当有必要时调用newP1(); 只申请一次内存节省了重复申请内存的时间。

通过p1s[i]访问。


本人码农,希望通过自己的分享,让大家更容易学懂计算机知识。
在这里插入图片描述

http://www.lryc.cn/news/2384472.html

相关文章:

  • 人脸识别,使用 deepface + api + flask, 改写 + 调试
  • 代码管理平台Gitlab如何通过快解析实现远程访问?
  • 基于SpringBoot+Vue的足球青训俱乐部管理后台系统的设计与开发
  • Redis 是否适合像 MySQL 一样当数据库使用?
  • AI是否会取代人类?浔川问答①
  • JDBC-java操作数据库
  • [原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何获取目录大小?
  • 线程调度与单例模式:wait、notify与懒汉模式解析
  • MySQL中TCP和套接字SSL加密连接行为分析
  • php本地 curl 请求证书问题解决
  • Callable
  • Honeywell 05701-A-0302 单通道控制卡
  • 爱普生晶振赋能UWB汽车数字钥匙,解锁未来出行新方式
  • 电子电路:深入理解电磁耦合的定义与应用
  • 宝塔安装的 MySQL 无法连接的情况及解决方案
  • 今日行情明日机会——20250523
  • 微服务项目->在线oj系统(Java版 - 4)
  • ReAct 与 CoAct:AI 代理的推理与行动之旅
  • 电子电路:什么是滤波器,什么优势高通滤波器?
  • uni-app使用大集
  • [Spring Boot]整合Java Mail实现Outlook发送邮件
  • 零件剖切配置教学 | 玩转EasyTwin 工业产线第三期(上)课程回顾
  • onnx模型转入rknn3399平台上工作记录
  • 进考场!软考考试现场答题的注意事项
  • 第三个小程序动工:一款结合ai的菜谱小程序
  • OpenCV CUDA 模块图像过滤------创建一个线性滤波器(Linear Filter)函数createLinearFilter()
  • 广告反作弊都有哪些方法
  • Excel 密码忘记了?巧用PassFab for Excel 解密帮您找回数据!
  • Vue.js教学第十二章:Vue Router实战指南(二)
  • 【前端开发】Uniapp日期时间选择器:实现分钟动态步长设置