Для чего используется раздел COMDAT? - PullRequest
28 голосов
/ 02 декабря 2009

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

Ответы [ 2 ]

82 голосов
/ 14 марта 2010

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

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

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

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

5 голосов
/ 14 декабря 2010

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

...