提升元组性能

时间:2010-11-29 08:33:44

标签: c++ templates boost boost-tuples

根据boost::tuple documentation,访问元组的单个元素与访问成员变量具有相同的性能。例如,给出以下声明:

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),这是从成员访问期望的。根据我过去的经验,我认为我错了;但是我的错误是什么? get如何真正起作用?

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

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

如果你想深入了解编译器的内部结构而不深入研究,请查看LLVM getelementptr http://llvm.org/docs/LangRef.html#i_getelementptr这正是CLANG等C ++编译器在编译结构引用时将如何定位LLVM的。