gpt4 book ai didi

c++ - 惰性构造 - 虚拟方法与 if-then stub setter/getter

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

我的问题的背景是我试图创建一个惰性网格结构,其中网格区域仅在需要时实例化,否则它们在查询时返回默认值。

稍微归结一下这个问题,考虑一下我的情况的以下模型:

struct Container {
std::vector<Base> data;

float get(int indexOuter, int indexInner) {
return data[indexOuter].get(indexInner);
}
}

我想 stub Base::get在某些情况下函数总是返回相同的值,而在其他情况下我想返回某个数组中的值。我想象两种可能的解决方案。

第一个解决方案是在 Base 上使用标志,即

struct Base {
std::vector<float> data;

float get(int indexInner) {
if (data.empty()) return 0;
return data[indexInner];
}
}

此解决方案将涉及销毁 data (调整为零)当对象进入“ stub 模式”,并重新创建 data当对象再次具体化时。

我能想到的第二种方案是继承,即

struct Container {
std::vector<Base*> data;

float get(int indexOuter, int indexInner) {
return data[indexOuter]->get(indexInner);
}
}
struct Base {
virtual float get(int indexInner) = 0;
}
struct Stub : public Base {
float get(int indexInner) {
return 0;
}
}
struct Concrete : public Base {
std::vector<float> data;

float get(int indexInner) {
return data[indexInner];
}
}

然后替换 Concrete 的实例与 Stub 的实例,反之亦然,在 Containerdata必要时排列(注意确保彻底销毁)。

问题之一是性能。 Container::get每秒将被调用 1000 次,甚至更多。然而,Base进入/退出“ stub 模式”的频率将大大降低。

对于上面提出的两个解决方案,第一个解决方案涉及一个额外的 if-then 子句,而第二个解决方案涉及一个来自 Base 的间接寻址。指向对象的指针,加上从抽象方法到派生实现的间接寻址。

这些解决方案中的哪一个可以提供最佳性能?还有其他我没有考虑过的性能更高的解决方案吗?

最佳答案

大多数现代处理器不喜欢条件代码,特别是如果它不是“可预测的”(换句话说,您的数据有时会被填充,有时不会。

通过指向函数的指针跳转通常比条件分支更快(考虑到您还需要检查它是否被 stub [尽管您可以使用 data.empty() 这对于编译器来说很容易检查])。

因此,如果不对这两个解决方案进行基准测试,我的猜测是虚拟 StubConcrete会更快。但是,这在一定程度上取决于用例。

Stub实现也将占用较少的数据。另一方面,如果这是在 std::vector<Base*> data; 中使用指针的唯一原因, 那么您可能要考虑使用 isStubbed (或 data.empty() )并使用 std::vector<Base>相反 - 总体上节省了一定程度的间接寻址 - 这可能会更好,具体取决于具体情况。

最终,如果它对性能很重要,您将希望同时实现这两者,使用不同的负载模式运行基准测试,并测量时间。还要查看每次运行的分析数据,以了解代码将时间花在哪里。

关于c++ - 惰性构造 - 虚拟方法与 if-then stub setter/getter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34700060/

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