[英]Efficiency of std::get with std::tuple
我很好奇在std::tuple<>
上调用std::get<>
的查找时间。 一些简短的谷歌搜索(包括通常有这些信息的参考页面)没有结果。
我最初的直觉(和恐惧)是元组的递归结构(如果它被实现为可变参数模板)将导致需要N个查找的顺序(调用get<3>(t)
看起来像t.rest().rest().first()
。我希望我离开这里......
然后,我希望编译器能够优化它以直接返回正确的偏移量,而不需要N个调用的开销。
基本上我想要的是:运行时有保证吗? 这是否限制了std::tuple
的实现方式?
效率将与访问结构的成员相当。 get<>
在编译时解析。
C ++规范不保证任何函数的运行时性能。 即使它表示渐近要求,也只能保证操作的相对数量,而不是这些操作的性能。 O(1)并不意味着快,O(n)也不是慢。
您可以信任您的编译器/优化器/标准库实现,也可以自己重写它以获得您想要的任何性能。 std::get
,在大多数合理的编译器(具有优化)下,应该或多或少地等效地直接访问结构中的值。 但规范并不要求在任何时候。
第一个问题的答案( std::get
需要多长时间)取决于你的库如何选择实现std::tuple
和std::get
。 但通常情况下,库会选择使用非递归方法,类似于此处概述的方法: http : //mitchnull.blogspot.com/2012/06/c11-tuple-implementation-details-part-1.html 。 使用这种方法, std::get
的访问时间将是常量,大致相当于访问结构成员所花费的时间。
在回答标准是否提供任何保证时:正如其他人所说的那样,否则,标准在此处不作任何保证。 一个邪恶的图书馆作家可以选择在N中使std::get
指数,他们仍然是符合标准的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.