迭代共享指针的映射而不增加引用计数?

Ste*_*mer 2 c++ map shared-ptr c++11

我想知道以下代码是否会导致每个共享指针的引用计数增加,或者优化器是否足够聪明以识别我们实际上没有复制指针,只是解除引用它.

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

...

for (auto kv : map)
    kv.second->func();
Run Code Online (Sandbox Code Playgroud)

kv 是一个 std::pair<int, std::shared_ptr<foo>>

由于for循环基于范围的将返回一个堆栈分配std::pair,而这又存储复制std::shared_ptr,我相信,引用计数将在此时增强.

但是,很明显这个副本只是暂时的,这里的意图不是复制所有权,而只是取消引用当前拥有的副本.

但是由于该对的创建导致副作用,引用计数增加,这是否意味着优化器将无法优化此副本,或者让编译器/优化器编写器识别此用例并且能够优化副本?

Nic*_*las 6

无论是否可以,优化器都无权对其进行优化.

在你的循环中,有两个相同的副本shared_ptr; 一个存储在kv另一个存储map.在这一点上有两个事实并没有解决这个问题.

如果它对您来说真的很重要,您可以使用存储引用而不是副本auto &kv.这样,kv是对存储在中的对的引用map.

  • 我认为,除非你正在处理基本类型或者你明确想要一个副本,你通常应该使用`auto&`或`const auto&` (3认同)