Для чего используется раздел COMDAT?

Я вижу параметр /Gy и мне интересно, почему я бы его использовал? http://msdn.microsoft.com/en-us/library/xsa71f43.aspx

2 ответа

В настоящее время принятый ответ является несколько неполным.

Назначение раздела COMDAT - разрешить определение "дубликатов" разделов в нескольких объектных файлах. Обычно, если один и тот же символ определен в нескольких объектных файлах, компоновщик сообщит об ошибках. Это может вызвать проблемы для некоторых функций языка C++, таких как шаблоны, которые могут создавать одинаковые символы в разных файлах cpp.

Разделы COMDAT используются, чтобы обойти это. Когда раздел помечается как COMDAT в объектном файле, он также указывает флаг, который указывает, как следует разрешать конфликты. Существует множество вариантов, в том числе "просто выберите того, кто вам нравится", "убедитесь, что все дубликаты одинакового размера", "убедитесь, что все дубликаты имеют одинаковое содержание", "выберите самый большой" и т. Д. См. спецификация COFF для полного списка.

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

Параметр /Gy хорош для использования в сборках релизов. Поскольку каждая функция имеет свой собственный раздел, компоновщик может отбросить любой неиспользуемый фрагмент кода. Если вы не укажете опцию /Gy, вы получите что-то вроде этого: "a.cpp" определяет 3 функции, и компилятор помещает их в один фрагмент кода при компиляции. "main.cpp" использует только одну функцию из "a.cpp", но при связывании все функции из "a.cpp" будут связаны (две из них как бремя). И если бы каждая функция имела свой собственный раздел, компоновщик мог бы выбрать только тот, который содержал функцию, необходимую для "main.cpp". Компиляция без параметра /Gy хороша для отладочных сборок. При компиляции класса все его методы по умолчанию получают свои собственные отдельные разделы.

Другие вопросы по тегам