我想知道下面的代码是否会导致每个共享指针的引用计数增加,或者优化器是否足够聪明地认识到我们实际上不是< strong>复制指针,只是取消引用它。
std::map<int, std::shared_ptr<foo>> map;
...
for (auto kv : map)
kv.second->func();
kv
是 std::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/