我有一个函数可以生成 A 类型对象的映射。
map<int,A> test()
{
map<int, A> m;
A a1(10); // constructor
A a2(20);
A a3(30);
m[0] = a1; m[1] = a2; m[2] = a3; // <-- copy constructor and = operator
return m;
}
当我执行这个函数时,我调用了构造函数,然后调用了复制构造函数和 = 运算符。
map<int,A> x = test();
有没有办法让编译器像返回值优化 (RVO) 一样优化它,只调用一个构造函数?
替代方法可能是使用指针,但我想知道是否还有其他方法。
map<int,A*> test3()
{
map<int, A*> m;
A* a1 = new A(10);
A* a2 = new A(20);
A* a3 = new A(30);
m[0] = a1; m[1] = a2; m[2] = a3;
return m;
}
...
map<int,A*> x = test3();
...
for (auto val: x)
{
delete val.second;
}
最佳答案
如果您的实现支持它,emplace :
#include <map>
#include <iostream>
struct A {
A(int) { std::cout << "ctor\n"; }
A(const A&) { std::cout << "copy ctor\n"; }
A(A&&) { std::cout << "move ctor\n"; }
~A() { std::cout << "dtor\n"; }
};
std::map<int,A> test()
{
std::map<int, A> m;
m.emplace(0, 10);
m.emplace(1, 20);
m.emplace(2, 30);
return m;
}
int main()
{
std::map<int, A> m = test();
std::cout << "m.size() = " << m.size() << '\n';
}
输出:
$ ./test
ctor
ctor
ctor
m.size() = 3
dtor
dtor
dtor
关于c++ - 使c++编译器优化以在 map 初始化中调用一次构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17159916/