C ++ CLI оптимизирован? - PullRequest
       57

C ++ CLI оптимизирован?

2 голосов
/ 15 марта 2019

Если я пишу программу на C ++ CLI / управляемом C ++, выполняет ли компилятор какие-либо оптимизации?

Я знаю, что для C # есть некоторые оптимизации, выполняемые во время компиляции, при этом большинство оптимизаций выполняется JIT. То же самое верно для C ++ CLI?

Аналогичный вопрос: могу ли я сделать эквивалент флага -O2 для C ++ CLI? Я уже знаю о флаге "-c Release", но мне неясно, какой тип оптимизации он выполняет.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 18 марта 2019

C ++ / CLI-код всегда оптимизирован в сборке Release, да.Кто является ключом, вы можете свободно смешивать, как вы смеете.Это имеет тенденцию идти не так, как надо: слишком много собственного кода C ++ компилируется в MSIL.Трудно заметить, генератор кода может обрабатывать любой совместимый код C ++ 03 и редко визжит о любых заклинаниях C ++ 1x.

Хорошее напоминание о том, что джиттер не сильно отличается от серверной части компилятора C ++.MSIL очень хорошо сравнивается, скажем, с IR, который нужен LLVM.IR, который компилятор MSVC ++ использует для собственного кода, не задокументирован и не виден.

Что делает целесообразным выделение собственного C ++, который вы переносите, в его собственную статическую библиотеку или DLL.Но микширование на уровне функций возможно, вы можете переключаться назад и вперед с помощью #pragma un / managed.

Так что, как и следовало ожидать, неуправляемый код #pragma получает полную любовь оптимизатораи управляемый #pragma оптимизируется во время выполнения джиттером.Вы найдете оптимизацию джиттера, задокументированную в этом посте .

2 голосов
/ 17 марта 2019

При генерации собственного кода компилятор C ++ / CLI поддерживает те же оптимизации, что и собственный компилятор Microsoft C ++.

При генерации MSIL компилятор C ++ / CLI поддерживает меньшее количество оптимизаций (но все же больше, чем C #).), а затем происходит еще один этап оптимизации во время JIT (такая же оптимизация JIT и то же время JIT, что и в C #).

Например, развертывание цикла возможно при генерации MSIL, но автоматическая векторизация - нет,потому что у MSIL нет SIMD инструкций.Теоретически векторизация может все еще выполняться JIT, но на практике ресурсные ограничения JIT означают, что оптимизация менее эффективна.

Кроме того, возможны некоторые оптимизации для C ++, но не для C # из-за языкового дизайна.Например, шаблоны C ++ (в том числе в C ++ / CLI) компилируются для каждой комбинации аргументов шаблона, а шаблоны .NET (в том числе в C # и в C ++ / CLI) полностью разрешаются только на основе общих ограничений.

...