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

C++内存管理:其五、指针类型转换与嵌入式指针

一、内存池的缺陷

作者在上一版本里面介绍了链表实现内存池,其中有一个小缺陷:虽然较少了cookie的内存损耗,但是加入了一个额外的指针,仍然需要占用内存。我们仔细看内存池的设计思想,可以发现一个关键点:
对于一个内存切片,如果放置在freeList中,才会使用指针。如果被用于构造对象,则这个指针毫无用处。
于是可以想到,可以将一块内存区域,即作为指针使用,又用于构造对象。
方案一:共同体,这个东西过于古早了,不过多解释。
方案二:嵌入式指针。

二、指针类型转换

想要把嵌入式指针讲清楚,先要把指针类型转换讲清楚。
在C++里面,所有指针都是四字节,表示一个地址。那么为什么指定指针的类型呢?编译器根据指针定位到这个内存地址之后,根据指针类型去解析这个数据。举个例子,假如是一个int类型的指针,定位到这个地址之后,扫描后面的四个字节,去解析这32位二进制代表的int数字是多少。
说一个看起来违背常识的事情,指针之间转换,基本是不被编译器报错的!!但是有可能解析出来一大堆稀奇古怪的东西,所以最好不要这样做。也就是说,给编译器一个地址和数据类型,编译器就可以解析,至于解析出来的是什么东西,由程序员负责
看代码:

#include <iostream>
using namespace std;class Test
{
public:int m_i;int m_j;
};class A{
public:int a;
};int main()
{Test t ;t.m_i=1000;t.m_j=2;A *a=(A*)&t;cout<<a->a<<endl;cout<<t.m_j;
}

输出结果:

1000
2

说明一点:
(1)Test类的字节数大于A类,将Test指针强转为A类型指针后,相当于使用前面的地址,后面的地址也不会被抛弃,只是当前不用。
(2)不考虑cookie的情况下,a->a相当于解析t的前四位字节,恰好前四位也是int类型,就可以解析出来t.m_i对应的值。

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

相关文章:

  • 常见锁的分类
  • vue 鼠标划入划出多传一个参数
  • svn项目同步到gitLab
  • 图解Dubbo,Dubbo 服务治理详解
  • Css 如何取消a链接点击时的背景颜色
  • 1.16.C++项目:仿muduo库实现并发服务器之HttpContext以及HttpServer模块的设计
  • ABAP 新增PO计划行时 新增行交货日期默认当前最大交期
  • VSCode怎么创建Java项目
  • 软件工程与计算(十四)详细设计中面向对象方法下的模块化
  • 商城免费搭建之java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c
  • python教程:selenium WebDriver 中的几种等待
  • 【MATLAB源码-第49期】基于蚁群算法(ACO)算法的栅格路径规划,输出最佳路径图和算法收敛曲线图。
  • LabVIEW生产者消费者架构
  • 成都瀚网科技:如何有效运营抖店来客呢?
  • iMazing2.17.3免费苹果手机备份还原助手
  • sql查询到了数据但是实体类个别字段为null(映射失败)
  • 配置VScode开发环境-CUDA编程
  • openGauss学习笔记-101 openGauss 数据库管理-管理数据库安全-客户端接入之用SSH隧道进行安全的TCP/IP连接
  • STM32如何使用中断?
  • 用于物体识别和跟踪的下游任务自监督学习-2-(计算机视觉中的距离度量+损失函数)
  • 热成像仪的工作原理及在工业设备状态监测中的应用
  • 什么是库存管理?无需Excel,2023年这几款大热库存管理软件你get了吗?
  • c# xml 参数配置表的使用
  • ubuntu20.04 nerf Instant-ngp
  • 隐写术--python隐写
  • MySQL的InnoDB存储引擎中的自适应哈希索引技术
  • 交互设计主要做什么?新手入门必读
  • 【深度学习实验】循环神经网络(三):门控制——自定义循环神经网络LSTM(长短期记忆网络)模型
  • flutter 消息并发时处理,递归查询
  • 第五十八章 学习常用技能 - 查看查询缓存