std :: function для аргумента метода, копии или shared_ptr?

Я пытаюсь использовать std :: function в качестве обработчика обратного вызова.

Такой как это,

void some_job( int arg1, std::function<void(int)> & callback )
{
callback( process(arg1) );
}

В этом примере я использовал передачу по ссылке.

Но проблема в том, что я не могу гарантировать std::function объект callback все еще существует, потому что функция, выполняемая в асинхронном контексте в моей программе.

Поэтому мне приходится управлять жизненным циклом объекта-функции, и я подумал о двух способах.

  1. используя передачу по значению (копия)

  2. с помощью std::shared_ptr

Я знаю размер std::function фиксируется в 24 байта в моей системе и std::shared_ptr это 8.

Но копирование std::shared_ptr вызвать дополнительные накладные расходы на управление счетчиком ссылок.
(Кроме того, я не могу найти какой-либо умный и аккуратный способ сделать объект shared_ptr из std::function.)

Какой способ будет лучше по производительности?

2

Решение

Если вы находитесь в так критично ко времени часть вашей программы, которая беспокоит вас, быстрее ли будет копировать 24 байта или 8 байтов + разделить накладные расходы, вам придется реализовать оба варианта и использовать профилировщик, чтобы выяснить, что лучше в вашем конкретном сценарии. И в таком случае, вы должны также рассмотреть совершенно другой подход, который бы обходил виртуальный вызов, вероятно, скрытый внутри std::function::operator(),

В противном случае я бы просто взял параметр по значению и позволил оптимизатору выполнить свою работу.

3

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

Других решений пока нет …

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