确定性时的虚函数开销 (c++)

2024-05-02

我知道虚拟函数本质上是包含在 vtable 中的函数指针,这使得多态调用由于间接等原因而变慢。 但我想知道当调用是确定性时编译器的优化。 我所说的确定性是指以下情况:

  1. 该对象是一个值而不是引用,因此不可能存在多态性:
struct Foo
{
    virtual void DoSomething(){....}
};

int main()
{
    Foo myfoo;
    myfoo.DoSemthing();
    return 0;
}
  1. 参考的是无子类:
struct Foo
{
    virtual void DoSomething();
};
struct Bar : public Foo
{
   virtual void DoSomething();
};

int main()
{
    Foo* a = new Foo();
    a->DoSomething(); //Overhead ? a doesn't seem to be able to change nature.

    Foo* b = new Bar();
    b->DoSomething(); //Overhead ? It's a polymorphic call, but b's nature is deterministic.

    Bar* c = new Bar();
    c->DoSomething(); //Overhead ? It is NOT possible to have an other version of the method than Bar::DoSomething
    return 0;
}

在第一种情况下,这不会是虚拟调用。编译器将直接发出调用Foo::DoSomething().

第二种情况则更为复杂。其一,它至多是一种链接时间优化,因为对于特定的翻译单元,编译器不知道还有谁可以继承该类。您遇到的另一个问题是共享库,它也可能在您的可执行文件不知道任何情况的情况下继承。

不过,一般来说,这是一种编译器优化,称为消除虚函数调用, or 去虚拟化,并且是一个活跃的研究领域。有些编译器在某种程度上做到了这一点,而另一些编译器则根本不这样做。

请参阅,在 GCC (g++) 中,-fdevirtualize and -fdevirtualize-speculatively。这些名字暗示了质量的保证水平。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

确定性时的虚函数开销 (c++) 的相关文章

随机推荐

  • 传单:同一页上有多个地图

    我搜索过类似的问题 但没有找到适合我的情况的答案 我想使用 3 张传单地图 每张都有不同的内容 出现两个问题 仅显示第一个 比例和缩放控件仅显示在第三个中 我附上了一个 jsfiddle 以防你能帮忙 const mapbox L tile
  • C++11 左值到右值的转换?

    我认为我缺少一些关于左值到右值标准转换的基本知识 从 C 11 4 1 开始 非函数 非数组类型 T 的左值可以转换为纯右值 所以我们声明一个变量x int x 42 一种表达x在此范围内现在是左值 因此也是左值 它满足 4 1 中左值到右
  • HTTP PUT 请求通常如何发出?

    我知道 HTTP PUT 是一个幂等请求 根据定义 引用自rfc http www w3 org Protocols rfc2616 rfc2616 sec9 html The PUT method requests that the en
  • 实例标准化与批量标准化

    据我所知 批量归一化通过将激活转向单位高斯分布来帮助加快训练速度 从而解决梯度消失问题 批量归一化行为在训练 使用每个批次的平均值 var 和测试时间 使用训练阶段的最终运行平均值 var 时应用不同 另一方面 实例归一化充当本文提到的对比
  • 删除添加到购物车通知并更改 Woocommerce 中的“添加到购物车”按钮

    How to remove has been added to your cart text from shopping cart page and how to replace quantity and add to cart butto
  • PHP - 停止显示错误中的完整路径

    有什么方法可以告诉 PHP 不显示错误 警告或通知消息中存在任何错误的文件的完整路径 我知道我可以禁用错误 但是 只是为了避免任何风险 例如 我的脚本返回一个错误 显示如下 Fatal error Call to undefined fun
  • 从 ARM 模板创建 Azure Web 应用程序槽,无需复制原始 Web 应用程序配置

    我正在尝试通过 ARM 模板创建 Web 应用程序插槽 我能够创建它们 但看起来默认行为是将它们创建为当前 Web 应用程序状态的副本 这导致我的插槽继承应用程序设置 连接字符串 虚拟目录 这是演示行为的复制示例https github c
  • Eclipse、Subclipse 1.8.2、SVN 1.7.0 每次操作都要求输入密码

    我安装新的后日食靛蓝 它会要求我输入密码SVN存储库透视图 例如 浏览每个文件夹并再次询问密码 正常使用SVNKit 它要求输入密码每次会话一次 SVNKit 不支持SVN 1 7 0 yet 我该如何解决这个问题 或者这是 JavaHL
  • C#:选择属性包含子字符串的节点的 XPath?

    我可以使用XPath选择代码包含UK的国家节点吗
  • 文件上传控件仅上传PDF

    我有一个像这样的文件控件 div class form group Html LabelFor m gt m File new class col md 2 control label div class col md 10 Html Te
  • 如何使用 Android 1.5 录制音频?

    如何使用 Android 录制一些音频 package com benmccann android hello import java io File import java io IOException import android me
  • PDO 和 IS NOT NULL 函数

    我是 PDO 新手 我想知道是否有相当于 mysql 语句的语句来检查参数是否不为空 例如 SELECT FROM table WHERE param IS NOT NULL 我试过这个 pdo gt prepare SELECT FROM
  • Javascript:除了“use strict”之外,还有哪些其他“use”指令?

    Besides use strict 还有哪一个use有指令吗 指令序言 JavaScript 引擎可能使用的部分 中还有一些示例 use strict use asm 莫斯拉的asm js http asmjs org 是该语言的一个子集
  • 存储应用程序配置设置

    在 AngularJS 中存储应用程序配置设置的最佳位置是什么 这可能是应用程序常量 查找等 可以从控制器和服务或工厂使用 我可以创建一个单独的服务来存储和检索这些东西 但我想知道是否有另一个合适的地方来存储和检索这些东西 您可以使用持续的
  • 如何检测 iPhone 中按下的键盘按键?

    我想检测用户何时按下任何键盘键 仅在键入任何字符时调用的任何方法 而不是在显示键盘时调用的方法 Thanks 您可以在用户每次按键时直接处理键盘事件 Swift 对于文本字段 请使用以下委托方法 func textField textFie
  • 为什么我的 Visual Studio .obj 文件比输出的 .exe 文件大?

    作为背景 我是一个开源项目的开发人员 一个名为开放框架 http www openframeworks cc 这是不同库的包装器 例如 opengl quicktime freeImage 等 在下一个版本中 我们添加了一个名为 POCO
  • 在内核 OpenCL 中实现 FIFO 的最佳方法

    目标 在 OpenCL 中实现下图所示 OpenCl 内核所需的主要内容是将系数数组和临时数组相乘 然后最后将所有这些值累加为 1 这可能是最耗时的操作 并行性在这里非常有帮助 我正在为内核使用一个辅助函数来执行乘法和加法 我希望这个函数也
  • 限制文本框中每行的最大字符数

    假设我有以下内容
  • 如何创建“抽象字段”?

    我知道java中不存在抽象字段 我也读过这个问题 https stackoverflow com questions 2211002 why not abstract fields但提出的解决方案并不能解决我的问题 也许没有解决方案 但值得
  • 确定性时的虚函数开销 (c++)

    我知道虚拟函数本质上是包含在 vtable 中的函数指针 这使得多态调用由于间接等原因而变慢 但我想知道当调用是确定性时编译器的优化 我所说的确定性是指以下情况 该对象是一个值而不是引用 因此不可能存在多态性 struct Foo virt