返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++虚函数表存储位置在哪
  • 452
分享到

C++虚函数表存储位置在哪

2023-07-05 20:07:28 452人浏览 八月长安
摘要

这篇文章主要介绍“c++虚函数表存储位置在哪”,在日常操作中,相信很多人在C++虚函数表存储位置在哪问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++虚函数表存储位置在哪”的疑惑有所帮助!接下来,请跟着小编

这篇文章主要介绍“c++虚函数表存储位置在哪”,在日常操作中,相信很多人在C++虚函数表存储位置在哪问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++虚函数表存储位置在哪”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

前言

先说结论:虚函数表存储在只读数据段.rodata)、虚函数存储在代码段(.text)、虚表指针的存储的位置与对象存储的位置相同,可能在栈、也可能在堆或数据段等。

反汇编

环境:GCc version 11.3.0 (ubuntu 11.3.0-1ubuntu1~22.04)

验证代码:

#include <iOStream>using namespace std;class Q {public:    virtual void Test() {        cout << "Test" << endl;    }};class Qgw : public Q {public:    virtual void Test() {        cout << "Test Position" << endl;    }};int main() {    Q* q = new Qgw;    q->Test();    return 0;}

并不采用打印地址的方式,因为打印出的地址与反汇编得到的地址不同,无法直接得出结果。

首先编译代码:g++ -o test test.cc -O0 -m32,以 32 位方式编译。

然后将符号表输出到文件:objdump -tC test > test.txt

打开 test.txt 可以找到以下内容:

000012fc  w    F .text            00000044      Qgw::Test()
0000201c  w    O .rodata        00000005      typeinfo name for Qgw
00003ea8  w    O .data.rel.ro    0000000c      typeinfo for Qgw
00003e90  w    O .data.rel.ro    0000000c      vtable for Qgw

第一行比较清晰,说明 Qgw::Test() 存储在 .text 段,也就说明虚函数和普通函数一样,都存储在代码段。

下面几行又是什么东西呢?

根据《深度探索 C++ 对象模型》的 C++ 对象模型可知,typeinfo 是存储在虚函数表中,用来获取对象类型信息的。最下面的 .data.rel.ro 是只读数据段的重定位段,在链接时重定位。由此,可以推出虚函数表是存储在只读数据段的。

C++虚函数表存储位置在哪

相近地址

也可以采用打印地址的方式,与已知的一些段地址比较,看虚函数表地址和哪个段地址更接近。

环境:gcc version 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04)

验证代码:

#include <iostream>using namespace std;class Qgw {public:    virtual void Test() {        cout << "Test Position" << endl;    }};void Func() {    cout << "func" << endl;}int n = 10;int main() {    Qgw* q = new Qgw;    q->Test();    const char* arr = "qgw";    cout << "text:     " << (void*)Func << endl;    cout << ".rodata:  " << (void*)arr << endl;    cout << "虚函数表: "  << *(void**)q << endl;    cout << ".data:    " << &n << endl;    return 0;}

函数的地址在上文已经验证了,全局变量和常量字符串的位置,《深入理解计算机系统(第三版)》中说明如下:

.rodata:只读数据 比如 printf 语句中的格式串(%d\n.data已初始化的全局和静态 C 变量

它们的布局如下图:

C++虚函数表存储位置在哪

编译运行上述代码,得到以下结果:

C++虚函数表存储位置在哪

可以看到虚函数表的位置在数据段和只读数据段位置之间,我们是无法手动修改虚函数表的,因此存储在只读数据段是比较合理的。

到此,关于“C++虚函数表存储位置在哪”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: C++虚函数表存储位置在哪

本文链接: https://lsjlt.com/news/355120.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++虚函数表存储位置在哪
    这篇文章主要介绍“C++虚函数表存储位置在哪”,在日常操作中,相信很多人在C++虚函数表存储位置在哪问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++虚函数表存储位置在哪”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-05
  • 详解C++虚函数表存储位置
    目录前言反汇编相近地址前言 先说结论:虚函数表存储在只读数据段(.rodata)、虚函数存储在代码段(.text)、虚表指针的存储的位置与对象存储的位置相同,可能在栈、也可能在堆或数...
    99+
    2023-05-14
    C++虚函数表存储位置 C++虚函数表存储 C++虚函数表
  • rabbitmq数据存储的位置在哪
    RabbitMQ的数据存储位置取决于您的操作系统和安装方式。一般情况下,RabbitMQ的数据存储在以下位置: Windows: ...
    99+
    2023-10-23
    rabbitmq
  • hive表数据存储在哪里
    Hive表数据存储在Hadoop分布式文件系统(HDFS)上。当在Hive中创建一个表时,实际上是在HDFS上创建了一个文件夹来存储...
    99+
    2024-05-06
    hive
  • MySQL的binlog日志存储在哪个位置?
    MySQL的binlog日志文件默认存储在MySQL服务器的数据目录下,具体位置和命名规则取决于MySQL服务器的配置。 在Linux操作系统中,通常默认的MySQL数据目录为/var/lib/mysql,而binlog日志文件名的命名规则...
    99+
    2023-09-01
    mysql 数据库 服务器 linux
  • C++ 虚函数及虚函数表详解
    多态”的关键在于通过基类指针或引用调用一个虚函数时,编译时不确定到底调用的是基类还是派生类的函数,运行时才确定。 #include <iostream> using ...
    99+
    2024-04-02
  • c++虚函数与虚函数表原理
    目录1.什么是虚函数2.虚函数会影响类的内存3.了解虚函数表--->通过虚函数表的指针去访问数据4.虚函数声明1.什么是虚函数 用virtual 修饰的成员函数叫虚函数 小知识...
    99+
    2024-04-02
  • 亚马逊存储服务器在哪个位置啊
    亚马逊存储服务器分布在全球各地的数据中心,包括美国、欧洲、亚洲和南美洲等地区。这些数据中心被称为亚马逊 Web 服务(AWS)区域,每个区域都由多个可用区域组成,每个可用区域都是一个独立的数据中心。AWS 的全球基础设施可以帮助客户在全球范...
    99+
    2023-10-27
    亚马逊 位置 服务器
  • mysql数据存放的位置在哪
    MySQL数据库存放位置: MySQL如果使用MyISAM存储引擎,数据库文件类型就包括.frm、.MYD、.MYI,默认存放位置是 C:\Documentsand Settings\AllUsers\Applic...
    99+
    2022-05-13
    mysql 数据存放
  • win11虚拟机位置在哪
    本文小编为大家详细介绍“win11虚拟机位置在哪”,内容详细,步骤清晰,细节处理妥当,希望这篇“win11虚拟机位置在哪”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、虚拟机平台 如果我们是要开启虚拟机平台功能...
    99+
    2023-07-02
  • 怎么实现C++虚函数表中的虚函数
    这篇文章主要介绍“怎么实现C++虚函数表中的虚函数”,在日常操作中,相信很多人在怎么实现C++虚函数表中的虚函数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么实现C++虚函数表中的虚函数”的疑惑有所帮助!...
    99+
    2023-06-17
  • Redis 数据存储位置 导出数据
    redis是一款支持多种数据类型的Key-Value数据库。 这里介绍下如何从Redis中导出数据。 数据是如何存储的?、 Redis中是把数据保存到内存中的,但是它也会定期的把数据写会到硬盘中。 Redis保存数据有两种方式: ...
    99+
    2019-09-09
    Redis 数据存储位置 导出数据
  • C++ 函数指针在虚拟方法和虚表中的应用有哪些?
    c++++ 函数指针在虚拟方法中用于存储指向派生类重写方法实现的指针,在虚表中用于初始化虚表并存储指向虚拟方法实现的指针,从而实现运行时多态,允许派生类重写基类中的虚拟方法,并根据运行时...
    99+
    2024-04-17
    c++ 函数指针 虚方法 虚表
  • 云存储的数据存储在哪里
    云存储的数据存储在“云端”上,一般指的是存在第三方托管的多台虚拟服务器中,用户可通过互联网随着在线获取数据信息,具备可靠性强、弹性扩展、支持海量数据处理、资源利用率高等特点,当出现数据丢失时,可通过副本进行数据恢复操作,相对传统存储方式而言...
    99+
    2024-04-02
  • C++虚函数表和虚析构介绍
    目录1、虚函数表2、虚析构1、虚函数表 虚函数表是C++实现多态的基础,多态是面向对象的三大特性之一,多态有利于提高代码的可读性,便于后期代码的扩展和维护。我们都知道多态的实现是基于...
    99+
    2024-04-02
  • mongodb数据存储在哪
    mongodb 采用分片集群架构,分片存储特定范围的数据,分片规则定义数据分布方式。副本集作为冗余机制,确保数据可用性。mongodb 使用 bson 格式存储数据,数据存储在集合中,而...
    99+
    2024-04-08
    mongodb 键值对
  • C++ 虚函数表图文解析
    一、前言 一直以来,对虚函数的理解仅仅是,在父类中定义虚函数,子类中可以重写该虚函数,并且父类指针可以指向子类对象,调用子类的虚函数(多态)。在读研阶段经历的几个项目中,自己所写的类...
    99+
    2024-04-02
  • C++虚函数表深入研究
    目录探索虚函数表结构继承基类重写虚函数多基类继承 虚函数表寻找被覆盖的虚函数总结面向对象的编程语言有3大特性:封装、继承和多态。C++是面向对象的语言(与C语言主要区别),所以C++...
    99+
    2024-04-02
  • 本地存储VS云存储:区别不只是数据存放位置
      尽管云存储已经成熟,但企业IT部门仍然需要权衡本地存储和云存储的风险和好处,特别是在涉及到组织最关键的数据时。在许多企业看来,云存储是有利有弊的。  然而,数据量的爆发式增长,往往要求企业必须去使用云存储解决方案。而且,基于云的软件应用...
    99+
    2023-06-03
  • MXNet的json存放位置在哪
    MXNet中的模型存放位置可以通过`model.save()`方法指定。默认情况下,模型将被保存为`.params`文件和`.sym...
    99+
    2023-09-21
    MXNet json
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作