Подсказки для компилятора, чтобы помочь ему с задачей оптимизации - PullRequest
2 голосов
/ 15 ноября 2010

Глава const и volatile в статье «Выживание версии выпуска» дала мне идею, что компилятор может использовать ключевое слово const в качестве подсказки для своей работы по оптимизации. *

Знаете ли вы некоторые другие советы по оптимизации для компилятора или принципы разработки функций, чтобы компилятор мог сделать их встроенными?

Кстати, вы объявляете параметры функции примитивного типа как константную или константную ссылку (например, void foo(const int i) или void foo(const int& i))?

Спасибо!

Ответы [ 7 ]

3 голосов
/ 15 ноября 2010

Редко, когда квалификация const может помочь компилятору оптимизировать ваш код. Вы можете прочитать больше о том, почему это так в книге Херба Саттера "Постоянная оптимизация?"

Относительно вашего последнего вопроса: в общем, вы предпочитаете передавать по значению вещи, которые дешевы для копирования (например, объекты базового типа - int s и float s и т. П. - и объекты малого класса) и передавать другие типы по константной ссылке. Это очень общее правило, и есть много предостережений и исключений.

1 голос
/ 15 ноября 2010

Нет никакой практической пользы для любой формы.Если тип меньше одного машинного слова, возьмите его по значению.Другое дело, что семантический анализ современного компилятора намного выше того, что может и не может сделать const, вы можете применять оптимизации только в том случае, если он был предварительно скомпилирован или ваш код был ОЧЕНЬ сложным.Статья, на которую вы ссылаетесь, насчитывает несколько лет, и с тех пор компилятор ничего не делал, но значительно улучшился.

1 голос
/ 15 ноября 2010

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

Точка передачи параметров по const & состоит в том, чтобы избежать ненужного копирования. В случае небольших параметров (одно машинное слово или меньше) это не приводит к лучшей производительности, поэтому вы не должны этого делать. foo(int) эффективнее foo(const int&).

1 голос
/ 15 ноября 2010

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

Это больше для правильности, чем для оптимизации.

0 голосов
/ 15 ноября 2010

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

Для небольших аргументов, которые вы не собираетесь изменять, используйте call-by-value.

Для больших аргументов, которые вы не собираетесь изменять, используйте либо call-by-reference, либо передавая адрес (что по сути одно и то же) вместе с const.

Для больших или маленьких аргументов, которые вы собираетесь изменить, отбросьте const.

Кстати: если это новости, для реальной производительности вам нужно знать, как найти проблемы, которые у вас есть, с помощью профилирования. Ни один компилятор не может сделать это за вас.

0 голосов
/ 15 ноября 2010

Если вы посмотрите на источники ядра Linux или некоторые подобные проекты, вы найдете все подсказки по оптимизации, которые передаются в gcc (или любой другой компилятор).Ядро Linux использует все функции, которые предлагает gcc, даже если его нет в стандарте.

Эта страница подводит итог расширений gcc для языка Си.Я упоминал C здесь, потому что const и volatile используются также в CБольше, чем C или C ++, оптимизация компилятора здесь находится в центре внимания вопроса.

0 голосов
/ 15 ноября 2010

Несколько вещей "общего компилятора" с моей головы.

  • означает, что переменная никогда не изменится
  • volatile как подсказка о том, что переменная может изменяться в любой точке
  • ограничить ключевое слово
  • барьеры памяти (для намека компилятору на конкретный порядок) - вероятно, не столько "оптимизация", как вам кажется.
  • встроенное ключевое слово (используйте очень осторожно)

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

...