Merge branch 'master' into neko-horikawaraiko-patch-1

This commit is contained in:
猫耳堀川雷鼓 2021-03-15 20:39:46 +08:00 committed by GitHub
commit fd71cc7b83
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 4 additions and 4 deletions

View File

@ -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::strnig`提供了常数时间的移动操作和线性时间的复制操作。这听起来移动比复制快多了,但是可能不一定。许多字符串的实现采用了小字符串优化(*small string optimization*SSO。“小”字符串比如长度小于15个字符的存储在了`std::string`的缓冲区中,并没有存储在堆内存,移动这种存储的字符串并不必复制操作更快。
SSO的动机是大量证据表明短字符串是大量应用使用的习惯。使用内存缓冲区存储而不分配堆内存空间是为了更好的效率。然而这种内存管理的效率导致移动的效率并不必复制操作高即使一个半吊子程序员也能看出来对于这样的字符串拷贝并不比移动慢。

View File

@ -28,7 +28,7 @@ void fwd(Ts&&... params) //接受任何实参
}
```
这种形式你会在标准化容器置函数emplace functions参见[Item42](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/8.Tweaks/item42.md))和智能指针的工厂函数`std::make_unique`和`std::make_shared`中(参见[Item21](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/4.SmartPointers/item21.md))看到,当然还有其他一些地方。
这种形式你会在标准化容器置函数emplace functions参见[Item42](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/8.Tweaks/item42.md))和智能指针的工厂函数`std::make_unique`和`std::make_shared`中(参见[Item21](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/4.SmartPointers/item21.md))看到,当然还有其他一些地方。
给定我们的目标函数`f`和转发函数`fwd`,如果`f`使用某特定实参做一件事,但是`fwd`使用相同的实参做另一件事,完美转发就会失败:
@ -39,7 +39,7 @@ fwd( expression ); //但是这个做另外的某件事fwd完美转发express
导致这种失败的实参种类有很多。知道它们是什么以及如何解决它们很重要,因此让我们来看看无法做到完美转发的实参类型。
### 花括号初始化
### 花括号初始化
假定`f`这样声明:

View File

@ -28,7 +28,7 @@ auto fut = std::async(doAsyncWork); //“fut”表示“future”
- **硬件线程**hardware threads是真实执行计算的线程。现代计算机体系结构为每个CPU核心提供一个或者多个硬件线程。
- **软件线程**software threads也被称为系统线程OS threads、system threads是操作系统假设有一个操作系统。有些嵌入式系统没有。管理的在硬件线程上执行的线程。通常可以存在比硬件线程更多数量的软件线程因为当软件线程被阻塞的时候比如 I/O、同步锁或者条件变量操作系统可以调度其他未阻塞的软件线程执行提供吞吐量。
- **`std::thread`**是C++执行过程的对象,并作为软件线程的句柄(*handle*)。有些`std::thread`对象代表“空”句柄,即没有对应软件线程,因为它们处在默认构造状态(即没有函数要执行);有些被移动走(移动到的`std::thread`就作为这个软件线程的句柄);有些被`join`(它们要运行的函数已经运行完);有些被`detach`(它们和对应的软件线程之间的连接关系被打断)。
- **`std::thread`** 是C++执行过程的对象,并作为软件线程的句柄(*handle*)。有些`std::thread`对象代表“空”句柄,即没有对应软件线程,因为它们处在默认构造状态(即没有函数要执行);有些被移动走(移动到的`std::thread`就作为这个软件线程的句柄);有些被`join`(它们要运行的函数已经运行完);有些被`detach`(它们和对应的软件线程之间的连接关系被打断)。
软件线程是有限的资源。如果开发者试图创建大于系统支持的线程数量,会抛出`std::system_error`异常。即使你编写了不抛出异常的代码,这仍然会发生,比如下面的代码,即使 `doAsyncWork``noexcept`
```cpp