c++ - 假设没有编译器优化,这个对象会被创建多少次?
问题描述
假设没有编译器优化。OutputBuffer_s 类型对象将被创建多少次?
#include <iostream>
#include <vector>
struct OutputBuffer_s {
int encoded[10];
};
OutputBuffer_s func() {
OutputBuffer_s s;
return s;
}
int main() {
OutputBuffer_s a = func();
}
最初,我假设了三遍。
1) 当 func() 被调用时,对象s
将在堆栈上创建。
2) 当 func() 超出范围时,它会将对象的副本返回s
给 main()。
3) 将值复制到a
main() 中的对象,因为 func() 返回的值将是临时的。
我知道我在这里错了,因为我用-O0
in编译g++
但在覆盖构造函数后我只能看到一个创建。我想知道我在哪里以及为什么我错了。
解决方案
你在这里有什么copy-elison。
省略复制和移动(自 C++11 起)构造函数,从而产生零复制值传递语义。
-O0
即使使用选项,GCC 也可以省略构造函数。这就是这里发生的事情。如果要专门防止省略,可以使用该-fno-elide-constructors
选项。
如果使用此选项,对于 C++11,将有一个构造函数调用和两个移动构造函数调用。
在此处查看演示。
如果您使用 C++17,则在某些情况下可以保证复制省略,即使使用该-fno-elide-constructors
选项,也会有一个构造函数调用和一个移动构造函数调用。
在此处查看演示。
推荐阅读
- java - JpaSpecificationExecutor的方法是怎么做的
.findAll(规范 规范)有效吗? - tensorflow - 如何在 tensorflow lite 模型文件 (v 1.x) 中嵌入模型版本或描述
- python - 如何在 Pyqt 中创建可调整大小的布局 UI?
- javascript - Chrome扩展打开多个标签
- windows-installer - 如何在使用 VS2017 设置项目创建设置时在对话框中添加自定义先决条件?
- java - JPA 与 netbeans 8.2
- javascript - 通过 jQuery 意外行为设置 id [我缺少什么?]
- r - 使用 apply 进行标准化
- typo3 - How to generate a rating meta tag in TYPO3 with caching?
- caching - postsharp - 基于参数值的缓存