Использование make_shared с shared_ptr & lt; T & gt; s полезно только для T & lt; 56 байт?

Как я понимаю, если вы используете std::make_shared он создает объект подсчета ссылок одновременно с базовым объектом.

Однако, если указатель объекта на smart_ptr больше 56 байт, разве счетчик ссылок в конечном итоге не окажется в другой строке кэша (поскольку строки кэша составляют 64 байта)?

2

Решение

Замечания: кэш-линии Не одинаковый размер на каждой платформе, и размер указателя не всегда одинаков. Будьте осторожны, делая предположения на основе чисел в вопросе.


Зачем std::make_shared?

std::make_shared существует по трем (основным) причинам;

  • Средства для выделения памяти для обоих исх счетчик, и объект, отслеживаемый сразу (как правило, выделение памяти стоит дорого);
  • безопасный для исключения способ создания и инициализации std::shared_ptr;
  • и краткость кода.

Как насчет строки кэша и std::make_shared?

Честно говоря, это выходит за рамки и цели std::make_shared, Стандарт C ++ не имеет представления о том, что «кэш-линии«, и дизайн, описанный в стандарте, написан так, что он не нацелен на какую-либо конкретную платформу.

Даже если будет * cache-misse * s, потому что исх счетчик и объект не может поместиться внутри того же кэш-линии, у нас все еще есть все преимущества, перечисленные выше, и std::make_shared по-прежнему выполняет работу, которую должен решить.

Замечания: Можно сказать, что «Хранение реф-счетчика и объекта близко друг к другу в памяти» это просто сладкий маленький бонус.

6

Другие решения


По вопросам рекламы [email protected]