Boost C++ 库

……这是世界上最受推崇、设计最精妙的 C++ 库项目之一。 Herb SutterAndrei AlexandrescuC++ Coding Standards

介绍 - Boost C++ 函数库
PrevUpHomeNext
[Note] 注意

前 3 章改编自 Howard E. Hinnant、Bjarne Stroustrup 和 Bronek Kozicki 的文章 A Brief Introduction to Rvalue References(右值引用的简要介绍)。

复制可能很昂贵。例如,对于向量 v2=v1,通常会涉及函数调用、内存分配和循环。当然,在我们需要向量的两个副本时,这是可以接受的,但在很多情况下,我们并不需要:我们经常将一个 vector 从一个地方复制到另一个地方,然后继续覆盖旧的副本。考虑一下

template <class T> void swap(T& a, T& b)
{
   T tmp(a);   // now we have two copies of a
   a = b;      // now we have two copies of b
   b = tmp;    // now we have two copies of tmp (aka a)
}

但是,我们不想复制 a 或 b 的任何副本,我们只想交换它们。让我们再试一次。

template <class T> void swap(T& a, T& b)
{
   T tmp(::boost::move(a));
   a = ::boost::move(b);
   b = ::boost::move(tmp);
}

这个 move() 将其目标设置为其参数的值,但不一定保留其源的值。因此,对于 vector,可以合理地期望 move() 将其参数留为空向量,以避免复制所有元素。换句话说,move 是一种可能具有破坏性的复制

在这种特定情况下,我们可以通过特化来优化 swap。但是,我们不能为在删除或覆盖大对象之前复制它的每个函数都进行特化。那将是难以管理的。

在 C++0x 中,move 语义是通过引入右值引用来实现的。它们允许我们在没有冗长代码或运行时开销的情况下实现 move()Boost.Move 是一个库,它提供了实现这些 move 语义的工具,不仅可以在支持 rvalue references 的编译器中使用,也可以在符合 C++03 的编译器中使用。


PrevUpHomeNext