gpt4 book ai didi

c++ - 两个 map 之间的分配 - 移动语义和性能

转载 作者:太空宇宙 更新时间:2023-11-04 11:44:36 26 4
gpt4 key购买 nike

给定以下简单程序:

struct A { 

map<string,size_t> someMap;
};


static map<string,size_t> getMap() {
...
}

int main (void) {
A s;
s.someMap = getMap();
}

移动语义是否发生在这里?那个任务有效吗?如果我有一张充满数据的 map ,然后为它分配一张全新的 map ,会怎样?使用 C++11 移动语义是否有效?

提前致谢

最佳答案

在您的情况下,有两个潜在 拷贝/移动。发生的情况如下:

输入 getMap() 时,堆栈内存分配给一个临时的 map<string, size_t> ,我们称它为tmp .正如对 OP 的评论中所解释的那样,getMap()创建本地 map<string, size_t>我们称之为 orig .

当执行到return orig;时,它会触发来自 orig潜在拷贝至 tmp .第二个潜在拷贝来自tmps.someMap .

标准(C++98/03 和 C++11)允许从 orig 复制至 tmp通过放置 orig 来省略(这是 Tristan Brindle 在对 OP 的评论中提到的返回值优化)在为 tmp 保留的内存中.

请注意,标准允许 RVO 但不强制执行。然而,主要的编译器(gcc、clang VS 和 Intel)实现了 RVO,并且没有复制。如果您的编译器未实现 RVO,则将从 orig 进行移动而不是复制至 tmp (除非您的编译器不兼容 C++11)。

然后从tmps.someMap C++11 编译器必须执行移动而不是复制。在这里,我们无法避免复制/移动,因为 s.someMap之前构造,现在分配给 getMap() 的结果.如果你有,情况会有所不同

map<string,size_t> someOtherMap = getMap();

在这种情况下,复制或移动自 tmpsomeOtherMap也可以省略。

关于c++ - 两个 map 之间的分配 - 移动语义和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20190195/

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