gpt4 book ai didi

C++ 开关与成员函数指针与虚拟继承

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

我正在尝试分析实现多态性的各种方法之间的权衡。我需要一个在成员函数上有一些相似之处和一些不同之处的对象列表。我看到的选项如下:

  1. 在每个对象中都有一个标志,在每个函数中都有一个 switch 语句。标志的值将每个对象指向其特定的部分每个功能。
  2. 在对象中有一个成员函数指针数组,它们是施工时分配。然后,我调用该函数指针获取正确的成员函数。
  3. 有一个带有几个派生类的虚拟基类。一这样做的缺点是我的列表现在必须包含指针,而不是对象本身。

我的理解是,从选项 3 中的列表中查找指针将比选项 2 中的成员函数查找花费更长的时间,因为保证了成员函数的接近度。

这些选项有哪些优点/缺点?我的首要任务是性能而不是可读性。多态还有其他方法吗?

最佳答案

  1. 在每个对象中都有一个标志,在每个函数中都有一个 switch 语句。标志的值将每个对象指向每个函数的特定部分

    好的,所以如果很少有代码根据标志变化,这可能是有意义的。这最大限度地减少了必须放入缓存中的(重复)代码量,并避免了任何函数调用间接。在某些情况下,这些好处可能会超过 switch 语句的额外成本。

  2. 对象中有一个成员函数指针数组,在构造时分配。然后,我调用该函数指针以获取正确的成员函数

    您保存了一个间接(到 vtable),但也使您的对象更大,从而更少适合缓存。不可能说哪个会占主导地位,所以你只需要分析一下,但这并不是一个明显的胜利

  3. 有一个带有多个派生类的虚拟基类。这样做的一个缺点是我的列表现在必须包含指针,而不是对象本身

    如果您的代码路径足够不同,完全分开它们是合理的,那么这是最干净的解决方案。如果您需要优化它,您可以使用专门的分配器来确保它们是顺序的(即使在您的容器中不是顺序的),或者使用类似于 Boost.Any 的巧妙包装器将对象直接移动到您的容器中。您仍然会得到 vtable 间接寻址,但我更喜欢它而不是 #2,除非分析表明它确实是一个问题。

因此,在您做出决定之前,您应该回答几个问题:

  1. 有多少代码是共享的,有多少不同?
  2. 对象有多大,内联函数指针表是否会对您的缓存未命中统计数据产生重大影响?

并且,在您回答完这些问题之后,无论如何您都应该进行概要分析。

关于C++ 开关与成员函数指针与虚拟继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20740639/

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