次のコードが各共有ポインターの参照カウントの増加につながるかどうか、またはオプティマイザーがポインターを実際にコピーしているのではなく、逆参照しているだけであることを認識できるほど賢いかどうかを知りたいです。
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
ただし、このコピーが一時的なものであることは明らかであり、ここでの意図は所有権をコピーすることではなく、現在所有されているコピーを逆参照することです。
しかし、ペアの作成は参照カウントの増加という副作用を引き起こすため、これはオプティマイザがこのコピーを最適化できないことを意味しますか、それともコンパイラ/オプティマイザの作成者にこのユースケースを認識させ、コピーを最適化するには?