gpt4 book ai didi

c++ - Linux vs Windows std::map 赋值构造函数(为什么会有这样的差异?)

转载 作者:太空狗 更新时间:2023-10-29 23:20:40 25 4
gpt4 key购买 nike

我在 Linux Ubuntu 中编写的 C++ 应用程序中目睹了一些意外行为。我会构造一个带参数的对象,然后使用赋值运算符将该对象的拷贝放入 std::map 中。我写了一个简单的程序来演示这种情况...

#include <iostream>
#include <string>
#include <map>

using namespace std;

class Foo
{
public:
Foo(void) : _x(0)
{
cout << "Default" << endl;
}

Foo(int a) : _x(a)
{
cout << "Param" << endl;
}

Foo(Foo const &foo) :
_x(foo._x)
{
cout << "Copy" << endl;
}

Foo& operator=(Foo const &foo)
{
cout << "Assignment" << endl;

if (this != &foo)
{
_x = foo._x;
}

return *this;
}

int get(void)
{
return _x;
}

private:
int _x;
};

int main(int argc, char *argv [])
{
std::map<int, Foo> foos;

Foo a_foo(10);

foos[100] = a_foo;

return 0;
}

这里我只是打印出哪个构造函数/运算符以什么顺序被调用,这样我就可以看到构造和赋值在“main”函数中是如何工作的。

当我在 Windows 中运行它时,我得到了预期的输出...

参数
默认
赋值

当我在 Linux 中运行它时,我得到以下输出...

参数
默认
复制
复制
赋值

为什么会有两个额外的拷贝构造函数?对象创建这么多次好像效率很低?

谢谢!

最佳答案

答案就在STL_map.h中。它的行为取决于您是否使用 C++11 支持进行编译。 如果你这样做,STL 可以利用移动语义来避免不必要的复制。 VC++ 默认使用新的语言特性,但如果你使用 g++ 或 clang,你需要习惯使用 4.2 中的 -std=c++0x 标志或较新版本中的 -std=c++11

使用 -std=c++11 设置 g++4.8 的输出是:

Param
Default
Assignment

编辑:非常感谢您为我澄清我认为这归结为移动语义的假设是不正确的。我将保留此答案以将用户引导至 this better one .

关于c++ - Linux vs Windows std::map 赋值构造函数(为什么会有这样的差异?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18663963/

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