Почему std::shared_ptr иногда тормозит даже без потоков?
На вид это просто умный указатель. Кажется, что раз всё в одном потоке — накладных расходов почти нет.
Но у
Из-за этого можно получить просадку там, где её не ждёшь: циклы, коллбеки, мелкие функции.
Если владение не шарится — лучше
🔥 В hot path не передавай
📣 C++ Ready | #совет
На вид это просто умный указатель. Кажется, что раз всё в одном потоке — накладных расходов почти нет.
Но у
shared_ptr есть счётчик ссылок в control block. Когда ты передаёшь shared_ptr по значению, на входе и выходе функции делается refcount++/refcount-- (обычно атомарно). В горячем коде это превращается в лишнюю работу, хотя логически ты “просто передал указатель”.Из-за этого можно получить просадку там, где её не ждёшь: циклы, коллбеки, мелкие функции.
Если владение не шарится — лучше
unique_ptr или значение. Если шаринг нужен — просто не копируй shared_ptr без причины.void log(std::shared_ptr<Foo> p); // копия -> refcount++/--
void hot(const std::shared_ptr<Foo>& p) {
for (int i = 0; i < 1'000'000; ++i)
log(p); // лучше: log(const std::shared_ptr<Foo>&)
}
shared_ptr по значению — используй const std::shared_ptr<T>& (или unique_ptr, если шаринга нет).Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤5👍3