c++ - 在不增加引用计数的情况下迭代共享指针映射?

标签 c++ dictionary c++11 shared-ptr

我想知道下面的代码是否会导致每个共享指针的引用计数增加,或者优化器是否足够聪明地认识到我们实际上不是< strong>复制指针,只是取消引用它。

std::map<int, std::shared_ptr<foo>> map;

...

for (auto kv : map)
    kv.second->func();

kvstd::pair<int, std::shared_ptr<foo>>

由于基于范围的 for 循环将返回堆栈分配的 std::pair ,它又存储了 std::shared_ptr拷贝 , 我相信此时引用计数会增加。

但是,很明显这个拷贝只是临时的,这里的目的不是复制所有权,而是取消引用当前拥有的拷贝。

但是由于创建对会导致副作用,即引用计数的增加,这是否意味着优化器将无法优化此拷贝,或者让编译器/优化器作者认识到这个用例并能够优化拷贝?

最佳答案

优化器没有权利对其进行优化,无论是否可以。

在你的循环中,有两个相同的 shared_ptr 拷贝;一个存储在 kv 中,另一个存储在 map 中。无法回避的事实是,此时有两个。

如果它真的对您很重要,您可以使用 auto &kv 存储一个引用而不是一个拷贝。这样,kv 就是对存储在 map 中的对的引用。

关于c++ - 在不增加引用计数的情况下迭代共享指针映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11534028/

相关文章:

c++ - 创建 C++ 模板函数的 C 符号别名

Python:多维字典到数组

c++ - 不断收到错误 ' no match for ' operator>>' ;

c++ - 命名空间中的枚举

c++ - 使用 'this' 关键字从 vector 中删除元素

C++ OOP 仅授予对某些类的访问权限

c++ - Makefile 创建两个库——一个依赖另一个

python - 将列表添加为 pandas Dataframe 中的值

objective-c - 以编程方式访问 iOS 字典

c++ - 类的全局对象和静态成员