提升元组性能

Fir*_*his 6 c++ templates boost boost-tuples

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

tuple<A, B, C> t1(A(), B(), C());
struct T { A a; B b; C c; }
T t2;
Run Code Online (Sandbox Code Playgroud)

这两个陈述应该具有相同(或可忽略不计的差异)的表现:

t1.get<2>();
t2.c;
Run Code Online (Sandbox Code Playgroud)

我查看了boost :: tuple的来源,如果我理解正确(我不确定),get<N>函数实际执行此操作:

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

这更类似于链接列表中的查找而不是直接访问,并且,据我所知,具有O(N)复杂度而不是O(1),这是从成员访问期望的.根据我过去的经验,我认为我错了; 但是我的错误是什么?如何get真正发挥作用?

ltj*_*jax 6

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

  • 我刚刚检查过 MSVC确实将链接访问权限分解为一个op(无论如何,对于一个八元组的元组).您可以使用项目属性对话框的"输出文件"部分的"程序集和源代码"属性进行检查.我认为给GCC -S选项做类似的事情. (5认同)