Несколько дней назад мне довелось посмотреть очень интересную презентацию Стефана Т. Лавейжа, в которой упоминается оптимизация «Мы знаем, где вы живете» (извините за использование аббревиатуры в заголовке вопроса, ТАК предупредил меня, что в противном случае вопрос мог бы быть закрыт), и эту прекрасную презентацию Херба Саттера о машинной архитектуре.
Коротко говоря, оптимизация «Мы знаем, где вы живете» заключается в размещении счетчиков ссылок в том же блоке памяти, что и объект, создаваемый make_shared, что приводит к выделению одной памяти вместо двух и делаетshared_ptr более компактным. (Примечание для читателей: это неверная интерпретация WKWYL)
Однако после суммирования того, что я узнал из двух презентаций выше, я начал задаваться вопросом, не может ли оптимизация WKWYL ухудшить производительность в случае, если к Shared_ptr обращаются несколько потоков, работающих на разных ядрах.
Если счетчики ссылок близки к реальному объекту в памяти, то с большей вероятностью они будут выбраны в ту же строку кэша, что и сам объект. Это, в свою очередь, если бы я правильно усвоил урок, было бы более вероятно, что потоки будут замедляться, конкурируя за одну и ту же строку кэша, даже если в этом нет необходимости.
Предположим, что одному потоку необходимо обновить счетчик ссылок несколько раз (например, при копировании разделяемого_ptr), в то время как другим просто нужен доступ к указанному объект: не замедлит ли это выполнение всех потоков, заставляя их конкурировать за одну и ту же строку кэша?
Если бы счетчик ссылок находился где-то в другом месте в памяти, я бы сказал, что конфликты возникнут с меньшей вероятностью.
Является ли это хорошим аргументом против использования make_shared() в аналогичных случаях (пока это реализует оптимизацию WKWYL, конечно)? Или в моих рассуждениях есть ошибка?
Подробнее здесь: https://stackoverflow.com/questions/143 ... -some-mult