【发布时间】:2019-05-21 01:19:47
【问题描述】:
我有一个执行基于代理的模拟的 C++ 软件。在模拟中,有Populations 包含Patches,其中包含Individuals,其中包含两个Haplotypes。每个Haplotype 包含 12 个向量,每个向量用于跟踪不同类型的基因。
class Haplotype
{
std::vector<A> genesA;
std::vector<B> genesB;
std::vector<C> genesC;
std::vector<D> genesD;
....
};
然而,在实践中,用户永远不会使用超过一种或两种类型的基因。这意味着这些未使用的向量中的每一个都消耗几个字节(至少两个指针)。对于具有大量基因和少量Individuals 的模拟,可以忽略不计。然而,对于很少基因和大量个体的模拟,这些额外的字节可能开始变得重要。性能(CPU 时间和 RAM)是最重要的。
是否有一个很好的设计模式可以让我处理这个问题?可以仅按需将向量添加到Haplotype 的东西吗?
【问题讨论】:
-
std::vector<std::variant<A, B, C, D>>会满足您的需求吗? en.cppreference.com/w/cpp/utility/variant -
只要每种类型的大小相似,一个变体就可以获胜。如果不是,空向量的开销通常在两个指针和一个 size_t 左右。
-
std::variant会为向量中的 每个 元素带来一些恒定的开销。 -
我认为这个问题有点不明确。你会有多少个单倍型? A、B、C、...等的尺寸是多少?你希望用它们做什么?
std::vector<int>在我的系统上是 24 字节。如果您真的有如此多的单倍型,以至于每个单倍型的 288 字节开销是不可接受的,那么您可能会想要一些手动优化的东西,将数据访问模式考虑在内... -
@Remi.b A、B、C等有哪些类型?
标签: c++ algorithm design-patterns