Могут ли компиляторы C ++ автоматически удалять дублирующийся код? - PullRequest
6 голосов
/ 04 октября 2010

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

Существуют ли компиляторы C ++, которые могут обнаруживать дублирующийся код и генерировать соответствующий машинный код только один раз вместо каждого дубликата в исходном тексте?

Ответы [ 4 ]

9 голосов
/ 04 октября 2010

Некоторые делают, некоторые нет.

Со страницы оптимизации LLVM: -mergefunc ( Проход MergeFunctions, как это работает )

Функции разделены на маленькие блоки в Промежуточном представлении LLVM, этот этап оптимизации пытается объединить похожие блоки. Это не гарантирует успеха, хотя.

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

Я бы добавил, что код 1013 * дубликата не так уж плох для компилятора / исполняемого файла, он плох с точки зрения обслуживания и компилятор ничего не может с этим поделать.

8 голосов
/ 04 октября 2010

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

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

3 голосов
/ 04 октября 2010

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

Существуют некоторые оптимизации, такие как return value optimization, function inlining, которые могут происходить в разных функциях. Однако большая часть оптимизации выполняется внутри самой функции. Обычно это делается не на более высоком уровне языка, это означает, что компилятор не будет смотреть на код C ++ и начинать его оптимизацию. Компиляторы в основном имеют промежуточное представление между языком высокого уровня (C ++) и машинным языком. Это промежуточное представление (IR) несколько похоже на машинный язык, но не совсем машинный язык системы, на которой компилируется код. Обратитесь к вики-странице http://en.wikipedia.org/wiki/Compiler_optimization,, где перечислены некоторые из этих оптимизаций

1 голос
/ 04 октября 2010

Visual C ++ делает это, если вы укажете «минимизировать размер кода» (/ O1). Предоставленная функция описана в документации для / Og , которая устарела в пользу более простых опций общего охвата в пользу размера или скорости (/O2).

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