gpt4 book ai didi

c++ - 当您只能在运行时将基类向下转换为子类时,消除 C++ 虚函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:20:38 25 4
gpt4 key购买 nike

我正在尝试在 C++ 中的一些紧密循环中删除虚拟调用...使用 CRTP 或一般的模板很容易,但显然这需要编译器在编译时知道类型。

在我的程序中,假设有一个 BitSet 的各种优化实现,并且引用该 BitSet 的代码通过对基类的引用/指针来实现。

现在我碰巧知道(因为我的对象图是由标识的类型组成的)特定 BitSet 引用是什么子类,所以我可以编写一个简单的“解码器”函数,它有一个代码路径,其中每个 BitSet 类型都被强制转换到真正的子类。

然后我可以调用该类型的非虚函数,这对于一次操作来说非常好。

我的问题是(我最后一次使用 C++ 大约是 10 年前,所以我正在 catch ),我有各种具有不同输入/输出的算法,这些算法会多次调用位集的虚函数,所以我想制作这些算法的模板版本,由实际的 BitSet 子类模板化。 (另一种方法是为每个算法复制“解码器”函数)

这需要我将算法(无论是模板函数还是类)传递给“解码器”函数,这就是我遇到麻烦的地方。当我调用解码器时,我不知道 BitSet 的类型参数是什么,编译器提示 - 如果我可以以某种方式不指定它,编译器应该拥有生成和调用所需的所有信息我在“解码器”函数中为它提供具体类型的每个地方的算法的具体实现

最佳答案

这是我要采取的步骤列表:

  • 第一件事当然是设置基准和分析器。如果不知道您的进步有多大,就无法判断某些变化是好是坏。
  • 然后,我会考虑从 bitset 类中删除所有虚拟内容,这样您就有了不同的具体实现,这些实现只是具有相同的接口(interface)但不是从基类派生的。这使得不可能在虚函数查找上浪费时间。
  • 作为替代,您可以提供各种装饰器,您可以将它们包装在具体的位集类上,使它们在运行时具有多态性。这允许您仍然使用需要多态位集类型的现有代码。
  • 最后,在基准测试和分析器的帮助下,您可以将一些仍然采用多态位集的函数转换为函数模板,这样您就可以将具体的位集类型作为参数传递。这样做可以避免这些特定函数调用的虚函数调用的运行时开销。

关于c++ - 当您只能在运行时将基类向下转换为子类时,消除 C++ 虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33333957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com