1
4
当您使用模板将其自动化时,您的“糟糕的解决方案”看起来会更好。我们的目标:商店
为此,我们需要将派生类型映射到连续整数。一种简单的方法是使用一个全局计数器和一个函数模板,该模板在每次实例化时递增并存储它。
你来了!新的派生回调现在自动注册。 |
2
3
您可以将全局变量拉入在派生类型上模板化的类中,在实例化时,确保它是整个调用的一部分。
|
3
1
虚拟调用已经是一个非常简单和快速的实现,因此如果这是一个问题,没有结构变化,任何事情都不够快。值得注意的是,我不会期望一个简单的
因此,在代码级别,需要进行一些额外的内存读取,然后通过函数指针调用函数。然而,这阻碍了许多优化。在编译器级别,它不能再内联函数。在您需要的CPU级别
没有设计更改的最优化解决方案更像您展示的那样。完全去掉虚函数/间接函数,并将其存储在单独的容器中。这使得编译器可以在认为值得的情况下内联函数调用,并使CPU变得容易。您可能会使用重载或模板,所以在最坏的情况下只有一个地方可以调用(使用模板,取决于需要更聪明的东西)。
请注意,您更改了调用对象的顺序。您按类类型对它们进行了排序,但之前的顺序与
仅按类类型排序(可以使用
“配置文件引导优化”(PGO,在编译器中查找,例如MSVC和GCC可以做到这一点)也可能有帮助,需要一些额外的构建时间。它允许编译器根据实际运行的代码进行优化。我没有详细研究过为实际项目生成的代码,但我知道MSVC至少可以使用类似switch语句的命令来“内联”常见的虚拟调用
|
notamaster · 匿名命名空间中的变量声明和其他位置的定义 2 年前 |
oink · 模板类型推断是否可以考虑基元操作类型转换? 6 年前 |
Lingxi · 删除未使用新表达式构造的对象实际上可以吗? 6 年前 |
HappyCactus · 从强类型的元组生成PoD的元组 6 年前 |
Shabbar · 如何在共享类时隐藏成员函数文件 6 年前 |