6

根据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真正如何运作?

4

2 回答 2

6

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

于 2010-11-29T08:35:34.037 回答
3

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

如果您想在不深入挖掘的情况下了解一些关于编译器内部的知识,请查看 LLVM getelementptr http://llvm.org/docs/LangRef.html#i_getelementptr 这正是像 CLANG 这样的 C++ 编译器在何时以 LLVM 为目标的方式编译结构引用。

于 2011-07-15T18:50:38.163 回答