假设没有编译器优化,这个对象会被创建多少次?

Sum*_*gra 5 c++ constructor copy-constructor

假设没有编译器优化.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();
}
Run Code Online (Sandbox Code Playgroud)

最初,我假设了三次.

1)当调用func()时,s将在堆栈上创建对象.

2)当func()超出范围时,它会将对象的副本返回s给main().

3)将值复制到amain()中的对象,因为func()返回的值将是临时的.

我知道我错在这里,因为我用-O0in 编译g++但是在覆盖构造函数之后我只能看到一个创建.我想知道我错在哪里和为什么.

P.W*_*P.W 6

你有什么copy-elison.

省略了复制和移动(自C++ 11)构造函数,导致零拷贝传值语义.

即使有-O0选择权,GCC也可以忽略施工人员.这就是这里发生的事情.如果要特别防止elision,可以使用该-fno-elide-constructors选项.

如果使用此选项,将有一个构造函数调用和两个移动构造函数调用C++ 11.

在这里演示.

如果使用C++ 17,在某些情况下可以保证copy-elision,即使使用该-fno-elide-constructors选项,也会有一个构造函数调用和一个移动构造函数调用.

在这里演示.