From 2fb71825cd960b566f86562f7c484a95240baf81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8C=AB=E8=80=B3=E5=A0=80=E5=B7=9D=E9=9B=B7=E9=BC=93?= <58223265+neko-horikawaraiko@users.noreply.github.com> Date: Sat, 20 Feb 2021 20:55:48 +0800 Subject: [PATCH] Update item19.md Co-authored-by: Yang Yi --- 4.SmartPointers/item19.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4.SmartPointers/item19.md b/4.SmartPointers/item19.md index 4fd11cb..ad69c08 100644 --- a/4.SmartPointers/item19.md +++ b/4.SmartPointers/item19.md @@ -9,7 +9,7 @@ C++11中的`std::shared_ptr`将两者组合了起来。一个通过`std::shared_ 引用计数暗示着性能问题: + **`std::shared_ptr`大小是原始指针的两倍**,因为它内部包含一个指向资源的原始指针,还包含一个资源的引用计数值的原始指针。(这种实现法并不是标准要求的,但是我(指原书作者Scott Meyers)熟悉的所有标准库都这样实现。) -+ **引用计数的存储空间必须动态分配**。 理论上,引用计数与所指对象关联起来,但是被指向的对象不知道这件事情(译注:不知道有一个关联到自己的计数值)。因此它们没有办法存放一个引用计数值。(一个好的结果是任何对象——甚至是内置类型的——都可以由`std::shared_ptr`管理。)[Item21](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/4.SmartPointers/item21.md)会解释使用`std::make_shared`创建`std::shared_ptr`可以避免引用计数的动态分配,但是还存在一些`std::make_shared`不能使用的场景,这时候引用计数就会动态分配。 ++ **引用计数的存储空间必须动态分配**。 概念上,引用计数与所指对象关联起来,但是实际上被指向的对象不知道这件事情(译注:不知道有一个关联到自己的计数值)。因此它们没有办法存放一个引用计数值。(一个好消息是任何对象——甚至是内置类型的——都可以由`std::shared_ptr`管理。)[Item21](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/4.SmartPointers/item21.md)会解释使用`std::make_shared`创建`std::shared_ptr`可以避免引用计数的动态分配,但是还存在一些`std::make_shared`不能使用的场景,这时候引用计数就会动态分配。 + **递增递减引用计数必须是原子性的**,因为多个reader、writer可能在不同的线程。比如,指向某种资源的`std::shared_ptr`可能在一个线程执行析构(于是递减指向的对象的引用计数),在另一个不同的线程,`std::shared_ptr`指向相同的对象,但是执行的却是拷贝操作(因此递增了同一个引用计数)。原子操作通常比非原子操作要慢,所以即使引用计数通常只有一个*word*大小,你也应该假定读写它们是存在开销的。 我写道`std::shared_ptr`构造函数只是“通常”递增指向对象的引用计数会不会让你有点好奇?创建一个指向对象的`std::shared_ptr`就产生了又一个指向那个对象的`std::shared_ptr`,为什么我没说**总是**增加引用计数值?