请考虑以下代码,

struct foo
{
    foo()
    {
        std::cout << "Constructing!" << std::endl;
    }

    foo(const foo& f)
    {
        std::cout << "Copy constructing!" << std::endl;
    }

    ~foo()
    {
        std::cout << "Destructing.." << std::endl;
    }
};

foo get()
{
    foo f;
    return f;
}

int main()
{
    const foo& f = get();
    std::cout << "before return" << std::endl;
    return 0;
}

输出MSVC

Constructing!
Copy constructing!
Destructing..
before return
Destructing..

输出的海湾合作委员会

Constructing!
before return
Destructing..

结果,在MSVC看起来不正确的。

的问题

  1. 据我所知,海湾合作委员会产生正确结果在这里。为什么MSVC是给予不同的结果和为什么这是做复制的建设?
  2. const foo& f = get()const foo f = get() 生产相同的输出,因为回报价值的最优化。在这种情况下,其写作方式应该是优选的?

任何思想..

有帮助吗?

解决方案

你MSVC建立没有优化。把他们,你会得到相同的输出。

海湾合作委员会仅仅是执行,默认情况下,RVO在你暂时的。它基本上是这样做:

const foo& f = foo();

MSVC不是。它的制作 foo 在功能、复制以外的功能(因此复制的构造话),毁内 foo, 然后结合的参考。

这两个产出是正确的。RVO是一个实例,其中标明确允许可观察到的程序行为的改变。

其他提示

你看到的 回价值的最优化, ,这是一种 省音复制.这两个程序都是正确的;编译器是专门给出的选择消除了一个临时的,这只是为了将数据从一个永久目到另一个。

Get()功能是建设本地(印建设!), 和返回Foo对象的价值。Foo对象返回必须是创建和完成,所以通过复制建设(印刷副本建设!).注意,这是目值分配给const foo&f在主要的。

在此之前,分配需要的地方,虽然功能必须返回自获得()和地方变量(即foo f;在获得())必须销毁。(打印第1毁..)从有程序终止(即返回,从主要的),然后返回的对象获得通过()以及分配给"f"被摧毁。(打印第2毁...)

你看到不同的输出对这两个编译器是,海湾合作委员会是优化回报值得()是简单地取代 const foo &f = get()const foo &f = foo;

1)这种情况发生,因为不同的优化战略。因为你没有操作者=,MSVC可以进行重组的代码之类的东西const foo&f(获得()),因此执行的复制onstructor.2)取决于你想要什么,以实现:

const foo& f = get();
f = get(); // Incorrect, const references cannot be reassigned.
const foo g = get();
g = get(); // Correct.
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top