2015-01-19 1 views
5

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

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

+1

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

+0

Я предлагаю вам взглянуть сюда: http://programmers.stackexchange.com/questions/180904/are-header-files-actually-good –

+1

'inline' в основном не означает« сделать этот код встроенным »в C++ , это больше связано с тем, как разрешать конфликты имени времени ссылки. «Ввод кода inline» имеет мало смысла в контексте стандарта C++. – Yakk

ответ

4

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

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

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

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

+0

Хорошая информация. Ключевая роль здесь для меня заключается в том, что «компиляторы могут и могут воспользоваться возможностью видеть код вызываемой функции», и это верно при оптимизации link-time/whole-program.Я надеялся справиться с этим только с учетом удобочитаемости, но то, что вы говорите, имеет смысл, и, как обычно, похоже, нет замены для фактического бенчмаркинга. Огромное спасибо! –