Давайте игнорируем методы и будем смотреть только на const объекты; у компилятора здесь гораздо больше возможностей для оптимизации. Если объект объявлен как const, то (ISO / IEC 14882: 2003 7.1.5.1 (4)):
За исключением того, что любой член класса объявлен
изменяемый (7.1.1) может быть изменен, любой
попытка изменить объект const
в течение своей жизни (3.8) приводит к
неопределенное поведение.
Позволяет игнорировать объекты, которые могут иметь изменяемые члены - компилятор может предположить, что объект не будет изменен, поэтому он может привести к значительной оптимизации. Эти оптимизации могут включать в себя такие вещи, как:
- включение значения объекта непосредственно в коды операций машин
- полное исключение кода, который никогда не может быть достигнут, потому что объект const используется в условном выражении, известном во время компиляции
- Развертывание цикла, если объект const контролирует количество итераций цикла
Обратите внимание, что этот материал применяется только в том случае, если фактический объект является константным - он не применяется к объектам, доступ к которым осуществляется через указатели констант или ссылки, потому что эти пути доступа могут привести к объектам, которые не являются константными (даже четко определены изменения объекты, хотя и содержат константные указатели / ссылки, если фактический объект не является константным, и вы отбрасываете константу пути доступа к объекту).
На практике, я не думаю, что существуют компиляторы, которые выполняют какую-либо значительную оптимизацию для всех типов const-объектов. но для объектов, которые являются примитивными типами (целые числа, символы и т. д.), я думаю, что компиляторы могут быть довольно агрессивными в оптимизации
использование этих предметов.