Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用std::tuple实现std::get的效率_C++_C++11 - Fatal编程技术网

C++ 使用std::tuple实现std::get的效率

C++ 使用std::tuple实现std::get的效率,c++,c++11,C++,C++11,我很好奇在std::tuple上调用std::get需要多少查找时间。一些简短的谷歌搜索(包括通常包含这些信息的参考页面)没有结果 我最初的直觉(和恐惧)是元组的递归结构(如果它是作为可变模板实现的话)会导致get需要N次查找(调用get(t)看起来像t.rest().rest().first()。我希望我离这里很远 然后,我希望编译器能够对此进行优化,以直接返回正确的偏移量,而无需N次调用的开销 基本上我想要的是:运行时有一个规范的保证吗?这是否限制了 STD::tuple < /C> >?<

我很好奇在
std::tuple
上调用
std::get
需要多少查找时间。一些简短的谷歌搜索(包括通常包含这些信息的参考页面)没有结果

我最初的直觉(和恐惧)是元组的递归结构(如果它是作为可变模板实现的话)会导致get需要N次查找(调用
get(t)
看起来像
t.rest().rest().first()
。我希望我离这里很远

然后,我希望编译器能够对此进行优化,以直接返回正确的偏移量,而无需N次调用的开销


基本上我想要的是:运行时有一个规范的保证吗?这是否限制了<代码> STD::tuple < /C> >?

< p>效率可以与访问结构的成员相媲美。<代码>获取< /C> >在编译时被解决。

< P> C++并没有提供任何运行时性能的保证。即使它提出了渐近要求,也只能保证运算的相对数量,而不能保证运算的性能。O(1)并不意味着快,O(n)也不意味着慢


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

第一个问题的答案(std::get需要多长时间)取决于库如何选择实现
std::tuple
std::get
。但通常,库会选择使用非递归方法,类似于此处概述的方法:。使用这种方法,
std::get
的访问时间将保持不变,大致相当于访问所需的时间结构的成员


关于标准是否提供任何保证的回答:正如其他人所说,不,标准在这里没有保证。一个邪恶的库作者可以选择使
std::get
在N中呈指数形式,但它们仍然符合标准。

你能告诉我规范吗?你能详细解释一下吗?是什么促成了这一点?内联?我不知道在标准中看到任何需要有效实现的
std::get
,我可以想象不需要(调试)的合理原因。@hvd:标准中没有任何要求“有效”实现的东西(即使是O(1)操作也可能无效实现)。如果你要花大量时间去猜测你的编译器或标准库实现,你实际上做不了多少。内联和RVO的调用比优化构建中的结构访问稍微多一些是合理的。@NicolBolas考虑到这个问题特别问“在运行时是否有一种规范保证”,如果规范不能保证这个答案的答案,那么这不是一个答案,但是对于你给出的理由,这将是另一个问题的有用答案。@ RuvVB:RVO是2000?哦,我的……这是标准的实践,当C++内存模型在1995中被写回来时(仍然是当前的)本标准的相关章节为1.9程序执行[intro.execution]。”1本国际标准中的语义描述定义了一个参数化的非确定性抽象机器。本国际标准对一致性实现的结构没有要求。特别是,它们不需要复制或模拟抽象机器的结构。相反,一致性实现要求o模拟(仅)抽象机器的可观察行为,如下所述。5“