gpt4 book ai didi

c++ - move 语义 == 自定义交换功能已过时?

转载 作者:IT老高 更新时间:2023-10-28 12:41:56 24 4
gpt4 key购买 nike

最近,many questions pop up关于如何提供自己的 swap 功能。在 C++11 中,std::swap 将使用 std::move 并 move 语义以尽可能快地交换给定值。当然,这仅在您提供 move 构造函数和 move 赋值运算符(或使用按值传递的运算符)时才有效。

现在,鉴于此,是否真的有必要在 C++11 中编写自己的 swap 函数?我只能想到不可 move 的类型,但话又说回来,自定义 swap 通常通过某种“指针交换”(又名 move )来工作。也许有某些引用变量?嗯……

最佳答案

这是一个判断的问题。我通常会让 std::swap完成原型(prototype)代码的工作,但为发布代码编写自定义交换。我通常可以编写一个自定义交换,其速度大约是 1 次 move 构建 + 2 次 move 分配 + 1 次无资源破坏的两倍。然而,人们可能想等到 std::swap在去麻烦之前实际上证明是一个性能问题。

Alf P. Steinbach 更新:

20.2.2 [utility.swap] 指定 std::swap(T&, T&)有一个 noexcept相当于:

template <class T>
void
swap(T& a, T& b) noexcept
(
is_nothrow_move_constructible<T>::value &&
is_nothrow_move_assignable<T>::value
);

即if 对 T 进行 move 操作是 noexcept ,然后 std::swapTnoexcept .

请注意,此规范不需要 move 成员。它只要求存在右值的构造和赋值,如果是noexcept , 那么交换将是 noexcept .例如:

class A
{
public:
A(const A&) noexcept;
A& operator=(const A&) noexcept;
};

std::swap<A>是 noexcept,即使没有 move 成员。

关于c++ - move 语义 == 自定义交换功能已过时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6416385/

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