![]() |
1
9
我认为这是一个非常常用的优化方法,因为:
如果你只是好奇,就调试一下
当我运行一个未经优化的构建时,会打印出“复制一个foo”,但当我优化构建时,不会打印任何内容。 |
![]() |
2
5
从你引用的文章:
它更著名的是 Return Value Optimization 。 |
![]() |
3
3
唯一能确定的方法就是看一下装配图,但你问的问题是错的。您不需要知道编译器是否正在删除副本,除非它与程序时间有关。如果在复制构造函数中花费了太多时间,分析器应该很容易告诉您。 可怜的人解决这个问题的方法是在复制构造函数中放置一个静态计数器,并尝试使用两种形式的函数。如果计数相同,您就成功地避免了复制。 |
![]() |
4
2
谷歌“命名回报值优化”和“回报值优化”。事实上,现代编译器在许多情况下不会执行拷贝。 您可以通过返回带有副作用的类型(如打印消息)来检查是否发生了这种情况。 Wikipedia 有一些很好的例子说明当RVO和/或NRVO生效时程序输出在哪里发生变化。 |
![]() |
5
2
其外观示例:
如果您没有看到输出,那么复制省略已经发生。这是从初始值设定项中删除副本。副本删除的另一个法律案例是返回值,并通过以下方式进行测试:
或者更令人兴奋的是,对于指定的返回值:
G++在没有优化标志的情况下为我执行所有这些省略,但是您不知道更复杂的代码是否会胜过编译器。
请注意,复制省略对分配没有帮助,因此以下操作将始终导致调用
因此,按值返回仍然会导致“复制”,即使执行了复制构造函数省略。因此,对于大类的分块来说,它仍然是设计阶段的性能考虑因素。你不想写这样的代码,如果你的应用程序将大量时间花在复制上,那么以后再修改它将是一件大事,而这本来是可以避免的。 |
![]() |
6
1
要回答问题2,您可以编写一个演示程序,在其中编写
|
![]() |
7
1
R值引用在C++ 0x中解决了这个问题。您是否可以获得一个启用R值的编译器是另一个问题。上次我只检查VisualStudio 2010支持它。 |
![]() |
Hatsune Miku · 比较或if语句是否更快[已关闭] 1 年前 |
![]() |
Black Swan · 无法解压缩的值太多(应为2)错误 1 年前 |
![]() |
Kai · 有什么方法可以轻松优化VSCode中的锈迹? 2 年前 |
![]() |
Balfar · 处理NumPy阵列上的循环最有效的方法是什么? 2 年前 |
![]() |
Daniel · C#轻松存储快速访问的大型位矩阵 6 年前 |
|
halbe · 优化音频DSP程序的numpy计算 6 年前 |
![]() |
Afsara · 是否有任何方法不能优化我们的应用程序? 6 年前 |