虚函数表不一定总是在对象的起始位置

news2025/1/31 11:26:34

在我之前的一篇文章 “COM 对象的内存布局”中,作为举例,我将对象的虚函数表指针放置在了底层 C++ 对象的起始位置,但是值得注意的是,虚函数表指针指向的位置并没有一个实际的标准。即使将虚函数表放置在对象中间,甚至是放在对象的结尾,都是完全合法的,只要虚函数表中的函数指针能正确的定位它需要调用的底层 C++ 对象的实际位置就可以了。
确实,在那篇文章中的第二张图里,你可以看到,我们将指针 “q” 指向了对象的中间的位置,而不是它的起始位置。

下面我举个实际的例子,演示了虚函数表放置在对象的结尾位置的情况。

>> 请移步至 topomel.com 以查看图片 <<

下图是对象可能的内存布局:

>> 请移步至 topomel.com 以查看图片 <<

在上面的特殊的代码示例中,我们可以看到,对象的虚函数表放置在了对象的结尾,而不是起始位置。这完全是一个合法的情况。
尽管通常我们会认为虚函数表应该放在对象的起始位置,COM 不要求以这种方式实现。

如果你想把你的虚函数表放在最后,并使用负的偏移量来访问对象的成员,那么也是可以的,只是相关麻烦一些。

总结

虚函数是 C++ 实现动态绑定的基础,这话,我妹说错吧?

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《The vtable does not always go at the start of the object》

 

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

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

相关文章

计算机网络编程 | 并发服务器代码实现(多进程/多线程)

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

基于 Quivr 搭建个人知识库

目录 Quivr介绍 Quivr特性 Quivr演示 Demo with GPT3.5: Demo of the new version&#xff1a; Quivr实战 Quiv 使用的主要技术 Quiv 实践依赖 创建Supabase项目 部署Quiv项目 第一步&#xff1a;现在源码 第二步&#xff1a;设置环境变量 第三步&#xff1a;执行sql 第…

http1.0,http1.1,http2.0,http3.0 区别有哪些

20 世纪 60 年代&#xff0c;美国国防部高等研究计划署&#xff08;ARPA&#xff09;建立了 ARPA 网&#xff0c;这被认为是互联网的起源。70 年代&#xff0c;研究人员基于对 ARPA 网的实践和思考&#xff0c;发明出了著名的 TCP/IP 协议。该协议具有良好的分层结构和稳定的性…

Docker部署开源项目Django-CMS企业内容管理系统

Docker部署开源项目Django-CMS企业内容管理系统 一、Django-CMS介绍1.1 Django-CMS简介1.2 Django-CMS特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载django-cms-quic…

JS 之 事件Event对象详解(属性、方法、自定义事件)

一、Event对象 1、简介 ​ 事件event对象是指在浏览器中触发事件时&#xff0c;浏览器会自动创建一个event对象&#xff0c;其中存储了本次事件相关的信息&#xff0c;包括事件类型、事件目标、触发元素等等。浏览器创建完event对象之后&#xff0c;会自动将该对象作为参数传…

NLP——WordNet;Word Similarity; Word Sense Disambiguition

WordNet WordNet是一个广泛使用的英语词汇数据库和语义网络。它由普林斯顿大学认知科学实验室开发&#xff0c;旨在帮助人们理解单词之间的关系和意义。WordNet的主要目标是将英语词汇组织成一种层次结构&#xff0c;其中每个词都与其他相关词联系起来。WordNet中的单词按照它们…

[6]PCB设计实验|认识常用元器件|电阻器|18:30~19:00

目录 一、电阻器主要用途 1. 稳定和调节电路中的电流和电压 2. 作为分流、分压和负载使用 二、常见电阻器 1. 贴片电阻 2. 热敏电阻 3. 限流电阻 4. 可调电阻 5. 排阻(网络电阻) 三、几种常用电阻器的结构特点 四、电阻的参数 1. 额定功率 电阻器功率的表示 ​2…

自学黑客/网络安全工具软件大全100套

黑客工具软件大全100套 1 Nessus&#xff1a;最好的UNIX漏洞扫描工具 Nessus 是最好的免费网络漏洞扫描器&#xff0c;它可以运行于几乎所有的UNIX平台之上。它不止永久升级&#xff0c;还免费提供多达11000种插件&#xff08;但需要注册并接受EULA-acceptance–终端用户授权…

【六一儿童节】回忆一下“童年的记忆”

文章目录 [TOC](文章目录) 前言一、EasyX带我们步入了童话的世界1.1绘画哆啦A梦2.2绘画出来喜羊羊 二、我的六一故事总结 前言 我们都有过童年&#xff0c;并且从现在看来&#xff0c;童年是我们最希望可以回去的那段时光&#xff0c;那时候的我们傻傻的&#xff0c;并且很天真…

电子元器件解析02之电容(一)——定义与性能参数

下篇文章&#xff1a;电子元器件解析02之电容(二)——电容分类与应用场景&#xff1a;https://blog.csdn.net/weixin_42837669/article/details/131142767 摘要 电容是最基本的电子元器件之一&#xff0c;本文介绍了电容的定义&#xff0c;并总结了电容的各个性能参数&#xff…

leetcode143. 重排链表(java)

重排链表 leetcode143. 重排链表题目要描述 解题思路代码链表专题 leetcode143. 重排链表 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/reorder-list 题目要描述 给定一个单链表 L 的头节点 head &#xff0c;单链表 …

根据字节、华为、阿里、腾讯等大厂整理的2023最新面试热点问题,还不行我也救不了你了~

大厂面试热点问题 1、测试人员需要何时参加需求分析&#xff1f; 如果条件循序 原则上来说 是越早介入需求分析越好 因为测试人员对需求理解越深刻 对测试工作的开展越有利 可以尽早的确定测试思路 减少与开发人员的交互 减少对需求理解上的偏差 2、软件测试与调试的关系 测…

MM32F3273G8P火龙果开发板MindSDK开发教程11 -获取msa311加速器的xyz轴数据

MM32F3273G8P火龙果开发板MindSDK开发教程11 -获取msa311加速器的xyz轴数据 1、msa311简介 使用i2c总线 可以读取xyz轴的加速度 可以监测单击双击事件 可以监测运动与静止状态 可以监测自由落体事件&#xff0c;可用来监测摔倒或跌落。 可以监测旋转事件&#xff0c;类似手机…

工作中自我或者团队管理的几个有用工具

个人或者团队管理过程中&#xff0c;采用一些有效的管理工具或者方法&#xff0c;可以提升工作效率和结果。它们包括SMART原则、PDCA循环、SWOT分析、5W2H分析、鱼骨图分析、七个凡是。这几个工具或者方法之间有互通性&#xff0c;比如&#xff0c;PDCA循环中&#xff0c;在P这…

数学建模预备知识(1)全网最全的数学建模竞赛汇总,别再被坑了!

&#x1f305;*&#x1f539;** φ(゜▽゜*)♪ **&#x1f539;*&#x1f305; 欢迎来到馒头侠的博客&#xff0c;该类目主要讲数学建模的知识&#xff0c;大家一起学习&#xff0c;Qq及各类联系方式在图片上&#xff01; 喜欢的朋友可以关注下&#xff0c;下次更新不迷路&…

【MySQL】为什么MySQL选择B+Tree来做索引?

B树和B树的区别? B树 B树 B*树 B树和B树的区别 &#xff08;1&#xff09;存储量大&#xff1a;B树叶子及非叶子节点存索引数据&#xff0c;B树叶子非叶子节点存索引&#xff0c;叶子节点存数据&#xff1b; &#xff08;2&#xff09;查找速度&#xff1a; 查单个值&…

细说websocket - php篇

下面我画了一个图演示 client 和 server 之间建立 websocket 连接时握手部分&#xff0c;这个部分在 node 中可以十分轻松的完成&#xff0c;因为 node 提供的 net 模块已经对 socket 套接字做了封装处理&#xff0c;开发者使用的时候只需要考虑数据的交互而不用处理连接的建立…

运营-22.内容分发

内容分发 内容分发本质要解决的问题包含两点&#xff1a; 1. 高效的连接人与信息&#xff1b; 2. 过滤出有价值的信息&#xff0c;让合适的人看到合适的信息 。 常见的内容分发方式&#xff1a; 1. 编辑分发&#xff1b; 2. 订阅分发&#xff1b; 3. 社交分发&#xff1b; 4. 算…

Oracle中使用【Interval】对【日期】进行【相加减】,报错 ORA-01839:指定月份的日期无效(Interval的坑)

文章目录 1. 前言2. 先说结论3. 案例演示 1. 前言 最近在对某些表进行旧数据的删除&#xff0c;必然是通过【时间】删除之前较为久远的数据&#xff0c;比如1年前&#xff0c;6个月前&#xff0c;7天前的数据等等情况&#xff0c;这个时候的SQL&#xff0c;必然会出现条件&…

pandas---数据结构(Series、DataFrame 和 MultiIndex)创建方式、属性

1. 数据结构 Pandas中一共有三种数据结构&#xff0c;分别为&#xff1a;Series、DataFrame 和MultiIndex。 其中Series是一维数据结构&#xff0c;DataFrame是二维表格型数据结构&#xff0c;MultiIndex是三维数据结构。 1.1 Series Series是一个类似于一维数组的数据结构…