В «Objective-C Pocket Reference» О'Рейли утверждается, что C ++ не поддерживает Dynamic Dispatch, это правда? - PullRequest
0 голосов
/ 03 января 2012

На странице 4 написано:

Objective-C решает динамически - во время выполнения - какой код будет обрабатывать сообщение путем поиска класса получателя и родительских классов.(Среда выполнения Objective C кэширует результаты поиска для повышения производительности.) В отличие от этого, компилятор C ++ создает таблицу диспетчеризации статически - во время компиляции.

Я много читал о StackOverflow иВикипедия, и достаточно сказать, что я совершенно сбит с толку относительно того, поддерживает ли C ++ Dynamic Dispatch (который, как говорят некоторые, является реализацией Dynamic Binding).

Любой, кто в состоянии прояснить разницу между Dynamic Dispatch,Динамическое связывание, и поддерживает ли C ++ один из них или оба из них?Я не эксперт по C ++ или Objective-C, я из мира Java, Python и PHP.

Ответы [ 6 ]

2 голосов
/ 03 января 2012

Динамическая диспетчеризация, упомянутая в этой книге, вероятно, является другой динамической диспетчеризацией, обычно упоминаемой в контексте C ++:

  • C ++ поддерживает динамическую диспетчеризацию в форме виртуальных функций.Соответствующие имена и параметры действительно известны во время компиляции, хотя фактическая вызванная функция зависит от динамического типа объекта.
  • Я не эксперт Objective C, но я понимаю, что вы можете динамически добавлять функции вотдельные объекты во время выполнения, которые ищутся при вызове.C ++ не поддерживает такого рода динамическую диспетчеризацию.
1 голос
/ 07 января 2014

По сути, C ++ является «частичным» динамическим с использованием ключевого слова «virtual».мы обычно называем эту функцию «поздним связыванием метода», которая решает, какой конкретный метод вызывать во время выполнения.

OC, однако, является «чистой» динамикой (не такой чистой, как javascript) благодаря своей мощной системе времени выполнения.Вы можете добавлять методы и ivars во время выполнения, не говоря уже о выборе правильного метода для вызова во время выполнения.мы обычно называем эту функцию «динамической отправкой сообщений».

Как вы можете видеть, с точки зрения вызова метода они почти одинаковы.процесс детального поиска методов отличается (c ++ смотрит в виртуальную таблицу, попытайтесь попытать счастья в списке методов своего класса), но они оба получают гибкость во время выполнения.

1 голос
/ 03 января 2012

Если «динамическая диспетчеризация» означает «изменить во время выполнения, какая функция вызывается для вызова метода, для данного объекта», тогда да: C ++ не имеет на уровне языка -структурированного собственного механизма для этого(это означает изменение во время выполнения указатель v-таблицы, или даже указатель на функцию внутри V-таблицы: возможно, заставляя реализации конкретных конструкций, но может повредить детям :-) лечить его как «порно кодирования»!)

Но в C ++ есть «динамическая диспетчеризация», основанная на наследовании классов и виртуальной функции.Вы можете прийти к максимально возможной динамической диспетчеризации, реализовав объект как совокупность подобъектов, реализовав свой собственный вариант для данного интерфейса (по сути, «образец поведения») и изменив подобъект при необходимости.

1 голос
/ 03 января 2012

Ваш заголовок отличается от вашего вопроса.

Утверждение из книги верное: виртуальная диспетчеризация C ++ выполняется во время выполнения, но таблицы диспетчеризации генерируются во время компиляции. Однако это отличается от того, что C ++ не поддерживает «динамическую диспетчеризацию». Виртуальные функции представляют собой форму динамических отправок, но существует много уровней, которые хранятся под термином «динамическая отправка».

1 голос
/ 03 января 2012

C ++ поддерживает динамическую диспетчеризацию через виртуальные функции-члены.

Я не думаю, что в этой книге говорится иначе.В нем говорится, что «компилятор C ++ создает таблицу диспетчеризации статически - во время компиляции».Это верно: таблицы диспетчеризации («vtable»), которые используются для реализации динамической диспетчеризации, создаются во время компиляции, по крайней мере, в большинстве распространенных реализаций C ++.

0 голосов
/ 03 января 2012

C ++ поддерживает динамическую диспетчеризацию с помощью виртуальных функций .

Однако он (изначально) не поддерживает двойную диспетчеризацию , чтосистема, определяющая метод для вызова на основе типа времени выполнения объекта и типа времени выполнения параметров метода.

...