Есть ли онлайн-ресурс, описывающий изменения в генерации кода VC10 по сравнению с VC9?
Я не говорю о c ++ 0x и других приятных функциях (таких как встроенный static_assert
), а также об улучшенном пользовательском интерфейсе. Что мне нужно знать, так это то, как ожидается, что сгенерированный код будет отличаться из-за оптимизаций, изменений в выравнивании элементов структуры и т. Д.
P.S. Это MSVC 2010 Express, для Win32
EDIT
Я построил несколько проектов с использованием VC10, поэтому теперь у меня есть некоторые сравнительные данные. В целом, я вижу значительное увеличение размера исполняемого образа, примерно на 15% по сравнению с VC9 и на 10% даже по сравнению с VC8.
Я оптимизирую по скорости, а не по размеру изображения. Так что, строго говоря, это сравнение не справедливо. Тем не менее, я помню, что VC9 по сравнению с VC8 обычно производил изображения немного меньшего размера, но все же смог снизить производительность. С точки зрения производительности новый код довольно близок к VC9 (в моих тестах он не отличался).
Помимо ухудшения качества кода (что, я надеюсь, не так), я вижу следующие потенциальные причины для больших изображений:
- Более агрессивные общие оптимизации скорости (которые приводят к единственному скромному эффекту, по крайней мере в моем случае), такие как агрессивное развертывание цикла и т. Д.
- Дополнительные данные на изображении из-за некоторых новых функций (таких как SAFESEH, DEP и т. Д.)
- Большие библиотеки времени выполнения по любым причинам (я использую их как статическую библиотеку, связанную с исполняемым файлом)
Отключение опции SAFESEH (которая теперь включена по умолчанию) немного уменьшает изображение (1%).
Есть еще идеи? Может ли это быть иначе, если я использую неэкспресс-версию VC10?
Включение DEP (предотвращение выполнения данных) увеличивает размер изображения? (Наверное - нет)
Я компилирую с / EHa, это снижает эффективность оптимизации, но это также относится и к более старым версиям VC.
РЕДАКТИРОВАТЬ 2
Я нашел причины вздутия изображения.
Используя dumpbin, я обнаружил, что удивительно, что EXE-файл, созданный VC10, содержит таблицу перемещений . Это было странно, поскольку EXE обычно не содержат его. И он исчезнет, если в файле vcxproj был собран EXE со следующими данными:
<Link>
<RandomizedBaseAddress>false</RandomizedBaseAddress>
</Link>
По умолчанию рандомизация базового адреса включена в VC10. Эта опция таинственным образом заставляет компоновщик VC10 вести себя «при сборке DLL», в результате чего он включает таблицу перемещения.
Это уменьшило размер EXE, но все же не до уровня VC9. Затем я открыл EXE с помощью обходчика зависимостей и обнаружил, что созданный VC10 EXE импортирует EncodePointer
и DecodePointer
из kernel32.dll
.
Согласно онлайновым ресурсам, эти функции импортируются библиотеками времени выполнения VC10, еще одной идиотской наивной попыткой повысить "безопасность" программного обеспечения. Не только новая среда выполнения кажется более толстой, но это также предотвратит запуск исполняемого файла под Win2K и WinXP-SP1.
К счастью, есть возможность использовать более ранние библиотеки времени выполнения:
<PlatformToolset>v90</PlatformToolset>
После того, как он был установлен - созданный EXE-файл стал почти идентичным тому, который был создан VC9, включая размер, таблицу импорта, разделы, таблицу обработчиков безопасных исключений, ресурсы и т. Д.
Так что теперь можно воспользоваться некоторыми новыми функциями, не жертвуя качеством кода.