По крайней мере, в C++ полиморфные объекты должны быть в виде указателей или ссылок. Иногда это предотвращает возможность помещать их в переменные стека или типы списка, вам нужно использовать List. Переменные хранилища резервные динамические распределения и т. Д.
Вызов Poly.vmethod() всегда разрешается во время компиляции, даже если vmethod() является виртуальным, а Poly-> vmethod() - с таблицей виртуальных методов. (Ну, если этот метод является виртуальным, он должен быть полиморфным. Статические методы статически разрешаются в любом случае.)
Оптимизация возвращаемого значения (RVO) - это еще один трюк, который не имеет места при возврате указателей или ссылок. RVO обычно реализуется путем передачи скрытого параметра: указателя на область памяти, заполненного «возвращенным» объектом. Размер и тип этого региона должны быть прекрасно известны во время компиляции.
Конечно, вставки. И инициализированные «константы». Не могу придумать ничего другого. –
Я бы сказал, что эти пропущенные оптимизации - это последствия неудачной вставки. Я думаю, что это самая большая потеря, и это, по-видимому, самая большая мотивация девиртуализации. – Ali