移动不比拷贝快的情况¶
在如下场景中,C++11 的移动语义没有优势:
- 无移动操作:待移动对象不提供移动操作,移动请求将变为拷贝请求
- 移动不比拷贝快:待移动对象虽然有移动操作,但不比拷贝操作快
- 移动不可用:本可以移动时,要求移动操作不能抛异常,但未加上 noexcept 声明
除了上述情况,还有一些特殊场景无需使用移动语义,比如之前提到的 RVO。
移动不一定比拷贝代价小得多。比如 std::array 实际是带 STL 接口的内置数组。不同于其他容器的是,其他容器把元素存放于堆上,自身只持有一个指向堆内存的指针,移动容器时只需要移动指针,在常数时间内即可完成移动

而 std::array 自身存储了内容,没有这样的指针,移动或拷贝对元素逐个执行,需要线性时间复杂度,所以移动并不比拷贝快多少。

另一个移动不一定比拷贝快的例子是 std::string,一种实现是使用 small string optimization(SSO),在字符串很小时(一般是15字节)存储在自身内部,而不使用堆上分配的内存,因此对小型字符串的移动并不比拷贝快。