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

C++ 对象模型 C++ Object Model

C++ 对象模型 C++ Object Model

文章目录

  • C++ 对象模型 C++ Object Model
    • C语言的数据及函数
    • C++的类
    • C++对象模型

C语言的数据及函数

C语言中,数据和函数是分开声明的。

  • 数据
typedef struct point2d
{float x;float y;
} Point2d;
  • 函数

打印Point2d的数值

void Point2d_print(const Point2d * pd)
{printf("(%f, %f)", pd->x, pd->y);
}

C++的类

同样实现C语言的功能,C++中可以进行如下定义

class Point2d
{Point2d(float x, float y):m_x(x), m_y(y){}print(){printf("(%f, %f)", m_x, m_y);}private:float m_x;float m_y;
};

问题:Point2d从C到C++,内存布局上有啥变化呢?

答案是没有变化。
本例中,C++ 中的数据成员和C中一样,不一样的是C++中多了一个非静态成员函数print,但非静态成员函数与数据成员是分离的,并不占用类的大小。也就是说print函数的调用实际为print(Point2d* pd),就如同C语言的Point2d_print调用。

C++内存布局的额外负担有virtual引起,主要包好虚函数(virtual function)和虚基类(virtual base class)。

C++对象模型

C++中,
类数据成员有两种:静态(static) 和 非静态(nonstatic)
类成员函数有三种:静态函数(static)、非静态函数(nonstatic) 和 虚函数(virtual)

C++对象模型:

  1. 非静态(nonstatic)数据成员在类内部
  2. 静态(static)在类外部
  3. 静态函数(static)和非静态函数(nonstatic)在类外部
  4. 虚函数(virtual):
    a. 每个类产生一堆指向虚函数的指针,放在虚表(virtual table, vtbl)
    b. 每个类对象添加一个指向虚表的指针(vptr)。
    c. 每个类的type_info(用于支持RTTI)也由虚表指定,一般位于第一个slot处。
class Point2d
{Point2d(float x, float y):m_x(x), m_y(y),m_pointCount(2){}virtual ~Point2d(){}static int getPointCount(){return m_pointCount;}print(){printf("(%f, %f)", m_x, m_y);}private:float m_x;float m_y;static int m_pointCount;
};

上述代码的C++对象模型如下

+---------------+
|  float m_x;   |            virtual table
+---------------+
|  float m_y;   |          +---------------+
+---------------+          |               |      +--------------------+
|  vptr Point2d +---------->               +------> type_info(RTTI     |
+---------------+          +---------------+      +--------------------+|               |      +--------------------+Point2d pt2;            |               +------> Point2d::~Point2d()|+---------------+      +--------------------++-------------------------------------+       +------------------------------------+
| static int Point2d::m_pointCount    |       | Point2d::Point2d(float x, float y) |
+-------------------------------------+       +------------------------------------++-------------------------------------+       +------------------------------------+
| static int Point2d::getPointCount() |       | Point2d::print()                   |
+-------------------------------------+       +------------------------------------+

Reference:

  1. 深度探索C++对象模型
http://www.lryc.cn/news/103224.html

相关文章:

  • leetcode做题笔记47
  • Linux Day04
  • 上海亚商投顾:沪指冲高回落 两市成交重回万亿
  • 2023最新版本~十分钟零基础搭建EMQX服务器
  • SpringBoot2.5.6整合Elasticsearch7.12.1
  • 准大一信息安全/网络空间安全专业学习规划
  • WEB:php_rce
  • 问题:idea启动项目错误提示【command line is too long. shorten command line】
  • xshell连接Windows中通过wsl安装的linux子系统-Ubuntu 22.04
  • 子域名收集工具OneForAll的安装与使用-Win
  • 报数游戏、
  • 规约模式:优雅设计与灵活应用
  • Ubuntu Server版 之 apache系列 安装、重启、开启,版本查看
  • Redis学习路线(4)—— Redis实现项目缓存
  • 【Unity造轮子】实现一个类csgo的武器轮盘功能
  • 代码随想录算法训练营第三十天 | 单调栈系列复习
  • redis数据未到过期时间被删除
  • 32.选择器
  • Linux--验证命令行上运行的程序的父进程是bash
  • MySQL数据库关于表的一系列操作
  • Spring基于注解管理bean及全注解开发
  • QtC++ 技术分析3 - IOStream
  • 2023年Q2京东环境电器市场数据分析(京东数据产品)
  • TCP/UDP的首部
  • Kubernetes(K8s)从入门到精通系列之四:K8s的基本概念和术语之集群类
  • 黑马头条---day1
  • 【序列化工具JdkSerialize和Protostuff】
  • C++ 多线程编程导论(下)
  • Java并发系列之一:JVM线程模型
  • 容灾独家技术揭秘:HyperBDR无主机数据同步技术