Полезность const (C ++) - PullRequest
       10

Полезность const (C ++)

5 голосов
/ 15 января 2010

Я - постоянный злодей, и я стремлюсь сделать все как можно более постоянным.

Я попытался просмотреть различные выходные данные дизассемблирования из константной и неконстантной версий функций, но пока не заметил заметного улучшения. Я предполагаю, что в настоящее время компиляторы способны делать умные вещи с неконстантными функциями, которые технически могут быть константными.

Есть ли еще случаи, когда const полезен на уровне машины? Есть примеры?

Ответы [ 6 ]

18 голосов
/ 15 января 2010

Основное использование const заключается не в создании лучшего кода, а в том, чтобы защитить вас от самого себя, гарантируя, что вы случайно не измените то, к чему не стремились.

12 голосов
/ 15 января 2010

const довольно редко помогает компилятору оптимизироваться.Вы должны иметь в виду, что const_cast может использоваться где угодно для удаления константности из объекта (хотя на самом деле изменение результирующего объекта не всегда четко определено, это в некоторых случаях, и поэтому компилятор должен быть осторожнымо предположении, что если объект const передан в функцию, он не будет изменен)

Аналогично, ключевое слово mutable все портит.Вы можете передать объект const функции, но что если этот объект содержит поле mutable?

Компилятору нужно проделать большую работу, чтобы убедиться в том, что можно с уверенностью предположить, что объект действительно постоянен - ​​и к тому времени, когда он выполнит всю эту проверку, ключевое слово const не имеет большого значенияпотому что он мог бы провести такой же анализ обычного неконстантного объекта, а также определить, что он не изменяется и может рассматриваться как константа.

Я не скажу, что нетнесколько граничных случаев, когда ключевое слово const может включать новую оптимизацию, но в целом const - это не оценка производительности, а корректность.Используйте его, чтобы ловить больше ошибок во время компиляции, а не ускорять ваш код.

9 голосов
/ 15 января 2010

Насколько я знаю, единственный эффект маркировки функции const - это возможность вызова функции для объекта const. Оптимизационных преимуществ нет.

У Херба Саттера есть статья, в которой подробно рассматриваются const и оптимизация:

Единственная область, которая const полезна на машинном уровне, - это применение к данным - константные данные могут быть помещены в недоступную для записи память.

2 голосов
/ 15 января 2010

Это не совсем прямой ответ на подробную версию вашего вопроса, но он соответствует вопросу заголовка.

Мне также нравится использовать const довольно агрессивно, отчасти потому, что я думаю, что есть небольшое изменение, которое улучшит производительность, но в основном потому, что оно уменьшает количество ошибок и улучшает взаимодействие.

  1. Наличие методов const дает пользователям свободу иметь полезные объекты const.
  2. Наличие const-объектов позволяет авторам библиотеки кратко сообщать пользователям, может ли функция или метод изменить входные параметры.
  3. Наличие const объектов позволяет вам кричать на вас, если вы случайно сделаете что-то, что изменится, и возразите, что вы не хотите изменять.
2 голосов
/ 15 января 2010

Цель const в первую очередь архитектурная. Когда вы объявляете что-то как const, вы должны думать о том, что оно представляет: что-то, что не может измениться.

1 голос
/ 15 января 2010

Я следую вашей стратегии и вижу ее главную полезность для человека. Я принял очень функциональный стиль во многих моих программах, и const помогает реализовать это и иллюстрирует это другим программистам, которые могут читать мой код.

По правде говоря, некоторые новые атрибуты функций, которые будет поддерживать C ++ 0x, будут немного более полезными для компиляторов. Знание того, что результат функции зависит исключительно от ее аргументов и не следует никаким указателям, переданным ей, означает, что вызовы функции могут подвергаться CSE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...