首页 > 解决方案 > 假设没有编译器优化,这个对象会被创建多少次?

问题描述

假设没有编译器优化。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) 将值复制到amain() 中的对象,因为 func() 返回的值将是临时的。

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

标签: c++constructorcopy-constructor

解决方案


你在这里有什么copy-elison

省略复制和移动(自 C++11 起)构造函数,从而产生零复制值传递语义。

-O0即使使用选项,GCC 也可以省略构造函数。这就是这里发生的事情。如果要专门防止省略,可以使用该-fno-elide-constructors选项。

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

在此处查看演示。

如果您使用 C++17,则在某些情况下可以保证复制省略,即使使用该-fno-elide-constructors选项,也会有一个构造函数调用和一个移动构造函数调用。

在此处查看演示。


推荐阅读