c++ - 使c++编译器优化以在 map 初始化中调用一次构造函数

标签 c++ initialization

我有一个函数可以生成 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/

相关文章:

arrays - Go:空花括号对数组初始化内存分配的影响

c++ - 用变量模拟 C++ 命令行参数

c++ - 如何将 Boost Spirit 解析的实体与其在输入流中的位置相关联?

c++ - 避免 C++ 中的非规范值

c++ - 十字架初始化的迹象是什么?

python - Python中的类初始化

c++ - 固定大小的字符串类型容器

c++ - 使用派生类的 vector 映射来调用其类的函数

c# - 如何使用泛型类型的子类初始化泛型属性?

c++ - 为什么这种隐式转换如何以及为何起作用