Подтвердить что ты не робот

GCC (/Clang): функции объединения с идентичными инструкциями (сложение COMDAT)

Просто любопытно, не делают ли инструменты GCC или Clang эквивалент MSVC идентичное сложение COMDAT (ICF) в настоящее время? Если нет, есть ли планы? Кажется, я не могу найти никаких авторитетных ссылок по этому вопросу, кроме старых сообщений списка рассылки GCC.

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

Кроме того, кто-нибудь нашел, что ICF имеет большое значение для минимизации размера исполняемого исполняемого файла на практике? У меня нет больших проектов MSVC, которые можно было бы проверить. (Я предполагаю, что это действительно помогает, если вам удалось создать шаблоны для разных типов совместимых с vtable-макетами.)

Наконец, совместим ли он с С++ 11 для двух функций, указателей на разные функции, чтобы сравнивать их во время выполнения? Эта ссылка, кажется, подразумевает, что это не так, но это для C99. EDIT: нашел предыдущий вопрос по этому вопросу

4b9b3361

Ответ 1

Ни GCC, ни Clang не являются компоновщиком, и ICF должен выполняться компоновщиком или, по крайней мере, в сотрудничестве с компоновщиком. Edit: Они не выполняют ICF, поэтому да, разные экземпляры производят отдельный код. Компонент GNU gold поддерживает ICF с опцией --icf, для которой требуется опция GCC -ffunction-sections б.

Отличительные функции должны иметь разные адреса... Я не могу вспомнить, отключена ли ICF для любой функции, которая имеет свой адрес, но если нет, то нужно поставить нагрузку инструкций без операции перед объединенной функцией и сделать каждое отдельное создание экземпляра на другой инструкции, поэтому у них разные адреса. Изменить: опция gold --icf=safe включает только ICF для функций, которые могут быть доказаны, что их адрес не был принят, поэтому код, который опирается на разные адреса, по-прежнему будет работать.

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