14

I'm curious as to the lookup time that a call to std::get<> on a std::tuple<> takes. Some brief googling (including the reference pages which usually have this information) turned up no results.

My initial intuition (and fear) is that the recursive structure of tuple (if it is implemented as a variadic template) would lead to get requiring an order of N lookups (A call to get<3>(t) looking like t.rest().rest().first(). I'm hoping I'm way off here...

Then again, I would hope the compiler would be able to optimize this to directly return the correct offset without the overhead of N of calls.

Basically what I want: is there a specced guarantee on runtime? does this restrict how std::tuple is implemented?

4

3 回答 3

21

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

于 2013-04-23T12:55:12.113 回答
15

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

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

于 2013-04-23T14:00:49.767 回答
3

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

回答标准是否提供任何保证:正如其他人所说,不,标准在这里不做任何保证。一个邪恶的库作者可以选择std::get在 N 中创建指数,并且它们仍然符合标准。

于 2013-04-23T18:40:15.520 回答