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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Опция

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