Во-первых, было упомянуто проприетарное расширение Borland для C++, Dynamic Dispatch Virtual Tables (DDVT), и вы можете кое-что прочитать об этом в файле с именем DDISPATC.ZIP. У Borland Pascal были как виртуальные, так и динамические методы и Delphi представила еще один синтаксис "сообщения", похожий на динамический, но для сообщений. На данный момент я не уверен, что у Borland C++ такие же функции. Ни в Pascal, ни в Delphi не было множественного наследования, поэтому Borland C++ DDVT мог отличаться от Pascal или Delphi.
Во-вторых, в 1990-х и чуть раньше были эксперименты с разными объектными моделями, и Borland была не самой передовой. Лично я считаю, что закрытие IBM SOMobjects нанесло миру ущерб, от которого мы все до сих пор страдаем. Перед закрытием SOM проводились эксперименты с компиляторами Direct-to-SOM C++. Таким образом, вместо способа вызова методов C++ используется SOM. Он во многом похож на C++ vtable, за несколькими исключениями. Во-первых, чтобы предотвратить проблему хрупкого базового класса, программы не используют смещения внутри vtable, потому что они не знают это смещение. Это может измениться, если базовый класс представит новые методы. Вместо этого вызывающие объекты вызывают преобразователь, созданный во время выполнения, который содержит эти знания в своем ассемблерном коде. И есть еще одно отличие. В C++ при использовании множественного наследования объект может содержать несколько VMT IIRC. В отличие от C++, каждый объект SOM имеет только один VMT, поэтому код отправки должен отличаться от «call dword ptr [VMT+offset]».
Существует документ, связанный с SOM, Двоичная совместимость между выпусками в SOM. Вы можете найти сравнение SOM с другими проектами, о которых я мало знаю, например Delta/C++ и Sun ОБИ. Они решают подмножество проблем, которые решает SOM, и при этом они также несколько подправили код вызова.
Недавно я нашел достаточно фрагмента компилятора Visual Age C++ v3.5 для Windows, чтобы заставить все работать и фактически коснуться его. Большинство пользователей вряд ли получат виртуальную машину OS/2 только для того, чтобы играть с DTS C++, но наличие компилятора Windows — это совсем другое дело. VAC v3.5 — первая и последняя версия, поддерживающая функцию Direct-to-SOM C++. VAC v3.6.5 и v4.0 не подходят.
- Загрузите пакет исправлений 9 для VAC 3.5 с FTP-сервера IBM. Этот пакет исправлений содержит много файлов, поэтому вам даже не нужен полный компилятор (у меня дистрибутив 3.5.7, но пакет исправлений 9 был достаточно большим, чтобы провести некоторые тесты).
- Распаковать в эл. г. C:\домой\ОКТАГРАММА\DTS
- Запустите командную строку и выполните там последующие команды
- Выполнить: set SOMBASE=C:\home\OCTAGRAM\DTS\ibmcppw
- Выполнить: C:\home\OCTAGRAM\DTS\ibmcppw\bin\SOMENV.BAT
- Выполнить: cd C:\home\OCTAGRAM\DTS\ibmcppw\samples\compiler\dts
- Выполнить: nmake clean
- Выполнить: Nmake
- hhmain.exe и его dll находятся в разных каталогах, поэтому надо заставить их как-то найти друг друга; так как я проводил несколько экспериментов, я один раз выполнил "set PATH=%PATH%;C:\home\OCTAGRAM\DTS\ibmcppw\samples\compiler\dts\xhmain\dtsdll", но вы можете просто скопировать dll рядом с hhmain. EXE
- Выполнить: hhmain.exe
У меня есть вывод таким образом:
Local anInfo->x = 5
Local anInfo->_get_x() = 5
Local anInfo->y = A
Local anInfo->_get_y() = B
{An instance of class info at address 0092E318
}
person
OCTAGRAM
schedule
07.12.2014
vptr
будут хранить всю таблицу функций в каждом объекте. В некоторых очень специфических сценариях это может быть полезно, так как во время вызова виртуальной функции такой подход экономит дополнительную косвенную память. При разработке драйверов это может быть критично: такая косвенность может привести к доступу к выгружаемой памяти. - person valdo   schedule 04.12.2010