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

C++类内存结构模型

内存分区

内存全局数据区,代码区,栈区,堆区。

定义一个类

类的成员函数被放在代码区

类的静态成员变量被放在全局数据区(不占用类的存储空间)

非静态成员在类的实例内,实例在栈区或者堆区

虚函数指针,虚基类指针在类的实例内,实例在堆区或者栈区

内存布局实例

普通类(不携带静态成员,也没有继承关系)

class A1
{
public:void func1() {};
public:int a1;char a2;char a3;
};class A2
{
public:void func2() {};
public:char a1;int a2;char a3;
};

class A1 size(8):
±–
0 | a1
4 | a2
5 | a3
| (size=2)
±–
class A2 size(12):
±–
0 | a1
| (size=3)
4 | a2
8 | a3
| (size=3)
±–

A1类携带3个成员变量及1个成员函数,成员函数不占用内存,在x86平台下,整型变量a1(占用4个字节),字符型变量a2(占用一个字节),a3(占用一个字节), 总共占用内存为 8 字节。因为内存是4字节对齐的,2个字符变量占用2字节被补齐为4字节。

A2类携带和A1类相同的变量,只不过调整了下顺序,第1个为字符变量(占用1个字节,补齐为4字节),第2个为整型变量(占用4字节),第3个为字符变量(占用1字节补齐为4字节)

类(携带静态成员变量)

class B
{
public:void func1();
public:static int b1;int b2;
};

该类的类名为B。用简图表示该类内存布局:

class B size(4):
±–
0 | b2

​ ±–

B类携带静态整型成员变量b1和整型变量b2,静态整型变量b1不占用类的内存,整型变量占用4字节的内存,因而B类占用内存为4字节。

类(携带虚函数,并继承)

class C1
{
public:void func1();virtual void func2();
public:int a1;
};class C2 : public C1
{
public:void func2() override;
};class C3
{
public:virtual void func1();virtual void func2();
public:int a1;
};

class C1 size(8):
±–
0 | {vfptr}
4 | a1
±–
C1::$vftable@:
| &C1_meta
| 0
0 | &C1::func2
C1::func2 this adjustor: 0

class C2 size(8):
±–
0 | ±-- (base class C1)
0 | | {vfptr}
4 | | a1
| ±–
±–
C2::$vftable@:
| &C2_meta
| 0
0 | &C2::func2
C2::func2 this adjustor: 0

class C3 size(8):
±–
0 | {vfptr}
4 | a1
±–
C3::$vftable@:
| &C3_meta
| 0
0 | &C3::func1
1 | &C3::func2
C3::func1 this adjustor: 0
C3::func2 this adjustor: 0

类C1携带整型成员变量a1(占用4字节内存),普通成员函数func1,虚成员函数func2(一旦一个类对象携带虚函数,则该类有一个虚函数指针,在x86平台下,该指针的大小为4字节)故而类C1的大小为8字节。虚函数指针指向一个虚函数表(是一个数组),类C1中有多少个虚函数,虚函数表中就有多少个虚函数(数组中就有多少个虚函数,按照定义虚函数的顺序进行排列)

类C2继承类C1,虚函数func2继承于类C1,C2的虚函数表的第1个元素即为C2:func2

类C3携带2个虚函数,虚函数表中有2个元素,第1个元素为C3:func1 ,第2个元素为C3:func2

类(携带虚函数,并多继承)

class D1
{
public:virtual void func1();
};class D2
{
public:virtual void func2();
};class D3 : public D1, D2
{
};

class D1 size(4):

±–

0 | {vfptr}

±–

D1::$vftable@:

| &D1_meta

| 0

0 | &D1::func1

D1::func1 this adjustor: 0

class D2 size(4):

±–

0 | {vfptr}

±–

D2::$vftable@:

| &D2_meta

| 0

0 | &D2::func2

D2::func2 this adjustor: 0

class D3 size(8):

±–

0 | ±-- (base class D1)

0 | | {vfptr}

| ±–

4 | ±-- (base class D2)

4 | | {vfptr}

| ±–

±–

D3::KaTeX parse error: Expected 'EOF', got '&' at position 17: …ftable@D1@: | &̲D3_meta | 0 0…vftable@D2@:
| -4
0 | &D2::func2

类D3继承D1和D2,D3中含有2个虚函数指针,占用大小为8字节,虚函数指针1指向D1的虚函数表,虚函数D2指向D2的虚函数表。(这部分可能理解有误,如有错误,希望帮忙指出)

相关文章:

C++类内存结构模型

内存分区 内存全局数据区,代码区,栈区,堆区。 定义一个类 类的成员函数被放在代码区 类的静态成员变量被放在全局数据区(不占用类的存储空间) 非静态成员在类的实例内,实例在栈区或者堆区 虚函数指针&…...

HTML#4超链接标签,列表标签,表格标签和布局标签

一. 超链接标签介绍<a> 定义超链接,用于连接到另一个资源herf: 指定访问资源的URLtarget: 指定打开资源的方式代码<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>超链接标签</title> <…...

本科课程【数字图像处理】实验汇总

文章目录 实验1 - 腐蚀与膨胀实验2 - 图像增强实验3 - 图像的几何变换实验4 - 图像的蒙纱效果实验5 - 空洞填充实验6 - 取阈值的邻域平均算法实验7 - 图像的平移与伸缩变换实验1 - 腐蚀与膨胀 实验目的 分析掌握腐蚀与膨胀的基本原理,编写腐蚀与膨胀的算法,并掌握开闭运算的规…...

nginx安装lua、jwt模块,通过lua验证jwt实现蓝绿发布样例

文章目录前言一、基础组件下载二、组件安装1.luajit安装2.lua-nginx-module安装3.lua-resty-core安装4.lua-resty-lrucache安装5.ngx_devel_kit安装6.nginx加载lua模块7.lua-cjson安装8.lua-resty-string安装9.lua-resty-jwt安装10.lua-resty-hmac安装三、验证jwt中属性实现蓝绿…...

【redis的几种数据结构及在Java里的应用案例】

Redis是一款高性能的key-value存储系统&#xff0c;支持多种数据结构&#xff0c;包括字符串、列表、哈希表、集合和有序集合等。下面是Redis的几种数据结构及在Java中的应用案例&#xff1a; string 字符串(String) 字符串是Redis中最基本的数据类型&#xff0c;用于存储字符…...

【mybatis】 01- mybatis快速入门

数据库创建(注意&#xff1a;最好先创建好数据库设置utf8再进行表创建) create database mybatis; use mybatis;drop table if exists tb_user;create table tb_user(id int primary key auto_increment,username varchar(20),password varchar(20),gender char(1),addr varch…...

【C语言每日一题】杨氏矩阵(源码以及改进源码)

【C语言每日一题】—— 杨氏矩阵&#x1f60e;&#x1f60e;&#x1f60e; 目录 &#x1f4a1;前言&#x1f31e;&#xff1a; &#x1f49b;杨氏矩阵题目&#x1f49b; &#x1f4aa; 解题思路的分享&#x1f4aa; &#x1f60a;题目源码的分享&#x1f60a; &#x1f4…...

JavaScript 面向对象【快速掌握知识点】

目录 类和对象 属性和方法 继承 多态 封装 类和对象 类是用于定义对象的模板或蓝图&#xff1b;它包含对象的属性和方法&#xff0c;我们可以使用class关键字来定义类。 class Person {constructor(name, age) {this.name name;this.age age;}sayHello() {console.log(H…...

Qt——自定义Model

众所周知&#xff0c;Qt提供了一套Model/View框架供开发者使用&#xff0c;Model用来提供数据&#xff0c; View则用来提供视觉层的显示。实际上这是一套遵循MVC设计模式的GUI框架&#xff0c;因为Qt还提供了默认的Delegate作为Controller来作为控制器。 MVC的好处这里就不多说…...

用 .NET 启动你的 DJI Ryze Tello 无人机

大疆的 DJI Ryze Tello 是入门级的无人机&#xff0c;不仅在 STEM 教育中有非常广泛的应用&#xff0c;也可以作为编程入门的首选。通过 UDP 协议调用 DJI Ryze Tello SDK 可以让 DJI Ryze Tello 无人机执行起飞&#xff0c;降落&#xff0c;转向以及不同的花式动作。本文将会通…...

sed 功能详解

介绍sedsed是一种流编辑器&#xff0c;它一次处理一行内容&#xff0c;把当前处理的行存储在临时缓冲区中&#xff08;buffer&#xff09;,称为"模式空间"&#xff0c;接着sed命令处理缓冲区中的内容&#xff0c;处理完成后&#xff0c;把缓冲区的内容送往屏幕&#…...

整数二分思路详解

题目描述 给定一个按照升序排列的长度为n的整数数组&#xff0c;以及 q 个查询。 对于每个查询&#xff0c;返回一个元素k的起始位置和终止位置&#xff08;位置从0开始计数&#xff09;。 如果数组中不存在该元素&#xff0c;则返回“-1 -1”。 输入格式 第一行包含整数n和q&a…...

基于java的进销库存管理系统(Vue+Springboot+Mysql)前后端分离项目,附万字课设论文

1.3 系统实现的功能 本次设计任务是要设计一个超市进销存系统&#xff0c;通过这个系统能够满足超市进销存系统的管理及员工的超市进销存管理功能。系统的主要功能包括&#xff1a;首页、个人中心、员工管理、客户管理、供应商管理、承运商管理、仓库信息管理、商品类别管理、 …...

手动添加 Grub 启动项

1. 问题背景 自己的台式机上装了好几块硬盘&#xff0c;因为自己又菜又喜欢折腾&#xff0c;几乎每块上都有一个操作系统&#xff0c;其中两个 m.2 的硬盘上分别装着一个 windows11 和一个 Ubuntu20.04。但在另外一块机械硬盘中还装着更早的一个 Ubuntu18.04&#xff0c;我电脑…...

工人搬砖-课后程序(JAVA基础案例教程-黑马程序员编著-第八章-课后作业)

【案例8-4】 工人搬砖 【案例介绍】 1.任务描述 在某个工地&#xff0c;需要把100块砖搬运到二楼&#xff0c;现在有工人张三和李四&#xff0c;张三每次搬运3块砖&#xff0c;每趟需要10分钟&#xff0c;李四每次搬运5块砖&#xff0c;每趟需要12分钟。本案例要求编写程序分…...

深度学习中backbone、head、neck等概念

1.backbone 翻译为主干网络的意思&#xff0c;既然说是主干网络&#xff0c;就代表其是网络的一部分。这个主干网络大多时候指的是提取特征的网络&#xff0c;其作用就是提取图片中的信息&#xff0c;供后面的网络使用。这些网络经常使用的是ResNet VGG等&#xff0c;而不是我…...

华为OD机试用Python实现 -【Linux 发行版的数量】(2023-Q1 新题)

华为OD机试题 华为OD机试300题大纲Linux 发行版的数量题目描述输入描述输出描述说明示例一输入输出说明Python 代码实现代码编写逻辑华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:blog.csd…...

Http报文解析

http通信流程浏览器->已监听的web服务器->read->write->close http请求报文: a.请求方法: POST GET DELETE HEAD OPTIONS PUT TRACE b.请求地址: /xxx/yyy/zzz c.报文协议: HTTP/1.1 d.请求报文头: Accept Referer Accept-Language Content-Type Host Content-Len…...

Vue下载安装步骤的详细教程(亲测有效) 2 安装与创建默认项目

上篇请移步到Vue下载安装步骤的详细教程(亲测有效) 1_水w的博客-CSDN博客 上一篇博文已经对Node.js的安装与配置进行了详细介绍。 另外&#xff1a;文中项目存放的路径及项目名称可根据自身实际情况进行更改。 目录 三、Vue安装配置 1、搭建Vue脚手架 2、通过NPM安装Vue …...

TIA博途Wincc中自定义配方画面的具体方法示例

TIA博途Wincc中自定义配方画面的具体方法示例 前面和大家分享了通过TIA博途自带的配方视图组态配方功能的具体方法,具体内容可参考以下链接中的内容: TIA PORTAL wincc中配方recipe组态及配方视图的使用方法 但是,使用配方视图的时候感觉不是很方便,同时一部分使用人员也感…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...