В программировании различают run time и compile time. То, что известно компилятору в compile time, следует тогда же и делать; тогда программа будет работать быстрее. Например, полиморфный вызов виртуальной функции происходит медленнее, чем вызов статической: ее адрес надо сначала найти в vtable.
Между тем, значительное количество проектов, формально являющихся объектно-ориентированными, используют полиморфизм в следующем урезанном виде. Пусть, например, мы моделируем солнечную систему. В начале работы программа читает конфигурационный файл и инстанциирует из него некоторое количество объектов, имплементирующих бизнес-логику Солнца, Земли, Луны, планет, американских разведывательных спутников и проч. Все они являются потомками абстрактного класса Небесное Тело. После этого новые объекты больше не создаются, а существующие не уничтожаются; движок только полиморфно вызывает у каждого из них по очереди функцию "сделать следующий ход", пока не будет достигнут конец вселенной или не будет нажата комбинация клавиш Ctrl-C.
Легко видеть, что полиморфизм тут используется только для удобства организации и расширения кода путем добавления все новых и новых небесных тел, а также потому, что людей, пишущих код именно таким образом, легче нанять. Конкретно, после того, как конфигурационный файл прочитан и все необходимые объекты инстанциированы, адреса виртуальных функций, специфичных для каждого конкретного указателя-на-небесное-тело, оказываются навсегда известными. В такой ситуации естественнее различать compile time, run time before reading config, и run time after reading config.
Соотвественно, пропатченный рантайм C++ должен, по окончании чтения конфига, пройтись по коду, найти в нем все поиски виртуальных функций в vtable, и хардкоднуть на их место известные к тому времени адреса в памяти.
Между тем, значительное количество проектов, формально являющихся объектно-ориентированными, используют полиморфизм в следующем урезанном виде. Пусть, например, мы моделируем солнечную систему. В начале работы программа читает конфигурационный файл и инстанциирует из него некоторое количество объектов, имплементирующих бизнес-логику Солнца, Земли, Луны, планет, американских разведывательных спутников и проч. Все они являются потомками абстрактного класса Небесное Тело. После этого новые объекты больше не создаются, а существующие не уничтожаются; движок только полиморфно вызывает у каждого из них по очереди функцию "сделать следующий ход", пока не будет достигнут конец вселенной или не будет нажата комбинация клавиш Ctrl-C.
Легко видеть, что полиморфизм тут используется только для удобства организации и расширения кода путем добавления все новых и новых небесных тел, а также потому, что людей, пишущих код именно таким образом, легче нанять. Конкретно, после того, как конфигурационный файл прочитан и все необходимые объекты инстанциированы, адреса виртуальных функций, специфичных для каждого конкретного указателя-на-небесное-тело, оказываются навсегда известными. В такой ситуации естественнее различать compile time, run time before reading config, и run time after reading config.
Соотвественно, пропатченный рантайм C++ должен, по окончании чтения конфига, пройтись по коду, найти в нем все поиски виртуальных функций в vtable, и хардкоднуть на их место известные к тому времени адреса в памяти.
no subject
Date: 2012-06-08 01:37 am (UTC)no subject
Date: 2012-06-08 03:22 am (UTC)no subject
Date: 2012-06-08 01:42 am (UTC)no subject
Date: 2012-06-08 07:04 pm (UTC)no subject
Date: 2012-06-08 10:23 pm (UTC)Также и здесь - вдруг случайно окажешься специалистом по рентгеновской кристаллографии.
no subject
Date: 2012-06-08 01:53 am (UTC)no subject
Date: 2012-06-08 03:34 am (UTC)no subject
Date: 2012-06-08 07:44 am (UTC)no subject
Date: 2012-06-08 07:58 am (UTC)no subject
Date: 2012-06-08 11:04 pm (UTC)Андрей Александреску. Современное проектирование на С++, или Как я выебал ёжика.
no subject
Date: 2012-06-08 10:14 am (UTC)no subject
Date: 2012-06-08 10:45 am (UTC)no subject
Date: 2012-06-08 06:18 am (UTC)Итак, для начала - файл конфига будет расширение cpp. (Дальше, надеюсь, и так понятно =))
no subject
Date: 2012-06-08 10:11 am (UTC)no subject
Date: 2012-06-08 05:49 pm (UTC)Вопрос - должен ли это делать компилятор?
Может быть. А может быть и нет. Надо weigh benefits against costs. SMC может вызвать разные CPU caching/parallelization issues, это надо делать аккуратно. Кроме того, ваш конкретный use case не кажется достаточно общим. Если бы runtime умел с точностью определять life span of objects, он мог бы временно заменять виртуальные вызовы на статические, или даже на jump'ы. Но это по сложности уже близко к тому, чтобы, скажем, уметь распознавать неэффективные алгоритмы, и на лету заменять их на более эффективные. Если мы столько работы отдаём компилятору, то это перестаёт пахнуть C++-ом :) Фишка C++-а в том, что на нём пишут люди, которые хорошо понимают, как оно будет работать, и даже если есть оптимизации, программист знает про них, и специально пишет код в рассчёте на них.
no subject
Date: 2012-06-08 05:54 pm (UTC)no subject
Date: 2012-06-08 05:51 pm (UTC)no subject
Date: 2012-06-08 05:54 pm (UTC)no subject
Date: 2012-06-09 09:40 am (UTC)no subject
Date: 2012-06-17 12:53 am (UTC)no subject
Date: 2012-06-17 12:00 pm (UTC)no subject
Date: 2012-06-20 01:56 pm (UTC)no subject
Date: 2012-06-20 02:23 pm (UTC)no subject
Date: 2012-06-20 02:28 pm (UTC)no subject
Date: 2012-06-20 02:36 pm (UTC)no subject
Date: 2012-06-20 04:46 pm (UTC)