Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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
为什么std::future<;T>;和std::共享的未来<;T>;不提供成员交换()? > C++标准库中的所有类都有成员交换函数,包括一些多态类,如代码> STD::BasICIOS。模板类std::shared_future显然是一种值类型,std::future是一种仅移动的值类型。有没有什么特别的原因,它们不提供swap()成员函数?_C++_C++11_Future_Swap - Fatal编程技术网

为什么std::future<;T>;和std::共享的未来<;T>;不提供成员交换()? > C++标准库中的所有类都有成员交换函数,包括一些多态类,如代码> STD::BasICIOS。模板类std::shared_future显然是一种值类型,std::future是一种仅移动的值类型。有没有什么特别的原因,它们不提供swap()成员函数?

为什么std::future<;T>;和std::共享的未来<;T>;不提供成员交换()? > C++标准库中的所有类都有成员交换函数,包括一些多态类,如代码> STD::BasICIOS。模板类std::shared_future显然是一种值类型,std::future是一种仅移动的值类型。有没有什么特别的原因,它们不提供swap()成员函数?,c++,c++11,future,swap,C++,C++11,Future,Swap,在C++11中支持std::move之前,成员交换是一个巨大的性能提升。例如,这是一种将一个向量移动到另一个点的方式。它也用于调整向量大小,这意味着插入向量向量并不是完全的性能自杀 在std::move进入C++11之后,使用许多有时为空的类型,std::swap的默认实现: template<class T> void swap( T& lhs, T& rhs ) { auto tmp = std::move(rhs); rhs = std::move(lh

在C++11中支持
std::move
之前,成员交换是一个巨大的性能提升。例如,这是一种将一个向量移动到另一个点的方式。它也用于调整向量大小,这意味着插入向量向量并不是完全的性能自杀

std::move
进入C++11之后,使用许多有时为空的类型,
std::swap
的默认实现:

template<class T>
void swap( T& lhs, T& rhs ) {
  auto tmp = std::move(rhs);
  rhs = std::move(lhs);
  lhs = std::move(tmp);
}
模板
无效掉期(T&lhs、T&rhs){
自动tmp=标准::移动(rhs);
rhs=标准::移动(lhs);
lhs=std::move(tmp);
}
基本上和定制的一样快

具有
swap
成员的现有类型不太可能丢失它们(至少是立即丢失)。然而,扩展新类型的API应该是合理的

如果
std::future
基本上是一个围绕
std::unique\u ptr
的包装器,那么上述操作将需要4个指针读取、3个指针写入和一个分支。一个将it1内联的优化编译器可以将其减少到2次指针读取和2次指针写入(例如使用SSA2),这就是优化的
.swap
成员函数所能做的


1因此它知道不会出现对
lhs
rhs
的中间访问,因此
tmp
的存在可以被消除,就像一旦证明
tmp
为空,因此没有操作dtor一样


2,将程序分解,这样对原语的每个赋值都会创建一个全新的变量(带有元数据)。然后证明关于该变量的属性,并消除多余的属性。

为什么非限定
交换的是成员函数而不是友元函数?--我的印象是gcc(4.8)在优化
unique\u ptr
s方面做得不好。虽然它确实使用SSE,但它执行许多不必要的操作。可能是由于异常处理,但也可能是因为libstdc++的
unique\u ptr
使用
元组来实现deleter和指针的压缩对,而元组可能很难优化。@dyp听起来像是改进优化器的原因,而不是改变语言。或者找到一种表达压缩元组习惯用法的方法,而不是基于难以优化的库的
元组
;如果压缩的
tuple
很难优化,那么可能有一个内置的
std::tuple
?这可能会走得很远;然后是一个内置的基本产品类型,它使实现压缩的
std::tuple
变得容易?libc++有一个专用的
compressed\u对
类型,我认为这已经有帮助了。至少在编译时是这样。我想知道性能,因为出于性能原因,Howard Hinnant似乎不喜欢“复制/移动+交换”习惯用法。@dyp,即复制/移动+交换以替换赋值,这是不同的。HH的投诉是,它基本上将任务升级为施工,施工需要清除目的地的现有状态。在分配目标时,通常可以部分重用目标上的状态,而不是循环使用它。例如,N次拷贝分配给一个向量,该向量重复拷贝构造交换,不进行N次分配;目标缓冲区的增长也是如此,复制赋值和复制构造元素的数量只有0。啊,我认为这是HH(赋值的强异常安全性)的另一个关注点。