Skip to content

Commit ffc7942

Browse files
authored
Merge pull request Tencent#750 from bennyyip/master
fix Tencent#749
2 parents 7a39172 + 6a15e40 commit ffc7942

File tree

2 files changed

+12
-12
lines changed

2 files changed

+12
-12
lines changed

doc/faq.zh-cn.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,9 @@
163163

164164
## Document/Value (DOM)
165165

166-
1. 什么是转移语意?为什么?
166+
1. 什么是转移语义?为什么?
167167

168-
`Value` 不用复制语意,而使用了转移语意。这是指,当把来源值赋值于目标值时,来源值的所有权会转移至目标值。
168+
`Value` 不用复制语义,而使用了转移语义。这是指,当把来源值赋值于目标值时,来源值的所有权会转移至目标值。
169169

170170
由于转移快于复制,此设计决定强迫使用者注意到复制的消耗。
171171

doc/tutorial.zh-cn.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ Value o(kObjectType);
292292
Value a(kArrayType);
293293
~~~~~~~~~~
294294

295-
## 转移语意(Move Semantics) {#MoveSemantics}
295+
## 转移语义(Move Semantics) {#MoveSemantics}
296296

297297
在设计 RapidJSON 时有一个非常特别的决定,就是 Value 赋值并不是把来源 Value 复制至目的 Value,而是把把来源 Value 转移(move)至目的 Value。例如:
298298

@@ -302,13 +302,13 @@ Value b(456);
302302
b = a; // a 变成 Null,b 变成数字 123。
303303
~~~~~~~~~~
304304
305-
![使用移动语意赋值。](diagram/move1.png)
305+
![使用移动语义赋值。](diagram/move1.png)
306306
307-
为什么?此语意有何优点
307+
为什么?此语义有何优点
308308
309309
最简单的答案就是性能。对于固定大小的 JSON 类型(Number、True、False、Null),复制它们是简单快捷。然而,对于可变大小的 JSON 类型(String、Array、Object),复制它们会产生大量开销,而且这些开销常常不被察觉。尤其是当我们需要创建临时 Object,把它复制至另一变量,然后再析构它。
310310
311-
例如,若使用正常 * 复制 * 语意
311+
例如,若使用正常 * 复制 * 语义
312312
313313
~~~~~~~~~~cpp
314314
Value o(kObjectType);
@@ -321,15 +321,15 @@ Value o(kObjectType);
321321
}
322322
~~~~~~~~~~
323323

324-
![复制语意产生大量的复制操作](diagram/move2.png)
324+
![复制语义产生大量的复制操作](diagram/move2.png)
325325

326326
那个 `o` Object 需要分配一个和 contacts 相同大小的缓冲区,对 conacts 做深度复制,并最终要析构 contacts。这样会产生大量无必要的内存分配/释放,以及内存复制。
327327

328328
有一些方案可避免实质地复制这些数据,例如引用计数(reference counting)、垃圾回收(garbage collection, GC)。
329329

330-
为了使 RapidJSON 简单及快速,我们选择了对赋值采用 * 转移 * 语意。这方法与 `std::auto_ptr` 相似,都是在赋值时转移拥有权。转移快得多简单得多,只需要析构原来的 Value,把来源 `memcpy()` 至目标,最后把来源设置为 Null 类型。
330+
为了使 RapidJSON 简单及快速,我们选择了对赋值采用 * 转移 * 语义。这方法与 `std::auto_ptr` 相似,都是在赋值时转移拥有权。转移快得多简单得多,只需要析构原来的 Value,把来源 `memcpy()` 至目标,最后把来源设置为 Null 类型。
331331

332-
因此,使用转移语意后,上面的例子变成:
332+
因此,使用转移语义后,上面的例子变成:
333333

334334
~~~~~~~~~~cpp
335335
Value o(kObjectType);
@@ -341,11 +341,11 @@ Value o(kObjectType);
341341
}
342342
~~~~~~~~~~
343343
344-
![转移语意不需复制。](diagram/move3.png)
344+
![转移语义不需复制。](diagram/move3.png)
345345
346-
在 C++11 中这称为转移赋值操作(move assignment operator)。由于 RapidJSON 支持 C++03,它在赋值操作采用转移语意,其它修改形函数如 `AddMember()`, `PushBack()` 也采用转移语意
346+
在 C++11 中这称为转移赋值操作(move assignment operator)。由于 RapidJSON 支持 C++03,它在赋值操作采用转移语义,其它修改形函数如 `AddMember()`, `PushBack()` 也采用转移语义
347347
348-
### 转移语意及临时值 {#TemporaryValues}
348+
### 转移语义及临时值 {#TemporaryValues}
349349
350350
有时候,我们想直接构造一个 Value 并传递给一个“转移”函数(如 `PushBack()`、`AddMember()`)。由于临时对象是不能转换为正常的 Value 引用,我们加入了一个方便的 `Move()` 函数:
351351

0 commit comments

Comments
 (0)