This commit is contained in:
y1yang0 2023-08-24 05:07:56 +00:00
parent e58f62ff21
commit 74a42b3882
4 changed files with 4 additions and 4 deletions

View File

@ -348,7 +348,7 @@ private:
<p>所以,正如我所说,当形参通过赋值进行拷贝时,分析按值传递的开销是复杂的。通常,最有效的经验就是“在证明没问题之前假设有问题”,就是除非已证明按值传递会为你需要的形参类型产生可接受的执行效率,否则使用重载或者通用引用的实现方式。</p>
<p>到此为止,对于需要运行尽可能快的软件来说,按值传递可能不是一个好策略,因为避免即使开销很小的移动操作也非常重要。此外,有时并不能清楚知道会发生多少次移动操作。在<code>Widget::addName</code>例子中,按值传递仅多了一次移动操作,但是如果<code>Widget::addName</code>调用了<code>Widget::validateName</code>,这个函数也是按值传递。(假定它有理由总是拷贝它的形参,比如把验证过的所有值存在一个数据结构中。)并假设<code>validateName</code>调用了第三个函数,也是按值传递……</p>
<p>可以看到这将会通向何方。在调用链中,每个函数都使用传值,因为“只多了一次移动的开销”,但是整个调用链总体就会产生无法忍受的开销,通过引用传递,调用链不会增加这种开销。</p>
<p>跟性能无关,但总是需要考虑的是,按值传递不像按引用传递那样会收到切片问题的影响。这是C++98的事在此不在详述但是如果要设计一个函数来处理这样的形参基类<strong>或者任何其派生类</strong>,你肯定不想声明一个那个类型的传值形参,因为你会“切掉”传入的任意派生类对象的派生类特征:</p>
<p>跟性能无关,但总是需要考虑的是,不像按引用传递,按值传递会受到切片问题的影响。这是C++98的事在此不在详述但是如果要设计一个函数来处理这样的形参基类<strong>或者任何其派生类</strong>,你肯定不想声明一个那个类型的传值形参,因为你会“切掉”传入的任意派生类对象的派生类特征:</p>
<pre><code class="language-cpp">class Widget { … }; //基类
class SpecialWidget: public Widget { … }; //派生类
void processWidget(Widget w); //对任意类型的Widget的函数包括派生类型

View File

@ -5927,7 +5927,7 @@ private:
<p>所以,正如我所说,当形参通过赋值进行拷贝时,分析按值传递的开销是复杂的。通常,最有效的经验就是“在证明没问题之前假设有问题”,就是除非已证明按值传递会为你需要的形参类型产生可接受的执行效率,否则使用重载或者通用引用的实现方式。</p>
<p>到此为止,对于需要运行尽可能快的软件来说,按值传递可能不是一个好策略,因为避免即使开销很小的移动操作也非常重要。此外,有时并不能清楚知道会发生多少次移动操作。在<code>Widget::addName</code>例子中,按值传递仅多了一次移动操作,但是如果<code>Widget::addName</code>调用了<code>Widget::validateName</code>,这个函数也是按值传递。(假定它有理由总是拷贝它的形参,比如把验证过的所有值存在一个数据结构中。)并假设<code>validateName</code>调用了第三个函数,也是按值传递……</p>
<p>可以看到这将会通向何方。在调用链中,每个函数都使用传值,因为“只多了一次移动的开销”,但是整个调用链总体就会产生无法忍受的开销,通过引用传递,调用链不会增加这种开销。</p>
<p>跟性能无关,但总是需要考虑的是,按值传递不像按引用传递那样会收到切片问题的影响。这是C++98的事在此不在详述但是如果要设计一个函数来处理这样的形参基类<strong>或者任何其派生类</strong>,你肯定不想声明一个那个类型的传值形参,因为你会“切掉”传入的任意派生类对象的派生类特征:</p>
<p>跟性能无关,但总是需要考虑的是,不像按引用传递,按值传递会受到切片问题的影响。这是C++98的事在此不在详述但是如果要设计一个函数来处理这样的形参基类<strong>或者任何其派生类</strong>,你肯定不想声明一个那个类型的传值形参,因为你会“切掉”传入的任意派生类对象的派生类特征:</p>
<pre><code class="language-cpp">class Widget { … }; //基类
class SpecialWidget: public Widget { … }; //派生类
void processWidget(Widget w); //对任意类型的Widget的函数包括派生类型

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long