std :: get与std :: tuple的效率

时间:2013-04-23 12:53:50

标签: c++ c++11

我很好奇std::get<>std::tuple<>的调用所需的查询时间。一些简短的谷歌搜索(包括通常有这些信息的参考页面)没有结果。

我最初的直觉(和恐惧)是元组的递归结构(如果它被实现为可变参数模板)将导致需要N次查找的顺序(对get<3>(t)的调用看起来像{{ 1}}。我希望我离开这里......

然后,我希望编译器能够优化它以直接返回正确的偏移,而不会产生N个调用的开销。

基本上我想要的是:运行时有保证吗?这会限制t.rest().rest().first()的实施方式吗?

3 个答案:

答案 0 :(得分:20)

效率与访问结构的成员相当。 get<>在编译时解析。

答案 1 :(得分:15)

C ++规范不保证任何函数的运行时性能。即使它表示渐近要求,也只能保证操作的相对数量,而不是这些操作的性能。 O(1)并不意味着快,O(n)也不是慢。

您可以信任您的编译器/优化器/标准库实现,也可以自己重写它以获得您想要的任何性能。 std::get,在大多数合理的编译器(具有优化)下,应该或多或少地等效地直接访问结构中的值。但规范在任何时候都不需要。

答案 2 :(得分:3)

第一个问题的答案(std::get需要多长时间)取决于您的图书馆选择如何实施std::tuplestd::get。但通常情况下,库会选择使用非递归方法,类似于此处概述的方法:http://mitchnull.blogspot.com/2012/06/c11-tuple-implementation-details-part-1.html。使用这种方法,std::get的访问时间将保持不变,大致相当于访问结构成员所需的时间。

在回答标准是否提供任何保证时:正如其他人所说,不,标准在此处不作任何保证。一个邪恶的图书馆作家可以选择在N中使std::get指数,并且它们仍然是符合标准的。