立即定义带有值的字符串时建议的速度提升,而不是延迟

Ton*_*ion 10 c++ performance definitions

我目前正在阅读Bjarne Stroustrup撰写的"The C++ Programming Language:Special Edition"和第133页,其中说明如下:

对于用户定义的类型,将变量的定义推迟到合适的初始化程序可用之后,也可以获得更好的性能.例如:

string s;  /* .... */ s = "The best is the enemy of the good.";
Run Code Online (Sandbox Code Playgroud)

很容易慢得多

string s = "Voltaire";
Run Code Online (Sandbox Code Playgroud)

我知道状态很容易,这意味着它不一定是这样,但是我们只是说它确实发生了.

为什么这会带来潜在的性能提升?

难道只有这样与用户定义类型(甚至STL型)或者是这也与案件int,float等等?

NPE*_*NPE 9

我会说这主要是关于具有非平凡默认构造函数的类型,至少就性能而言.

两种方法的区别在于:

  • 在第一个版本中,首先构造一个空字符串(使用默认构造函数); 然后赋值运算符用于有效地丢弃默认构造函数完成的工作,并将新值赋给字符串.
  • 在第二个版本中,在构造点立即设置所需的值.

当然,事先告诉我们这会产生多大的性能差异真的很难.


sbi*_*sbi 7

  1. 执行默认构造函数需要时间.覆盖它在随后调用的赋值运算符中初始化字符串的内容也需要时间.

  2. 当函数(由于return语句或异常)在默认构造函数和赋值运算符的调用之间留下时,执行可能永远不会到达赋值.在这种情况下,对象被不必要地默认初始化.

  3. 实现可能会浪费性能以确保在抛出异常时调用对象析构函数.如果在后续范围内初始化对象,则从未达到该范围,也不需要.