Если ваше приложение передает около 700 байтовых XML-сообщений, которые могут содержаться в 65-байтовых сообщениях протокола Google или 85-байтовых сообщениях ASN.1, то это, вероятно, не имеет значения. Но если он обрабатывает миллион штук в секунду, я бы не отказался от затрат на добавление 2 циклов полной записи с изменением чтения (RMW) к передаче указателя.
Полная запись с изменяемым чтением имеет порядок 50 нс, поэтому два - 100 нс. Эта стоимость равна стоимости Lock-Inc и Lock-Dec - так же, как 2 CAS. Это половина резервирования и выпуска критической секции Windows. Это сравнивается с одним нажатием одного цикла машины (400 секунд PICO на машине с частотой 2,5 ГГц)
И это даже не включает другие затраты на аннулирование строки кэша, которая фактически содержит счетчик, влияние блокировки BUS на другие процессоры и т. Д. И т. Д.
Передача умных указателей по константной ссылке почти ВСЕГДА предпочтительнее. Если вызываемый объект не создает новый общий указатель, когда он хочет гарантировать или контролировать время жизни получателя , тогда это ошибка в вызываемом . Для того, чтобы спокойно и осторожно передавать поток, подсчитывая умные указатели по значению, нужно просто повысить производительность.
Использование указателей с подсчетом ссылок, без сомнения, упрощает время жизни, но передача общих указателей по значению, чтобы попытаться защитить от дефектов в вызываемом объекте, - полная и полная ерунда.
Чрезмерное использование подсчета ссылок может за короткое время превратить программу svelte, которая может обрабатывать 1 мм сообщений в секунду (mps), в толстую, которая обрабатывает 150k mps на том же оборудовании. Внезапно вам понадобится половина стойки серверов и 10000 долларов в год на электроэнергию.
Вам всегда лучше, если вы можете управлять временем жизни ваших объектов без подсчета ссылок.
Пример простого улучшения - скажем, если вы собираетесь разветвлять объект, и вы знаете ширину приращения разветвления (скажем, n) на n, а не индивидуальное приращение при каждом разветвлении.
Кстати, когда процессор видит префикс блокировки, он действительно говорит: «О, нет, это повредит».
При всем этом я согласен со всеми, что вы должны проверить горячую точку.