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

news/2025/6/7 15:48:30

在我之前的一篇文章 “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》

 

文章来源:https://blog.csdn.net/mmxida/article/details/131145673
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-4653043.html

相关文章

使用 Python Selenium 提取动态生成下拉选项

在进行网络数据采集和数据分析时&#xff0c;处理动态生成的下拉菜单是一个常见的挑战。Selenium是一个强大的Python库&#xff0c;可以让你自动化浏览器操作&#xff0c;比如从动态生成的下拉菜单中选择选项。这是一个常见的网页爬虫和数据收集者面临的挑战&#xff0c;但是Se…

普中自动下载软件1.86下载程序失败案例

今天在用开发板做一个功能&#xff0c;下载的时候报错了&#xff0c;说芯片超时 确定驱动安装好了的 波特率也试了一圈 线也换过了 最后发现是芯片类型选错了&#xff0c;这个开发板是用的stc89c52,所以我选了图里这个&#xff0c;但是翻了开发板配套的资料&#xff0c;发现…

LinuxC编程——高级文件操作

目录 一、查询文件信息1、stat2、stat fstat lstat区别 二、目录操作2.1 opendir2.2 readdir2.3 closedir例练习&#xff1a;实现ls操作 三、库3.1 库的定义3.2 库的分类3.2.1 静态库3.2.2 动态库 3.3 创建库3.3.1 静态库制作3.3.2 动态库制作 一、查询文件信息 1、stat int …

英语学习:M开头

machine 机器 mad 发疯的&#xff0c;生气的 madam 女士&#xff0c;夫人 madame 夫人 magazine 杂志 magic 有魔力的 maid 女仆&#xff0c;侍女 mail 邮递 mailbox 邮箱 mainland 大陆 major 较大的&#xff0c;主要的 majority 大多数 male 雄的 man 人类 man…

代码随想录第五十三天|最长公共子序列、最大子数组

代码随想录第五十三天|1143、1035、53 Leetcode 1143. 最长公共子序列Leetcode 1035. 不相交的线Leetcode 53. 最大子数组和 Leetcode 1143. 最长公共子序列 题目链接: 最长公共子序列 自己的思路:没想出来&#xff01;&#xff01;&#xff01; 正确思路:首先这道题由于是涉…

2023“水博会”召开,千寻位置携智慧水利创新方案登台亮相

6月7日&#xff0c;“2023中国水博览会暨第十八届中国&#xff08;国际&#xff09;水务高峰论坛”&#xff08;简称“水博会”&#xff09;在江苏南京开幕。千寻位置基于北斗时空能力&#xff0c;打造多款水利数字孪生解决方案&#xff0c;在本次水博会上亮相。 水利数字孪生工…

windows10或11:输入法变成繁体字? windows10或11:输入法变成繁体字解决方法

文章目录 前言具体操作总结 前言 windows10输入法变成繁体字? windows10输入法变成繁体字解决方法 具体操作 总结 解决输入法变成繁体的烦恼

CoreDX DDS应用开发指南(4)DDS实体h和主题

6 DDS实体 DDS标准定义了一个体系结构,该体系结构表示构成DDS API实体的面向对象模型。这些实体充当中间件和应用软件之间的接口。为了开发支持DDS的应用程序,开发人员必须创建、交互并销毁这些DDS实体。 本章概述了DDS实体和相关概念。 6.1 DDS实体层次结构 构成DDS API的主…

探索Python工具库合集:提高开发效率的秘密武器

前言&#x1f680;&#x1f680; 在开发过程中&#xff0c;笔者积累了许多实用的Python工具函数和模块&#xff0c;决定将它们整理成一个工具库集合&#xff0c;并与大家分享。本文将介绍笔者的Python工具库集合的核心功能和用途&#xff0c; 在日常的Python开发中&#xff0c;…

spring 动态代理

感觉不错 三连支持 一起进步&#xff01; 动态代理 文章目录 一、基于接口的动态代理二、基于子类的动态代理三、示例1.改造前service2.使用动态代理重构带有事务的service示例 动态代理&#xff1a; ● 特点&#xff1a;字节码随用随创建&#xff0c;随用随加载 ● 作用&…