Указатели на функции-члены - только адрес? - PullRequest
0 голосов
/ 19 апреля 2011

http://www.codeproject.com/KB/cpp/fastdelegate2.aspx

Во втором параграфе введения в вышеприведенной статье говорится: «Это связано с дорогим выделением кучи памяти, необходимой для хранения функции-члена и связанного объекта, для которого выполняется вызов функции-члена». .. Я не понимаю это? Нужно ли копировать и хранить объект и функцию-член? Разве он не хранит только адрес функции-члена?

Ответы [ 2 ]

3 голосов
/ 19 апреля 2011

Boost. Функция более общая и мощная, чем необработанные указатели функций: они могут хранить все, что можно вызвать с определенной сигнатурой. Однако с такой гибкостью связаны затраты на хранение и время выполнения.

Раздел Прочие заметки документации Boost.Function говорит об этом немного подробнее, но подведу итог:

  • Объект Boost.Function хранит внутренний указатель на функцию-член и два указателя данных.
  • Может потребоваться выделение кучи при хранении функтора, превышающего определенный размер.
  • Вызов объекта Boost.Function приводит к одному или двум вызовам через указатель на функцию, в зависимости от того, что именно было сохранено.

Сказав все это, я широко использовал Boost.Function и никогда не сталкивался с ситуацией, когда его затраты на хранение или время выполнения фактически обнаруживались при профилировании, поэтому, важно ли что-то из этого или нет, будет зависеть от вашего фактического использования .

0 голосов
/ 19 апреля 2011

Нет , вы не можете вызывать функцию-член только с указателем на метод.Причина в том, что методы вызываются в context (this), объекте, для которого вызывается метод.Если у вас есть только указатель на функцию-член, вы не можете знать, к какому объекту должен применяться метод.Однако, если функция-член static, тогда у нее NOT есть контекст, потому что статические функции-члены можно вызывать без создания экземпляра объекта.

Таким образом, для вызова функции-члена вынужен указатель на функцию, PLUS некоторая ссылка на объект, определяющий контекст, в котором будет происходить вызов функции-члена.

Отвечает ли это на ваш вопрос?

...