向std::map插入元素时,为何拷贝构造函数会被调用两次?
解答
咱们一步步拆解两次拷贝构造的触发场景:
第一次拷贝:构造
std::pair时的拷贝
代码里的m.insert({"hello", C(42, 'c')});会先隐式构造一个std::pair<const std::string, C>对象。这里你手动创建的临时C对象(对应输出里的ctor),会被拷贝到这个pair的第二个成员位置,这就触发了第一次拷贝构造。第二次拷贝:插入map内部节点时的拷贝
std::map底层是红黑树实现,插入元素时需要把构造好的pair对象拷贝到红黑树的节点中存储,这就引发了第二次拷贝构造函数的调用。
额外提示:优化消除拷贝
如果开启编译器优化(比如添加-O2编译参数),编译器会通过拷贝消除和返回值优化把这两次拷贝都省略掉,最终只会看到一次ctor输出。你可以试试用g++ -g -O2 ./main.cpp编译运行,就能验证这个效果。
内容的提问来源于stack exchange,提问作者StoneThrow
相关产品推荐
相关产品推荐

