From cac842213d8273f0731c80231edbde2a73ff388b Mon Sep 17 00:00:00 2001 From: WBY Date: Thu, 22 Apr 2021 20:58:58 +0800 Subject: [PATCH] Update item29.md --- 5.RRefMovSemPerfForw/item29.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/5.RRefMovSemPerfForw/item29.md b/5.RRefMovSemPerfForw/item29.md index 7ef1d8c..b6cc816 100644 --- a/5.RRefMovSemPerfForw/item29.md +++ b/5.RRefMovSemPerfForw/item29.md @@ -40,7 +40,7 @@ auto aw2 = std::move(aw1); 注意`aw1`中的元素被**移动**到了`aw2`中。假定`Widget`类的移动操作比复制操作快,移动`Widget`的`std::array`就比复制要快。所以`std::array`确实支持移动操作。但是使用`std::array`的移动操作还是复制操作都将花费线性时间的开销,因为每个容器中的元素终归需要拷贝或移动一次,这与“移动一个容器就像操作几个指针一样方便”的含义相去甚远。 -另一方面,`std::strnig`提供了常数时间的移动操作和线性时间的复制操作。这听起来移动比复制快多了,但是可能不一定。许多字符串的实现采用了小字符串优化(*small string optimization*,SSO)。“小”字符串(比如长度小于15个字符的)存储在了`std::string`的缓冲区中,并没有存储在堆内存,移动这种存储的字符串并不必复制操作更快。 +另一方面,`std::string`提供了常数时间的移动操作和线性时间的复制操作。这听起来移动比复制快多了,但是可能不一定。许多字符串的实现采用了小字符串优化(*small string optimization*,SSO)。“小”字符串(比如长度小于15个字符的)存储在了`std::string`的缓冲区中,并没有存储在堆内存,移动这种存储的字符串并不必复制操作更快。 SSO的动机是大量证据表明,短字符串是大量应用使用的习惯。使用内存缓冲区存储而不分配堆内存空间,是为了更好的效率。然而这种内存管理的效率导致移动的效率并不必复制操作高,即使一个半吊子程序员也能看出来对于这样的字符串,拷贝并不比移动慢。