Компилятору никогда не требуется для встроенного вызова функции.В этом случае разрешено встроить вызов функции, потому что он знает конкретный тип c
(поскольку он не перенаправляется через указатель или ссылку, компилятор может видеть, где он был выделен какchild
).Как таковой, компилятор знает, какая реализация print()
используется, и может решить не выполнять косвенную косвенную передачу vtable, а также выбрать встроенную реализацию функции.
Однако, компилятор также может свободно не встроить его;он может вставить прямой вызов child::print()
или косвенный через vtable, если решит это сделать.
Эти оптимизации в целом сводятся к правилу «как будто» - компилятор должен вести себя как если бы выполнял полную косвенную vtable - это означает, что результат должен быть таким же, но компилятор может выбрать другой метод достижения результата, если результат тот же,Это включает в себя встраивание и т. Д.