Подтвердить что ты не робот

Используется ли окончательная версия для оптимизации в С++?

class A {
public:
    virtual void f() = 0;
};

class B : public A {
public:
    void f() final override { };
};

int main() {
    B* b = new B();
    b->f();
}

В этом случае компилятор должен продолжать поиск v-таблицы для b->f(); или может вызвать B::f() напрямую, потому что он был помечен final?

4b9b3361

Ответ 1

Окончательно используется для оптимизации в С++?

Это может быть и есть.

Как уже отмечалось, он уже используется; см. здесь и здесь, показывающий сгенерированный код для переопределить с помощью и без final.

Оптимизация в этих строках будет относиться к "де виртуализации" виртуальных вызовов. Это не всегда сразу влияет на final класса или метода. Хотя они предлагают помощь для определения этого, применяются обычные правила виртуальных функций и иерархии классов.

Если компилятор может определить, что во время выполнения всегда будет вызываться конкретный метод (например, с учетом примера OP с автоматическим объектом), он может применять такую ​​оптимизацию в любом случае, независимо от того, является ли метод final или нет.

Оптимизации подпадают под правило as-if, которые позволяют компилятору применять любое преобразование, если наблюдаемое поведение является как-бы исходный код был выполнен.