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

C++中的成员变量内存布局

简介

在C++中,按照我们一般的理解,在struct中依次定义的成员变量在内存中是连续存放的,然而事实真的是这样吗?

代码示例

请看如下的struct。

// mystruct.h

struct s_myStruct {

public:

       int   m_nID;           //    id

       int  m_nLength;   //     长度

protected:

       double m_dCoef;         //     系数

       string  m_strAddr;       // 地址

};

毫无疑问,在上述代码中,作为public成员的m_nID、m_nLength在内存中的地址是依次分配的,因此是连续的,作为protected成员的m_dCoef和m_strAddr在内存中的地址也是依次分配的,因此也是连续的。

那么m_nLength和m_dCoef的地址呢?也是挨着的吗?

答案是:不一定。

public、protected、private,都被称作访问限定符。被访问限定符限定的一组声明,我们可以称为“访问块”。在一个访问块内部定义的成员变量,其在内存中肯定是连续存放的。编译器一般会按照访问块出现的顺序给它们分配内存,但也不一定非要这样,这跟机器的体系结构以及操作环境有关。有时候,编译器会将public和protected成员提供明确的支持,将其放在特定的内存位置上。也就是说,这些"访问块"可以不按定义的顺序在对象的内存中出现。因此,千万不要肯定的认为:m_dCoef一定紧跟在m_nLength的内存后面,这可真的不一定哦!

结语

同一个访问块中的成员变量,其内存是连续分配的,不同访问块之间不一定按出现的顺序分配内存。


http://www.kler.cn/a/108742.html

相关文章:

  • Cesium加载大量点数据卡顿处理办法
  • 给查询业务添加redis缓存和缓存更新策略
  • LLM之模型评估:情感评估/EQ评估/幻觉评估等
  • XML Schema 字符串数据类型
  • 《基于深度学习的车辆行驶三维环境双目感知方法研究》
  • Mysql前言
  • MinIO安装
  • Ubuntu ARMv8编译Qt源码以及QtCreator
  • NEFU数字图像处理(三)图像分割
  • 安全狗安装
  • Angular-05:管道
  • ip地址默认子网掩码怎么算
  • 案例分析大汇总
  • IT行业就业热点与发展方向
  • 获取客户端请求IP及IP所属城市
  • postgresql14管理(六)-备份与恢复
  • MIT Kimera-VIO-ROS 安装
  • 一个阅读英文文档的记录与思考:
  • 【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割6(数据预处理)
  • 智能水厂运行与调控3D模拟仿真在线展示提高整个系统的协同效应
  • Unity Spine 指定导入新Spine动画的默认材质
  • 飞鼠异地组网工具基本使用教程
  • 第五章 I/O管理 二、I/O控制器
  • 大数据-Storm流式框架(八)---Storm案例
  • Docker 批量导入镜像
  • VTK OrientationMarker 方向 三维坐标系 相机坐标轴 自定义坐标轴