关于虚表的疑惑与证实

深度学习12—VGG19实现 state_dict = load_state_dict_from_url(model_urls['vgg19'],model_dir='./model' ,progress=progress)#预训练模型地址。accuracy=((out.argmax(1)==label).sum()).clone().detach().cpu().numpy()#正确预测的总和比测试集的长度,即预测正确的精度。image=torch.reshape(image,(1,3,224,224))#四维图形,RGB三个通。 阅读详情


一直以来都有一个困惑,但从未动手去证实,就是关于含虚函数的同一类的每个对象各有一张虚表吗?
今天突然有了一些想法,于是决定先提出自己的想法,并且顺便证实一下,

先来假设每个对象各有一张虚表
1、如果有类中有很多虚函数,那么虚表就可能很大,如果每个对象都有一个独立的虚表,那么消耗的内存会非常大,C++的设计者应该不会如此糊涂,假设不成立
2、如果即使一个虚函数被重写无数次,在某个特定类(父类或继承链中的类)中的某个特定函数的实现在代码段中一定是唯一的(如父类中的某一输入、输出类型固定的虚函数只有一份特定实现),
这样的话,如果同一类的每个对象各有一张表,那么每个对象的各自虚表都会为存一样的虚函数地址,这也完全没必要,假设不成立
 如子类 Test Derived内的一个名为Test的特定虚函数,其地址为0x123456,存在对象 A(为Test类型)、B(为Test类型),如果按照假设,那么A、B各自的表中都有有一个位置存0x123456

现在假设同一类型每个对象共享一张表
由于每一个非静态成员函数都含一个this指针,虚函数也不例外,而正好,通过this指针可以确定某个特定对象的地址,这样即使每个对象共享一张虚表,函数也能区分具体是那个对象对其进行了调用,这样应该是没问题的

(非同一类的含虚函数的类型的不同对象不共享相同的虚表,这个无需证实与猜想)

测试代码如下

#include <iostream>
class Base
{
public:
	virtual void Test()
	{
	}
};

class Derived : public Base
{
	void Test()
	{
		unsigned *Vptr_Addr = reinterpret_cast<unsigned*>(this);
		unsigned VP_Table_Addr = *Vptr_Addr;
		std::cout << L"虚表地址是:" << VP_Table_Addr << std::endl;
	}
};

class Func
{
public:
	static void OutPutAddr(Base& base)
	{
		base.Test();
	}

};
int main(int argc, char **argv)
{
	Derived A, B, C;
	Func::OutPutAddr(A);
	Func::OutPutAddr(B);
	Func::OutPutAddr(C);

	getchar();
}

(g++就不测试了,应该是一样的结果)

输出如下

结论:含虚函数的同一类型每个对象共享一张表

[ vulhub漏洞复现篇 ] ActiveMQ反序列化漏洞复现(CVE-2015-5254) Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务、集群、Spring Framework等。由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行。Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类。...... 阅读详情

相关推荐

别再死记硬背了!用‘瞬时极性法’5分钟搞定三极管反馈电路类型判断

本文介绍了使用‘瞬时极性法’快速判断三极管反馈电路类型的高效技巧。通过假设输入信号变化并追踪传递路径,该方法能准确区分正负反馈、电压电流反馈、串联并联反馈及交直流反馈,避免传统死记硬背的弊端,显著提升电路分析效率。

weixin_42524708的博客 183

深入分析虚函数表

相关虚函数表的问题分析: (1)一个类只有包含虚函数才会存在虚函数表,同属于一个类的对象共享虚函数表,但是有各自的vptr(虚函数表指针),当然所指向的虚函数表是同一个。 (2)父类中有虚函数就等于子类中有虚函数。只要父类中有虚函数,子类中即便不写virtual,也依旧是虚函数。 (3)不管是父类还是子类,都会只有一个虚函数表。不能认为子类继承父类,就认为子类的虚函数表就是,父类的虚函数表+...

weixin_42136255的博客 1772

中国主要湖泊水库面状矢量边界图层ArcGIS应用实战:从数据获取到专题图制作

本文详细介绍了中国主要湖泊水库面状矢量边界图层在ArcGIS中的实战应用,从数据获取到专题图制作的全流程。涵盖官方数据源、科研机构共享数据及商业平台的选择,以及ArcGIS中的数据处理、拓扑错误修正和专题图设计技巧,帮助用户高效完成湖泊水库的空间分析与可视化。

weixin_33672400的博客 255

再探虚表

1、是一个类一个虚表 还是一个对象一个虚表? 2、虚表里面是否只有函数指针? 序 :以下测试和结论都是以单继承的基础。 问题1:虚表是什么,存在哪里,与类和其实例化对象有啥关联 众所周知,虚表实际是一个个函数指针的集合,该集合是个数组 。那它存在哪里,与对象、类是什么关系。今天我们从代码层面上来一探究竟。 //第一个示例,定义个含有虚函数的类型,并用之示例化 ...

刘燏(Net) 487

手把手教 - VSCode 开发 GD32F450 单片机

系统版本:rt-thread v5.2.2单片机型号:GD32F450ZK基于文章进行开发。

weixin_46158019的博客 841

SAP 物料账前期没有运行的解决方法

If you use the actual costing (material ledger), you must have completely closed all period-end closing operations in the actual costing for the penultimate period prior to the period shift. Use the '...

含笑饮砒霜死后更嚣张 3316

C++ - 多继承方式会产生多个虚函数表

1.多重继承可能产生多个虚函数表 代码示例:会产生多个虚函数表 #include <iostream> #include <string> using namespace std; class BaseA { public: virtual void funcA() { cout << "BaseA::funcA()" << endl; } }; class BaseB { public:

weixin_49303682的博客 3202

LED背光驱动电路解析:从MP3394芯片到液晶屏灯管控制

本文深入解析了以MP3394芯片为核心的LED背光驱动电路工作原理。从升压电路的能量转换到多路LED的均流控制,详细阐述了其作为液晶屏背光“大脑”的关键作用,并提供了黑屏、闪屏、亮度不均等常见故障的实战检修思路与排查方法。

agile9scrum的博客 822

了解多态吗?虚函数底层?虚函数表是每个对象有一份还是每个对象有一份?虚函数表存放在哪个位置?

多态 多态就是在函数前面加上virtual关键字,然后在派生类中重写该函数。运行时,会根据基类指针指向的对象的实际类型来调用相应的函数。 类中声明virtual的话,编译器会自动生成虚表,每个类中都有一个虚表(一维数组)。每个对象都有一个指向虚表的指针(对象地址的前四个字节就是指向虚表的指针)。虚表存的是虚函数地址。 析构函数必须声明为虚函数,因为删除该类指针时,需要调用相应的虚构函数,如果没有声明,则删除基类指针只会调用基类的析构函数,派生类的析构函数没有被调用,则造成内存泄漏。 虚函数表存放在常量区。

mazamu的博客 1043

planning模块(6)-参考线的平滑(二次规划)

上一篇已经介绍了采样点生成锚点数据的过程,并且将所有采样点生成的锚点数据设置到了平滑器中.接下来继续介绍使用二次规划平滑参考线的算法过程.从锚点数据中提取坐标存入raw_point2d,提取横向边界存入anchorpoints_lateralbound,将起点和终点的横向边界设置为0,防止车在起点和终点位置偏离车道中心线.

让复杂的问题变得更容易理解 787

代谢组数据分析(十五):基于python语言构建PLS-DA分类预测模型

本教程阐述典型代谢组学数据分析工作流程,用于二元分类结果的研究。流程主要步骤如下:首先从 Excel 表格导入代谢物与实验数据,接着基于汇总 QC 进行数据清洗。随后借助主成分分析可视化检查数据质量,再开展两类单变量统计。之后运用偏最小二乘判别分析(PLS - DA)实施多变量分析,此过程涵盖模型优化(对比 R2 与 Q2)、置换测试及明确模型预测指标、确定特征重要性、对模型预测数据进行可视化。最终将统计表格导出至 Excel 表格,完整呈现从数据导入到分析结果输出的全过程。

专注生信领域 2875

c++对象模型探索(一)

粗略阅读了《深度探索c++对象模型》一书后,对c++对象底层的内存布局有了一些了解,但同时,也产生了一些疑惑: 1、将子类指针用dynamic_cast转成父类指针之后,其虚表指针会相应变化么? 2、父类转子类呢? 以下是验证疑惑的代码: #include <iostream> class A { public: virtual void func() ...

weixin_30556161的博客 150

海康VisionMaster与西门子PLC1200进行S7通信

通信是连通算法平台和外部设备的重要渠道,在海康VisionMaster算法平台中既支持外部数据的读入也支持数据的写出,当通信构建起来以后既可以把软件处理结果发送给外界,又可以通过外界发送字符来触发相机拍照或者软件运行。 本文以西门子PLC1200作为外部设备为例,讲解海康VisionMaster与西门子PLC1200进行S7通信。......

haier123888的博客 1万+

C++虚表

虚函数   在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数称为虚函数,语法格式: virtual 成员函数名()   重写: 必须是虚函数 子类定义了一个和父类完全相同的成员函数,包括返回值类型、函数名、参数列表 重写也称为覆盖 上代码镇楼: class A { public: virtual void func() { ...

CY071512的博客 1474

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

虚表和虚指针

一、关于虚函数 C++的多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。   1、多态性    指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。    a、编译时多态性:通过重载函数实现    b、运行时多态性:通过虚函数实现。    2、虚函数 ...

雪雪 3530

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

关于虚表和虚表指针

有关知识复习1:动态多态 动态绑定:在程序执行期间(非编译期间)判断所引用对象的实际类型,根据其实际类型调用相应的方法。 2:动态多态具体实现、class A { public: virtual void funtest1() { cout << "A.funtest1" << endl; } virtual void funtest2()

理想今年你几岁的博客 3814

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++单个类的所有对象是否共享虚函数表的验证

今天偶然看到这个面试题,第一感觉是既然所有对象共享虚函数代码,那么虚函数指针对所有对象就是一样的,因此虚函数表也就是一样的,没有必要为每个对象复制一份一模一样的虚函数表。所以做个验证,在这儿记录一下。如有错误,欢迎留言指正,感谢感谢。

a_big_pig的专栏 3007

C++一个类实例化后的对象中虚函数表是共用的吗

我们首先知道,不同的类具有不同的虚函数表,但是如果针对一个类如果实例化多个对象,那么这些对象的虚函数表是共用的吗?首先如果自己去设计内存占用时,从节省内存的角度去考虑的话,我觉得这些实例化后的类应该是共用一张虚函数表的,因为每个内中的虚函数都是一样的。因此,我们可以如下进行一些验证: class classA { virtual void function() { } }; ...

ZGT的博客 4255

C++ 关于类与对象在虚函数表上唯一性问题 浅析

很多教材上都有介绍到虚指针、虚函数与虚函数表,有的说类对象共享一个虚函数表,有的说,一个类对象拥有一个虚函数表;还有的说,无论用户声明了多少个类对象,但是,这个VTABLE虚函数表只有一个;也有的在说,每个具有虚函数的类的对象里面都有一个VPTR虚函数指针,这个指针指向VTABLE的首地址,每个类的对象都有这么一种指针。今天,我们就来解决这个问题,同一个类的不同对象,是不是拥有“相同”的虚函数表,这个相同是物理上的相同(内存地址)还是逻辑上的相同(数据结构)。本文现详述如下!

稚枭天卓 5244

虚指针存在证明及虚函数表

C++多态的实现原理是依赖虚指针来辨别具体使用家族类中的哪一个函数。以下就来证明虚指针的存在。 我们知道,指针的大小在一般情况下是4个字节,所以我们建立一个虚函数,再来计算该类的大小,便可以验证虚函数的存在。 代码如下:#include <iostream> using namespace std;class A { public: void print ()

nwd0729的专栏 1128

虚表

对象没有虚函数表,对象只有一个虚函数的指针vptr,指向在存在代码段的虚表. 在单继承的子类中,子类只维护一张虚表 总结:vtable是属于类的,存在代码段中,含有虚函数的对象中有vptr指向vtable

qq_40760291的博客 250

从类内存看虚表

结合https://blog.youkuaiyun.com/oyhb_1992/article/details/79841978文章看情形一:单继承,派生类中只有一个虚表#include "stdafx.h" using namespace std; #include &lt;iostream&gt; // 基类A class A { public: int dataA; virtual void fo...

欧阳海宾 317

c++::详解虚表

(注:以下的运行环境是vs2008) 【虚表的定义】: 1.1定义: 每个有虚函数的类或者虚继承的子类,编译器都会为它生成一个虚表,表中的每一个元素都指向一个虚函数的地址(虚表是从属于类的) 1.2理解的关键点: 1)编译器会为包含虚函数的类加上一个成员变量,是一个指向该虚函数表的指针,虚表指针是从属于对象的,也就是说,如果一个类含有虚表,那么类的每个对象都含有虚表指针 2)虚表的

海绵宝宝的欧尼~ 的博客 9364

关于虚表与虚函数

 #include&lt;iostream&gt;using namespace std;class animal{protected:    int age;public:    virtual void print_age(void) = 0;};class dog : public animal{public:       dog() {this -&gt; age = 2;}       ...

Mike_69的博客 262
上一篇: LeetCode Two Sum时间复杂度O(n)解法尝试版本1
下一篇: 深入探索C++对象模型一书中拷贝构造函数和NRV关系探讨
早起的虫儿灬
博客等级 码龄10年 54粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值