- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
比较 C++ 中的虚函数和 C 中的虚表,编译器在一般情况下(以及对于足够大的项目)在去虚拟化方面是否同样出色?
天真地,C++ 中的虚函数似乎具有更多的语义,因此可能更容易去虚拟化。
更新: Mooing Duck 提到了内联去虚拟化函数。快速检查显示虚拟表错过的优化:
struct vtab {
int (*f)();
};
struct obj {
struct vtab *vtab;
int data;
};
int f()
{
return 5;
}
int main()
{
struct vtab vtab = {f};
struct obj obj = {&vtab, 10};
printf("%d\n", obj.vtab->f());
}
我的 GCC 不会内联 f,尽管它是直接调用的,即去虚拟化的。 C++ 中的等价物,
class A
{
public:
virtual int f() = 0;
};
class B
{
public:
int f() {return 5;}
};
int main()
{
B b;
printf("%d\n", b.f());
}
甚至内联 f。因此,C 和 C++ 之间存在第一个区别,尽管我认为 C++ 版本中添加的语义与这种情况无关。
更新2:为了在C中去虚拟化,编译器必须证明虚表中的函数指针具有一定的值。为了在 C++ 中去虚拟化,编译器必须证明对象是特定类的实例。在第一种情况下,证明似乎更难。然而,虚拟表通常只在很少的地方被修改,最重要的是:仅仅因为它看起来更难,并不意味着编译器在它上面没有那么好(否则你可能会争辩说 xoring 通常比添加两个更快整数)。
最佳答案
不同的是,在C++中,编译器可以保证虚拟表地址永远不会改变。在 C 中,它只是另一个指针,你可以对它造成任何破坏。
However, virtual tables are typically modified in only very few places
编译器在 C 中不知道。在 C++ 中,它可以假设它永远不会改变。
关于c++ - LTO、去虚拟化和虚拟表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7046739/
我在使用自定义 ListView 时遇到了一些问题(滚动 ListView 时内部的复选框丢失了它们的状态)。我可以在不枚举可视化树的情况下禁用 ListView 虚拟化吗?
我有一个 ItemsControl包含我想虚拟化的数据列表,但是 VirtualizingStackPanel.IsVirtualizing="True"似乎不适用于 ItemsControl . 真
有没有人有我可以在 WPF 应用程序中使用的功能虚拟化 WrapPanel? 我已经在 http://virtualwrappanel.codeplex.com/ 下载并尝试了实现.但是,我收到以下异
我试图弄清楚这个虚拟化功能,我不确定我是否理解错误或发生了什么,但我正在使用 ANTS 内存分析器来检查虚拟化 TreeView 中的项目数,它只是不断增加。我有一个包含 1,001 个项目(1 个根
我对虚拟机的 CPU 虚拟化有疑问。我无法理解即时到 native 代码翻译与陷阱和模拟翻译之间的区别。 据我所知,在第一种情况下,假设我从不同的平台模拟二进制代码,如果我有 x86 CPU,代码将转
我们正在尝试想出一种虚拟化 TreeView 的好方法,数据并不是真正的问题,因为它非常轻(每个项目大约 16 字节),问题是我们可能有数万个,虽然实际数据只占用 160 kb 内存,但 TreeVi
我对虚拟机的 CPU 虚拟化有疑问。我无法理解即时到 native 代码翻译与陷阱和模拟翻译之间的区别。 据我所知,在第一种情况下,假设我从不同的平台模拟二进制代码,如果我有 x86 CPU,代码将转
WPF 4 是否还包含一个虚拟化的 WrapPanel,或者从现有面板派生一个是否容易。我想制作一个地址 View ,例如 outlook。 最佳答案 我认为不可能实现具有完全虚拟化(双向)的 Wra
我有一个 VB6 应用程序,我已经销售了 12 年多。有时我的用户很难让应用程序运行。数据写入将进入/My Documents,因此除了安装文件(EXE 等)之外什么都没有进入 C:\Program
我试图将一个新环境的要求放在一起,以包含运行 Sql Server 的 TeamCity、几个构建代理(目前)和一个 SVN 存储库。 目前有 6 个开发人员,将有 5 个活跃的解决方案参与 CI 过
关注 this question和 this question ,现在我有一个带有分层数据的 TreeView,如下图所示: 由于数据量大,我转了Virtualization TreeView 的属性
是否有一种简单的方法可以禁用 ListBox 控件上的 UI 虚拟化?我尝试使用“FindName()”方法在 ListBox 控件中查找控件,但如果该控件明显位于 Web 浏览器窗口之外,则无法找到
我正在尝试将 ListBox 用作包含多个项目的 View ,当然,我需要在其中使用 UI 虚拟化。 问题是只有当我这样声明 ListBox 时虚拟化才有效:
我有一个基于 .NET 4.0 的 Winform 应用程序,我使用 Spoon Virtual Application Studio 2012 对其进行了虚拟化。 当我使用 VS 2010 构建应用
我正在尝试将 ListBox 用作包含多个项目的 View ,当然,我需要在其中使用 UI 虚拟化。 问题是只有当我这样声明 ListBox 时虚拟化才有效:
我正在使用“react-virtualized”中的表。一切都很顺利。 我使用 rowRenderer 自定义了我的行,以添加“react-dnd”并让我的行能够被拖动。 我的问题是关于细胞的。可以定
我正在尝试弄清楚是否可以创建一个 SQL 函数,将参数行视为“鸭子类型”。也就是说,我希望能够传递来自具有某些公共(public)列名的不同表或 View 的行,并在函数内对这些列进行操作。 这里有一
我正在构建一个程序,该程序在主程序文件之外具有多个外部库和扩展。我的项目总大小为 134.2 MB。我想用 Turbo Studio 制作它的便携版本,但我面临一个明显的问题;在捕获文件并构建项目后,
这是我试图通过 WPF 实现的目标。 wrappanel 中作为标题和下方按钮的文本 block 。问题是这需要滚动等。我已经使用 ItemsControl 和每个组的绑定(bind)实现了这一点。我
今天我决定最终尝试虚拟化 TreeView。要做到这一点,绑定(bind)是必需的。所以我决定测试两件事——基于类型的 HierarchicalDataTemplate + 虚拟化。 我为一些数据创建
我是一名优秀的程序员,十分优秀!