根据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
如何真正起作用?
答案 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的。