gpt4 book ai didi

c++ - 为什么 std::future 和 std::shared_future 不提供成员 swap()?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:51:13 26 4
gpt4 key购买 nike

C++标准库中的各种类都有成员交换函数,包括一些多态类,如std::basic_ios<CharT>。 .模板类std::shared_future<T>显然是一个值类型并且 std::future<T>是一个只能移动的值类型。有什么特别的原因,他们不提供 swap()成员函数?

最佳答案

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

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);
}

基本上和自定义编写的一样快。

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

如果std::future基本上是 std::unique_ptr< future_impl > 的包装器,那么以上将需要 4 次指针读取、3 次指针写入和 1 次分支。内联它的优化编译器1 可以将其减少到 2 个指针读取和 2 个指针写入(例如使用 SSA2),这就是优化的 .swap成员函数可以做到。


1 所以它知道对 lhs 的中间访问和 rhs从未发生,因此存在 tmp一旦证明就可以消除tmp是空的,因此有一个空操作 dtor。

2 Static single assignment ,您可以在其中分解程序,以便对原语的每个分配都会创建一个全新的变量(带有元数据)。然后证明该变量的属性,并消除多余的属性。

关于c++ - 为什么 std::future<T> 和 std::shared_future<T> 不提供成员 swap()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40523179/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com