Полноценность константы (C++)

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

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

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

5
задан Eddie Parker 15 January 2010 в 01:18
поделиться

6 ответов

Возможно, было упростить реализацию. Если вы разработаете класс, который будет наследственным пользователям класса, то у вас есть совершенно новый набор случаев использования, чтобы учитывать ваш дизайн. Что произойдет, если они сделают это или что с X предпринимаемым полем? Делать его окончательным, они могут сосредоточиться на правильной работе общедоступного интерфейса, и убедитесь, что это твердое.

-121--3474500-

Насколько я знаю, единственным эффектом маркировки функции Const состоит в том, чтобы позволить вызванию функции на объекте . Там нет преимуществ оптимизации.

Herb Satter имеет статью, которая обсуждает Const и оптимизацию в глубине:

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

9
ответ дан 18 December 2019 в 05:16
поделиться

Почему бы просто не сделать:

String input = scan.nextLine();
if(!input.matches("\\d+")) { // regex for 1 or more digits
    System.err.println("Input must be at least 1 digit!");
    continue; // goes back to the top of the loop
}
double dbl = Double.valueOf(input);

FYI, фактический regex для двойной точности будет [цифра] [.] [цифра] с [.] [цифра] является необязательным.

-121--3456782-

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

18
ответ дан 18 December 2019 в 05:16
поделиться

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

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

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

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

12
ответ дан 18 December 2019 в 05:16
поделиться

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

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

  1. Наличие методов COND позволяет пользователям свободу полезных течений объектов.
  2. Наличие Const объектов позволяет писателям библиотеки кратко обмениваться пользователями, независимо от того, может ли функция или метод изменять входные параметры.
  3. Наличие Const объектов позволяет вам иметь компилятор yell у вас, если вы случайно сделаете что-то, что будет изменять, и объект, который вы не хотите изменять.
2
ответ дан 18 December 2019 в 05:16
поделиться

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

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

1
ответ дан 18 December 2019 в 05:16
поделиться

Учитывая файл .config со следующим контентом:

<configuration>
 <thingy>
  <stuff>
   <item type='value' />
   <item type='value2' />
  </stuff>
 </thingy>
</configuration>

Чтобы удалить элемент элемента с помощью атрибута типа, установленным на «значение», это, кажется, делает трюк:

<util:XmlConfig
  On="install"
  Action="delete"
  Id="RemoveAnElement"
  Node="element"
  File="Application.dll.config"
  VerifyPath="/configuration/thingy/stuff/item[\[]@type='value'[\]]"
  ElementPath="/configuration/thingy/stuff"
  Sequence="100"
/>

Это XMLConfig элемент Определяется расширением WIX «Утилита». Чтобы использовать это расширение, вы должны объявить пространство имен в утилестенсионном пространстве таким:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
   xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

, вам также необходимо добавить -EXT Wixutilextence в параметры команд в настройки Light.exe или добавить ссылку Для «wixutilextension.dll», если вы являетесь автономным проектом Wix, используя View Issive в Visual Studio.

-121--2273603-

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

2
ответ дан 18 December 2019 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: