根据boost::tuple 文档,访问元组的单个元素与访问成员变量具有相同的性能。例如,给定以下声明:
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
真正如何运作?