C++ 对象模型 | 关于对象

news2024/11/15 17:40:57

一、C++ 对象模型

1、对象内存布局

在C++中,有两种数据成员:staticnonstatic,以及三种成员方法staticnonstaticvirtual,下面从虚函数、非虚函数、静态成员变量、非静态成员变量等维度来分析,类对象的内存布局。例如:下面定义一个Point类,包含前面四种类型的成员

#include <iostream>
using namespace std;

class Point
{
public:
    Point(double val);
    virtual ~Point();         // virtual function numbers
    double GetPoint();        // notstatic function numbers
    static int PointCount();  // static function numbers
private:
    double m_x;           // notstatic data numbers
    static int m_count;   // static data numbers
};

int Point::m_count = 0;

Point::Point(double val):m_x(val) {}
Point::~Point() {}
double Point::GetPoint(){ return m_x; }
int Point::PointCount(){ return m_count; }

int main()
{
    Point pt(10.0);
    cout << sizeof(pt) << endl;  // 输出结果:16
    return 0;
}

一个实例对象中包含非静态数据成员虚表指针以及为对齐而必需的填充静态成员变量函数独立于单个实例化对象。

总结:影响C++对象大小的三个因素:非静态数据成员虚函数字节对齐

2、空对象

C++规定空类对象大小至少为1字节,只是为了区分实例化对象。如果创建了多个空类的对象,可以通过对象的内存地址区分。例如:下面创建一个空类Empty

#include <iostream>
using namespace std;

class Empty
{
};

int main()
{
    Empty e;
    cout << sizeof(e) << endl;  // 输出结果:1
    return 0;
}

3、数据成员的声明顺序与内存布局

3.1、声明顺序与内存布局

同一访问级别非静态数据成员声明顺序与内存中的布局是一致的(即:先声明的非静态数据成员,先分配内存地址)。不同访问控制级别的非静态数据成员,未规定内存分配顺序,但是实际上,编译是按照声明顺序来安排内存,例如:定义一个Point3d类,并打印出成员地址

#include <iostream>
using namespace std;

class Point3D
{
public:
    void Print() const {
        cout << "this addr " << this << endl;
        cout << "m_x addr " << &m_x << endl;
        cout << "m_y addr " << &m_y << endl;
        cout << "m_z addr " << &m_z << endl;
    }

private:
    int m_x;
    int m_y;
    int m_z;
};

int main()
{
    Point3D obj;
    obj.Print();

    return 0;
}

输出结果

this addr 0x61fe14
m_x addr 0x61fe14
m_y addr 0x61fe18
m_z addr 0x61fe1c

Process returned 0 (0x0)   execution time : 0.241 s
Press any key to continue.

3.2、声明顺序对内存的影响

字节对齐要求,对不同大小字节的非静态数据成员的声明顺序有什么启发?例如:分别定义Point3DPoint3D_Extend类,两个类具有相关的非静态数据成员,但是声明顺序不一样,两个类对象占用的内存大小也不一样

#include <iostream>
using namespace std;

class Point3D
{
private:
    int m_x;
    short m_w;
    int m_y;
    short m_v;
};

class Point3D_Extend
{
private:
    int m_x;
    int m_y;
    short m_w;
    short m_v;
};

int main()
{
    Point3D obj1;
    Point3D_Extend obj2;
    cout << "Point3D object size: " << sizeof(obj1) << endl;
    cout << "Point3D_Extend object size: " <<sizeof(obj2) << endl;

    return 0;
}

输出结果:

Point3D object size: 16
Point3D_Extend object size: 12

Process returned 0 (0x0)   execution time : 0.241 s
Press any key to continue.

结论:相同大小的非静态数据成员放在一起,可以减少一个类对象内存占用

4、继承下的内存布局(非多态)

4.1、单继承内存布局

当把一个大的object赋值给小的object时,会引起object的切割,将大object的subobject赋值给小的object。C++保证出现在derived class中的base class subobject有其完整原样性(即:派生类对象中有一个完整的基类对象)。例如:分别定义Point2dPoint3d

#include <iostream>
using namespace std;

class Point2D
{
protected:
    int m_x;
    short m_y;
};

class Point3D : public Point2D
{
private:
    short m_z;
};

int main()
{
    Point2D *p1, *p2;
    p1 = new Point2D;
    p2 = new Point3D;
    *p1 = *p2;  // 大的对象赋值给小的对象时,会引起对象的切割

    return 0;
}

4.2、多继承与多重继承的对象布局

多继承场景内存布局同单继承场景类似,如下:

在这里插入图片描述

5、继承下的内存布局(多态)

如果类中声明了虚函数,会给类对象创建一个虚函数指针,指向虚函数表。基类与派生类都有自己的虚函数指针、如果派生类不实现基类的虚函数,派生类的虚函数表相同索引位置存储的是基类的虚函数指针。

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

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

相关文章

苍穹外卖Day01——总结1

总结1 1. 软件开发整体介绍1.1 软件开发流程1.2 角色分工1.3 软件环境 2. 苍穹外卖项目介绍2.1 项目介绍2.2 技术选项 3. Swagger4. 补充内容&#xff08;待解决...&#xff09; 1. 软件开发整体介绍 1.1 软件开发流程 1.2 角色分工 从角色分工里面就可以查看自己以后从事哪一…

lv14 IO模型:阻塞和非阻塞 7

1 五种IO模型------读写外设数据的方式 阻塞: 不能操作就睡觉 非阻塞&#xff1a;不能操作就返回错误(通过轮询即才能实现阻塞的情况 &#xff09; 多路复用&#xff1a;委托中介监控 信号驱动&#xff1a;让内核如果能操作时发信号&#xff0c;在信号处理函数中操作 异步IO&a…

视频AI智剪方法:快速批量处理视频,批量剪辑视频的操作

随着科技的飞速发展&#xff0c;视频内容已是获取信息和娱乐的主要方式之一。对于视频创作者和内容生产者来说&#xff0c;如何快速、高效地处理和剪辑大量视频已成为一项重要的需求。现在借助AI技术的不断发展&#xff0c;可以更加智能、高效的处理视频。下面来看云炫AI智剪如…

kubernetes入门到进阶(5)

目录 镜像仓库&#xff1a;怎么用好docker hub这个宝藏 什么是镜像仓库&#xff08;Registry&#xff09; 什么是docker hub 如何在docker hub上挑选镜像 docker hub上进行概念股命名规则是什么 该怎么上传自己的镜像 离线环境该怎么办 小结 镜像仓库&#xff1a;怎么用好docke…

《BackTrader量化交易图解》第8章:plot 绘制金融图

文章目录 8. plot 绘制金融图8.1 金融分析曲线8.2 多曲线金融指标8.3 Observers 观测子模块8.4 plot 绘图函数的常用参数8.5 买卖点符号和色彩风格8.6 vol 成交参数8.7 多图拼接模式8.8 绘制 HA 平均 K 线图 8. plot 绘制金融图 8.1 金融分析曲线 BackTrader内置的plot绘图函…

多线程-synchronized详解

1、基本作用&#xff1a;Java提供了一种内置的锁机制来支持原子性&#xff0c;同步代码块&#xff08;Synchronized Block &#xff09; 同步代码块包括两个部分&#xff1a; 1、锁的对象引用。2、锁作用的代码块。 例子&#xff1a; synchronized(Object){ //被保护的共享…

windows安装kafka以及kafka管理工具推荐

windows安装 1.下载地址 下载地址 下载最新版本的.tgz文件解压 2.修改配置 修改config目录下的zookeeper.properties中的dataDir属性 server.properties文件中的log.dir属性 3.启动zookeeper 进入到bin\windows\下的用cmd输入zookeeper-server-start.bat ..\..\config\zo…

【陈老板赠书活动 - 21期】- Python树莓派编程从零开始(第3版)

陈老老老板&#x1f9d9;‍♂️ &#x1f46e;‍♂️本文专栏&#xff1a;赠书活动专栏&#xff08;为大家争取的福利&#xff0c;免费送书&#xff09; &#x1f934;本文简述&#xff1a;活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f473;‍♂️上一篇文章&#xff…

LaTex引用字体变色

使用下面这条语句进行修改。 ‘citecolor’改变参考文献颜色&#xff0c; ‘linkcolor’改变图标公式引用的颜色&#xff0c; ‘urlcolor’ 文本网站超链接颜色。 \usepackage[colorlinks,bookmarksopen,bookmarksnumbered,citecolorblue, linkcolorblue, urlcolorblue]{hyper…

Python 常用数据类型

Python 常用数据类型有以下这些&#xff1a; 数据类型中文解析例子int整数&#xff0c;表示整数值1、2float浮点数&#xff0c;表示带有小数点的数值3.14、2.718complex复数&#xff0c;表示实部和虚部组成的复数12j、3-4jstr字符串&#xff0c;表示文本数据&#xff0c;用引号…

最优化理论分析复习--最优性条件(一)

文章目录 上一篇无约束问题的极值条件约束极值问题的最优性条件基本概念只有不等式约束时 下一篇 上一篇 最优化理论复习–对偶单纯形方法及灵敏度分析 无约束问题的极值条件 由于是拓展到向量空间 R n R^n Rn, 所以可由高数中的极值条件进行类比 一阶必要条件 设函数 f (…

SpringCloud系列篇:核心组件之配置中心组件

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于SpringCloud的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.前言 二.配置中心组件是什么 三…

【年度重磅】《2023华为开发者宝典》覆盖16+技术领域,30+华为云专家倾力打造,免费下载

《2023华为开发者宝典》重磅发布&#xff0c;点击下载&#xff0c;欢迎大家转发赠阅&#xff0c;相互交流学习。 时光荏苒&#xff0c;转眼间我们已经告别挑战与机遇并存的2023年&#xff0c;迎接充满无限可能的2024年。 截至到2023年&#xff0c;华为云生态已聚合了全球超过5…

大数据StarRocks(四) :常用命令

这次主要介绍生产工作中使用Starrocks时的常用命令 4.1 连接StarRocks 4.1.1 Linux命令行连接 [roothadoop1011 fe]# yum install mysql -y [roothadoop1011 fe]# mysql -h hadoop101 -uroot -P9030 -p4.1.2 Windows客户端 DBeaver 连接 4.2 常用命令 4.2.1 查看状态 1. 查…

用js随机添加字母

样式 <style>.itp {width: 200px;height: 60px;border: 5px solid red;text-align: center;line-height: 60px;font-size: 30px;margin: 10px;}button {width: 80px;height: 30px;color: rgb(229, 225, 232);border-radius: 4px;font-size: 20px;outline: none;border: …

猫头虎分享已解决Bug || 解决Vue.js not detected的问题 ️

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

WEB 3D技术 three.js 顶点旋转

我们来说说几何体顶点的旋转 官网搜索 BufferGeometry 这里 我们有 x y z 三个轴的旋转 例如 我们这样的代码 import ./style.css import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"; i…

阿里云新用户的定义与权益

随着云计算的普及&#xff0c;阿里云作为国内领先的云计算服务提供商&#xff0c;吸引了越来越多的用户。对于新用户来说&#xff0c;了解阿里云新用户的定义和相关权益非常重要&#xff0c;因为它关系到用户能否享受到更多的优惠和服务。 一、阿里云新用户的定义 阿里云新用户…

arm64架构编译electron长征路

1. gn工具生成 在arm64下需要构建对应架构的gn文件。 源代码下载,并且切换到对应的版本。 git clone https://gn.googlesource.com/gn cd gn git checkout 5a004f9427a0将gn源码放在src/tools/gn目录下,内容如下图 1.1 问题,找不到last_commit_position.h文件 问题描述如…

Flask:URL与视图映射

本文章只作为个人笔记. 文章目录 前言一、URL与视图映射二、介绍总结 前言 第二个flask项目. 一、URL与视图映射 开启debug模式. from flask import Flask, requestapp Flask(__name__)# url:http[80]/https[443]://ww.qq.com:443/path # url与视图:path与视图app.route(/)…