Влияние виртуального наследования на производительность

Одна из возможностей к CP/M-86 версия Поли-Паскаля (одноуровневый элемент к Turbo Pascal) состояла в том, чтобы заменить "use-bios-to-output-characters-to-the-screen" средство стандартной программой машинного языка, которой в сущности дали x, и y и строку для помещения там.

Это позволило обновлять экран очень, намного быстрее, чем прежде!

была комната в двоичном файле для встраивания машинного кода (несколько сотен байтов) и был другой материал там также, таким образом, было важно сжать как можно больше.

Это поворачивается, что, так как экран был 80x25, обе координаты могли поместиться в байт каждый, таким образом, оба могли поместиться в двухбайтовое слово. Это позволило делать вычисления, необходимые в меньшем количестве байтов, так как сингл добавляет, мог управлять обоими значениями одновременно.

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

26
задан curiousguy 17 July 2016 в 02:05
поделиться

2 ответа

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

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

То, оказывает ли это какое-либо видимое влияние на производительность в реальных приложениях, зависит от многих вещей:

  • Есть ли у виртуальных баз элементы данных вообще? Часто это абстрактные базовые классы, которые должны быть получены из виртуальных источников, а абстрактные базы, в которых есть какие-либо члены данных, часто так или иначе являются запахом кода.

  • Предполагая, что у вас есть виртуальные базы с членами данных, к ним обращаются по критическому пути ? Если пользователь, нажимающий на какую-либо кнопку в графическом интерфейсе, приводит к нескольким десяткам дополнительных косвенных указаний, никто не заметит.

  • Какой будет альтернатива , если избежать виртуальных баз? Мало того, что дизайн может быть хуже, также вероятно, что альтернативный дизайн также оказывает влияние на производительность. Он должен достичь той же цели, ведь и TANSTAAFL. Затем вы обменяли одну потерю производительности на другую плюс худший дизайн.


Дополнительное примечание: взгляните на статью Стэна Липпмана «Внутри объектной модели C ++» , которая довольно подробно отвечает на такие вопросы.

27
ответ дан 28 November 2019 в 07:50
поделиться

Вы уверены, что имеете в виду виртуальное наследование? Если это так, это соответствует стоимости обычного вызова виртуальной функции. Поиск в цепочке vtable идет по указанному пути.

Вы сказали, что это было при запуске. Затраты на диск (от простой загрузки кода в память), вероятно, потребуют на порядки больше времени, чем полдюжины инструкций или около того для поиска в vtable. Я был бы несколько удивлен, если бы вы могли профилировать это и обнаружить разницу.

0
ответ дан 28 November 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: