C++程序运行时内存布局之--无继承情况下的虚函数

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

虚函数是C++实现多态的关键,没有虚函数,C++只能是OB,不能完成OO。

本文介绍的是没有继承情况下,带有虚函数的类在内存中布局,以及其实例(对象)内存布局。

 

1.源码

view plain
  1. #include <iostream>  
  2. #include <stdio.h>  
  3.   
  4. using namespace std;  
  5.   
  6. class CVirtual  
  7. {  
  8. public:  
  9.     int x;  
  10. public:  
  11.     virtual void VF()  
  12.     {  
  13.         cout<<this->x<<endl;  
  14.         cout<<"hello"<<endl;  
  15.     }  
  16. public:  
  17.     CVirtual(int x)  
  18.     {  
  19.         this->x = x;  
  20.     }  
  21. };  
  22.   
  23. typedef void (CVirtual::*Fun)();  
  24. union  
  25. {  
  26.     Fun f;  
  27.     unsigned int addr;  
  28. }ut;  
  29.   
  30. int main(int argc, char** argv)  
  31. {  
  32.     //打印出类实例的大小  
  33.     cout<<"对象大小为                       :"<<sizeof(CVirtual)<<endl;  
  34.   
  35.     CVirtual *p = new CVirtual(999);  
  36.     CVirtual *p1 = new CVirtual(888);  
  37.   
  38.     //打印对象地址  
  39.     cout<<"新建对象的地址                   :"<<p<<endl;  
  40.   
  41.     //打印第一个成员变量地址  
  42.     cout<<"对象中第一个成员变量的地址       :"<<&p->x<<endl;  
  43.   
  44.     //打印虚函数的地址  
  45.     ut.f = &(CVirtual::VF);  
  46.     cout<<"类中第一个虚函数的地址           :"<<std::hex<<std::showbase<<ut.addr<<endl;  
  47.   
  48.     //虚表指针  
  49.     unsigned int vptr = *((unsigned int*)p);  
  50.     cout<<"对象1中虚表指针(即虚表地址)为    :"<<std::hex<<std::showbase<<vptr<<endl;  
  51.   
  52.     //虚表第一项值为  
  53.     unsigned slot0 = *((unsigned int*)vptr);  
  54.     cout<<"虚表中第一项的值(第一个虚函数地址):"<<std::hex<<std::showbase<<slot0<<endl;  
  55.   
  56.   
  57.     //虚表指针  
  58.     unsigned int vptr1 = *((unsigned int*)p1);  
  59.     cout<<"对象2中虚表指针(即虚表地址)为    :"<<std::hex<<std::showbase<<vptr1<<endl;  
  60.   
  61.     //虚表第一项值为  
  62.     unsigned slot01 = *((unsigned int*)vptr1);  
  63.     cout<<"虚表中第一项的值(第一个虚函数地址):"<<std::hex<<std::showbase<<slot01<<endl;  
  64.   
  65.   
  66.     //虚函数的原型  
  67.     typedef void (__thiscall *MyFun)(void* pThis);  
  68.   
  69.     //调用虚函数表中的第一个函数  
  70.     MyFun f = (MyFun)slot0;  
  71.     f(p);  
  72.   
  73.     //调用虚函数  
  74.     MyFun f1 = (MyFun)ut.addr;  
  75.     f1(p);  
  76.   
  77.     delete p;  
  78.     delete p1;   
  79.     cin>>argc;  
  80. }  

 

2.结果

 

3.内存布局图

4.结论

  • 虚函数表在编译期间已经确定,建立在data区,运行期只是把由构造函数把对象的vptr值设定为这个地址,同一个类的所有实例共享同一个虚函数表;
  • 虚函数表中的每一个项目不一定是虚函数的地址,很可能是一个代理函数,然后由代理函数再调用虚函数;

转载于:https://my.oschina.net/kaixindewo/blog/28519

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

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

相关文章

纠结学哪种编程语言?请看这个回答

各位童鞋&#xff0c;如果最近/未来几年有人还纠结学习哪种编程语言&#xff0c;那你可以请他/她参考一下这个 Quora 帖子的最高赞回答&#xff1a;> 能找一份工作&#xff1a;Java> 能找一份高薪工作&#xff1a;C> 啥样工作都能找到&#xff1a;Python> 总能找到…

NET问答: 有最干净利落的读写文件方式吗?

咨询区 ApprenticeHacker&#xff1a;在 C# 中有很多种读写文件的方式 (文本文件&#xff0c;非二进制)。为了践行 do more, write less 的思想&#xff0c;现寻找一种最简单最少代码量的方式&#xff0c;因为在我的项目中有太多的功能需要读写文件了。回答区 vc 74&#xff1a…

写好一份数据分析报告的13个要点

先说说写一份好的数据分析报告的重要性&#xff0c;很简单&#xff0c;因为分析报告的输出是你整个分析过程的成果&#xff0c;是评定一个产品、一个运营事件的定性结论&#xff0c;很可能是产品决策的参考依据&#xff0c;既然这么重要那当然要写好它了。我认为一份好的分析报…

oracle11g安装和基本的使用,手把手看图教你用起来。

前面技术架构和系统选型说到了使用oracle&#xff0c;看到园友们一些评论。我也不想卖弄&#xff0c;不想争论什么数据库好。喜欢就是理由&#xff0c;用了多年了为何不可。 我可以想象&#xff0c;大家没有使用oracle的原因可能有以下几点&#xff1a; 被oracle价格吓破胆的有…

java高并发类_Java 高并发之魂

前置知识了解Java基本语法了解多线程基本知识知识介绍Synchronized简介&#xff1a;作用、地位、不控制并发的后果两种用法&#xff1a;对象锁和类锁多线程访问同步方法的7种情况&#xff1a;是否是static、Synchronized方法等Synchronized的性质&#xff1a;可重入、不可中断原…

.NET 开源配置组件 AgileConfig 初体验

介绍在微服务大行其道的今天&#xff0c;系统会被拆分成多个模块&#xff0c;作为单独的服务运行&#xff0c;同时为了集中化管理&#xff0c;我们还需要日志中心&#xff0c;配置中心等&#xff0c;很多开发人员可能更熟悉 ApolloConfig&#xff0c;这个组件功能也很完善&…

来领资料咯!计算机专业教科书礼包

现在计算机行业越来越火爆&#xff0c;技术的更新也越来越快&#xff0c;不好好充实自己的话&#xff0c;就会被淘汰。小编这几年一直有意识地收集计算机行业相关的书籍&#xff0c;现在已经拥有5G左右的资料&#xff0c;如C、Java、Python、机器学习、网页开发Web Dev、数据分…

Asp.Net Core 5 REST API - Step by Step(一)

翻译自 Mohamad Lawand 2021年1月19日的文章 《Asp.Net Core 5 Rest API Step by Step》 [1]在本文中&#xff0c;我们将创建一个简单的 Asp.Net Core REST API Todo 应用程序&#xff0c;在其中我们可以添加、编辑、删除和查看待办事项&#xff0c;并且将使用 SQLite 来存储数…

身为程序员碰到最奇葩的需求是怎样的?

梁大折腾部门老大&#xff1a;你&#xff0c;做个微信小游戏吧我&#xff1a;啥样的&#xff1f;老大&#xff1a;反正你就做个小游戏吧&#xff0c;这个火我&#xff1a;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;柔情领导:那个运维啊&#xff0c;你来把他…

15个未来高科技产品会让你无法想象!这些开脑洞的设计太牛了!

导读&#xff1a;从衣食住行到生活的方方面面&#xff0c;未来必将会有天翻地覆的变化。大数据、云计算、物联网和人工智能这些年的发展&#xff0c;让我们对并不遥远的未来有了更多想象和期待。那些我们现阶段不可企及的所思所想&#xff0c;将在未来成为大部分人的日常。这么…

解决 .NET Core 在 Linux Container 中获取 CurrentCulture 不正确的问题

背景在将公司一款基于 .NET Framework 的控制台程序迁移到 .NET Core 3.1 时&#xff0c;发现程序中本地化的部分失效&#xff0c;症状类似于对 Thread.CurrentThread.CurrentCulture.Name 的值进行 Substring() 操作时抛出 ArgumentOutOfRangeException 异常。该程序在 Window…

机器学习资料升级版来了!!!

机器学习一直是一个热门的领域。上次分享的机器学习资料【资源】机器学习资料包来袭受到大家的广泛好评&#xff0c;今天小编打算分享一份机器学习升级版的资料&#xff0c;有斯坦福大学-深度学习基础教程、机器学习实战、人工智能与大数据、Tagging等。顺序最下优化算法Error …

K-Means算法的10个有趣用例

K-means算法具有悠久的历史&#xff0c;并且也是最常用的聚类算法之一。K-means算法实施起来非常简单&#xff0c;因此&#xff0c;它非常适用于机器学习新手爱好者。首先我们来回顾K-Means算法的起源&#xff0c;然后介绍其较为典型的应用场景。起源1967年&#xff0c;James M…

C# $的用法

今天闲来无事&#xff0c;就随便在网上乱看&#xff0c;突然想到Jquery的$符号很强大&#xff0c;那么C#有没有这个东西呢&#xff0c;一查&#xff0c;果然有。经查证发现&#xff0c;这个是在C#6.0出现的一个新特性&#xff0c;也就是一个小语法糖&#xff0c;其作用相当于对…

想转行人工智能?机会来了!!!

一个坏消息&#xff1a;2018年1月 教育部印发的《普通高中课程方案和语文等学科课程标准》新加入了数据结构、人工智能、开源硬件设计等 AI 相关的课程。这意味着职场新人和准备找工作的同学们&#xff0c;为了在今后十年内不被淘汰&#xff0c;你们要补课了&#xff0c;从初中…

tankwar java_TankWar 单机(JAVA版) 版本0.3 画出坦克

其实就是通过自定义的panel 重写里面的paint方法 使用Graphics类画一个圆然后把自定的panel添加到窗口中由于想到tank不能只画一个 所以我们封装一个tank类 里面有一个draw方法 用来画 坦克通过实例化tank 调用draw方法就能实现画tank了具体代码如下&#xff1a;Tank类pac…

轻量NuGet服务—BaGet

相信大家都受益过nuget.org&#xff0c;上面的海量的库、工具、模板为我们开发提供了极大的帮助&#xff0c;其中有很多都是非常宽松的开源协议&#xff0c;在此感谢那无私奉献的人。有的时候&#xff0c;在企业内部&#xff0c;有些库是私有的&#xff0c;专项的&#xff0c;要…

使用 Github Actions artifact 在 workflow job 之间共享数据

AgileConfig 在使用 react 编写UI后&#xff0c;变成了一个彻彻底底的前后端分离的项目&#xff0c;上一次解决了把react spa 跟asp.net core 站点集成起来ASP.NET Core 集成 React SPA 应用。本来我每次提交代码的时候都需要手动运行npm run build,然后把dist的内容复制到asp…

撤回的微信消息真的看不到?78行Python代码帮你看穿一切!

导读&#xff1a;Python曾经对我说&#xff1a;"时日不多&#xff0c;赶紧用Python"。于是看到了一个基于python的微信开源库&#xff1a;itchat&#xff0c;玩了一天&#xff0c;做了一个程序&#xff0c;把私聊撤回的信息可以收集起来并发送到个人微信的文件传输助…

lmbs PHP,PHP 清空 MySql 指定数据表中的所有数据

PHP 清空 MySql 指定数据表中的所有数据PHP 清空 MySql 指定数据表中的所有数据&#xff0c;在烈火小编在网上闲逛时&#xff0c;这是某技术博客的一篇文章&#xff0c;说是文章&#xff0c;并没有文字&#xff0c;只有代码&#xff0c;经过测试可以使用&#xff0c;现在分享给…