我想知道下面的代码是否会导致每个共享指针的引用计数增加,或者优化器是否会足够聪明地认识到我们实际上并没有复制指针,只是取消引用它。
std::map<int, std::shared_ptr<foo>> map;
...
for (auto kv : map)
kv.second->func();
kv
是一个std::pair<int, std::shared_ptr<foo>>
由于基于范围的 for 循环将返回一个 stack-allocated std::pair
,它又存储了 的副本,std::shared_ptr
我相信此时引用计数会增加。
但是,很明显这个副本只是临时的,这里的目的不是复制所有权,而只是取消引用当前拥有的副本。
但是由于创建该对会导致副作用,即引用计数的增加,这是否意味着优化器将无法优化此副本,或者编译器/优化器编写者识别此用例并能够优化出副本?