繁体   English   中英

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

[英]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::tuplestd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM