gpt4 book ai didi

c++ - 即使禁用了优化,Visual Studio 也会优化吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:53:34 24 4
gpt4 key购买 nike

我正在研究移动和复制构造函数只是为了更多地了解它们,遇到了让我有点摸不着头脑的这个小怪事。基本上,我已经创建了一个类,其中覆盖了构造函数、析构函数、复制构造函数和移动构造函数,并且我正在以不同的方式构造它们以查看如何调用构造函数。我找到了一个调用订单,但它没有产生我期望的结果。请记住,我在这里完全禁用了优化,并且我正在 VS2012 中进行编译。在这种情况下内联是否仍然可行?

这是我写的源代码。

class RvalueTest
{
public:
RvalueTest() {
printf("CONSTRUCTOR\n");
}

RvalueTest(const RvalueTest& r) {
printf("COPY CONSTRUCTOR\n");
}

RvalueTest(RvalueTest&& r) {
printf("MOVE CONSTRUCTOR\n");
}
};

__declspec(noinline)
RvalueTest GetRvalueTest() {
return RvalueTest();
}

然后我使用以下代码对其进行测试。

RvalueTest t1;
RvalueTest t2(t1);
RvalueTest t3(GetRvalueTest());

我希望看到的是以下内容。

CONSTRUCTOR
COPY CONSTRUCTOR
CONSTRUCTOR
MOVE CONSTRUCTOR

不过我实际看到的是这个。

CONSTRUCTOR
COPY CONSTRUCTOR
CONSTRUCTOR

似乎最后一行被内联到单个构造函数调用中,如果启用了优化,这自然应该发生。即使我完全关闭了优化,这仍然会发生吗?更奇怪的是,如果我执行以下操作。

RvalueTest t1;
RvalueTest t2(t1);
RvalueTest t3(RvalueTest(GetRvalueTest()));

我得到以下结果

CONSTRUCTOR
COPY CONSTRUCTOR

最佳答案

在第一个示例中,编译器似乎确实省略了移动构造函数调用。允许编译器这样做,无论是否启用优化,以及被省略的复制/移动构造函数是否有副作用。

在第二种情况下,您有一个 most vexing parse 的案例继续。

RvalueTest t3(RvalueTest(GetRvalueTest()));

这将 t3 定义为一个函数,它接受一个指向带有签名 RvalueTest(*)() 的函数的指针并返回一个 RvalueTest按值(value)。使用大括号来解决这个问题(可能不适用于 VS2012)

RvalueTest t3(RvalueTest{GetRvalueTest()});
// ^ ^

进行更改后,我使用 VS2013 得到以下输出:

CONSTRUCTOR
COPY CONSTRUCTOR
CONSTRUCTOR
MOVE CONSTRUCTOR

关于c++ - 即使禁用了优化,Visual Studio 也会优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22950975/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com