【发布时间】:2019-02-27 09:02:46
【问题描述】:
假设没有编译器优化。 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();
}
最初,我假设了 3 次。
1) 当func()被调用时,对象s会在栈上创建。
2) 当 func() 超出范围时,它会将对象 s 的副本返回给 main()。
3) 在 main() 中将值复制到对象 a,因为 func() 返回的值将是一个临时值。
我知道我在这里错了,因为我在g++ 中使用-O0 编译,但是在覆盖构造函数后我只能看到一个创建。我想知道我在哪里以及为什么我错了。
【问题讨论】:
-
3)
a是复制构造甚至移动构造,因为func()返回一个右值。 -
为什么这对你很重要?请注意as-if rule。甚至
g++和-O0也在做一些优化。 -
您使用的是哪个版本的 C++?
-
copy elision 在 C++17 之前允许,在 C++17 之后的某些情况下是强制性的。
-
@BasileStarynkevitch "as-if" 可能适用于这种情况——但它与复制省略并不真正相关。即使省略的构造函数或析构函数有副作用,也明确允许复制省略。
标签: c++ constructor copy-constructor