cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Стандартизировать девиртуализацию вызовов #540

Closed Izaron closed 1 year ago

Izaron commented 1 year ago

Нужно стандартизировать девиртуализацию - то есть оптимизацию, когда делается явный вызов метода объекта полиморфического класса без диспетчеризации (т.е. просмотра vtable), если компилятор может доказать, что 100% будет вызван именно этот метод.

Условия для девиртуализации строгие - например в одном из кейсов класс должен быть помечен final, и мы должны иметь дело со ссылкой на этот класс. Об этом круче всего написано в этой статье - https://blog.feabhas.com/2022/11/using-final-in-c-to-improve-performance/

Самый важный для меня кейс - это девиртуализация вызова виртуального деструктора для объекта на стеке. Для всех объектов на стеке можно девиртуализовать все вызовы, в том числе деструктор. Если это стандартизировать, это даст возможность компилятору автоматически делать деструктор виртуальным (если в классе есть виртуальные методы), это уберет вероятность UB. Тогда не будет такой тупости, что все пишут virtual ~Foo() = default, это сделает компилятор за них.

У меня есть микро-статья на эту тему - https://t.me/cxx95/67.

Izaron commented 1 year ago

UPD: мне подсказали, что новый виртуальный метод сломает ABI, поэтому это не примут