Я пытаюсь использовать std :: function в качестве обработчика обратного вызова.
Такой как это,
void some_job( int arg1, std::function<void(int)> & callback )
{
callback( process(arg1) );
}
В этом примере я использовал передачу по ссылке.
Но проблема в том, что я не могу гарантировать std::function
объект callback
все еще существует, потому что функция, выполняемая в асинхронном контексте в моей программе.
Поэтому мне приходится управлять жизненным циклом объекта-функции, и я подумал о двух способах.
используя передачу по значению (копия)
с помощью std::shared_ptr
Я знаю размер std::function
фиксируется в 24 байта в моей системе и std::shared_ptr
это 8.
Но копирование std::shared_ptr
вызвать дополнительные накладные расходы на управление счетчиком ссылок.
(Кроме того, я не могу найти какой-либо умный и аккуратный способ сделать объект shared_ptr из std::function
.)
Какой способ будет лучше по производительности?
Если вы находитесь в так критично ко времени часть вашей программы, которая беспокоит вас, быстрее ли будет копировать 24 байта или 8 байтов + разделить накладные расходы, вам придется реализовать оба варианта и использовать профилировщик, чтобы выяснить, что лучше в вашем конкретном сценарии. И в таком случае, вы должны также рассмотреть совершенно другой подход, который бы обходил виртуальный вызов, вероятно, скрытый внутри std::function::operator()
,
В противном случае я бы просто взял параметр по значению и позволил оптимизатору выполнить свою работу.
Других решений пока нет …