gpt4 book ai didi

C++ 代码在 g++ 和 vs2008 中得到不同的结果

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

#include <iostream>
#include <string>
#include <vector>
using namespace std;

struct Exmpl{
Exmpl()
{
cout << "Exmpl()" << endl;
}

Exmpl(const Exmpl&)
{
cout << "Exmpl(const Exmpl&)" << endl;
}

Exmpl& operator=(const Exmpl& rhs)
{
cout << "operator=Exmpl()" << endl;
return *this;
}

~Exmpl()
{
cout << "~Exmpl()" << endl;
}
};

void func1(Exmpl obj)
{
}

void func2(Exmpl &obj)
{
}

Exmpl func3()
{
Exmpl obj;
return obj;
}

int main()
{
Exmpl eobj;
func1(eobj);
func2(eobj);
eobj = func3();
Exmpl *p = new Exmpl;
vector<Exmpl> evec(3);

delete p;
return 0;
}

在 g++(4.4.3) 中编译时我得到了

Exmpl()
Exmpl(const Exmpl&)
~Exmpl()
Exmpl()
operator=(const Exmpl&)
~Exmpl()
Exmpl()
Exmpl()
Exmpl(const Exmpl&)
Exmpl(const Exmpl&)
Exmpl(const Exmpl&)
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()

而在 vs2008 中,结果是:

Exmpl()
Exmpl(const Exmpl&)
~Exmpl()
Exmpl()
Exmpl(const Exmpl&)
~Exmpl()
operator=(const Exmpl&)
~Exmpl()
Exmpl()
Exmpl()
Exmpl(const Exmpl&)
Exmpl(const Exmpl&)
Exmpl(const Exmpl&)
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()

当代码转到“eobj = func3();”时主要是,vs2008 结果中的第 5 行和第 6 行在 g++ 中找不到。我尝试了几个级别的优化,但结果是一样的。差异的原因是什么?

最佳答案

C++ 允许在对象作为函数值返回时省略复制构造函数(如 func3())。即使构造函数除了构造新对象之外还有副作用 - 在这种情况下,复制构造函数写入 cout

g++ 即使没有指定优化也会这样做,而 MSVC 只有在您要求执行优化时才会这样做。

如果将程序缩减为以下内容(只是为了将输出缩减为有趣的部分):

int main()
{
Exmpl eobj;
eobj = func3();

return 0;
}

对于使用这些命令行生成的程序(使用 MinGW 4.6.1 和 MSVC 16.0,也称为 VC++ 2010 完成的测试),您将看到以下内容:

  • g++ -O0 -o test.exe test.cpp(g++,“无”优化)
  • g++ -O2 -o test.exe test.cpp(g++,优化)
  • cl/Ox/EHsc test.cpp(msvc,优化)

    Exmpl()
    Exmpl()
    operator=Exmpl()
    ~Exmpl()
    ~Exmpl()
  • cl/EHsc test.cpp(msvc,无优化)

  • g++ -fno-elide-constructors -o test.exe test.cpp(根据 Jesse Good 的建议,g++ 没有省略构造函数)

    Exmpl()
    Exmpl()
    Exmpl(const Exmpl&)
    ~Exmpl()
    operator=Exmpl()
    ~Exmpl()
    ~Exmpl()

关于C++ 代码在 g++ 和 vs2008 中得到不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10475751/

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