根据 Boost ::元组文档, ,访问元组的单个元素的性能与访问成员变量的性能相同。例如,给定以下声明:

tuple<A, B, C> t1(A(), B(), C());
struct T { A a; B b; C c; }
T t2;

这两个陈述应具有相等的(或差异可忽略的)绩效:

t1.get<2>();
t2.c;

我研究了boost :: tuple的来源,如果我正确理解了它们(我不确定我做到了), get<N> 功能实际上执行此操作:

C get<2>(tuple<A, B, C>& t)
{
    return t.tail.tail.head;
    //Generally:  return t.tail. <<N times>> .head;
}

这与链接列表中的查找更相似,而不是直接访问,就我而言,它具有O(n)的复杂性,而不是O(1),这是会员访问所期望的。从我过去的Boost经验中,我认为我错误地弄错了。但是我的错误是什么?如何 get 真的工作吗?

有帮助吗?

解决方案

您对列表般的性能是正确的。但是,它可以在编译时解决,因此在运行时归结为O(1)。 (给定足够好的优化编译器。)

其他提示

请记住,在C ++中,点运算符不是指针尊重,而是直接偏移计算。一般的答案是肯定的,i1.i2.i3.in对于所有n都是可以在编译时间计算的恒定时间操作。

如果您想在不深入挖掘的情况下学习一些有关此内容的编译器内部设备 http://llvm.org/docs/langref.html#i_getelementptr 这正是像Clang这样的C ++编译器在编译结构参考时会靶向LLVM。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top