如果我用C ++ CLI /托管C ++编写程序,编译器会执行任何优化吗?
我知道对于C#,在编译时已完成了一些优化,大多数优化是由JIT完成的。 C ++ CLI是否也一样?
一个类似的问题:对于C ++ CLI,我可以做-O2标志的等效项吗?我已经知道“ -c Release”标志,但是还不清楚它做了什么样的优化。
谢谢!
答案 0 :(得分:3)
C ++ / CLI代码始终在Release版本中进行了优化,是的。关键在于谁,您可以随心所欲地随意混合。这往往会出错,因为太多本机C ++代码被编译为MSIL。很难注意到,代码生成器可以处理任何兼容的C ++ 03代码,并且很少抱怨任何C ++ 1x的咒语。
一个很好的提醒是,抖动与C ++编译器的后端没有太大区别。 MSIL与LLVM所需的IR相比相当好。 MSVC ++编译器用于本机代码的IR未记录且不可见。
这是隔离您包装在其自己的静态库或DLL中的本机C ++的一种好习惯。但是可以在功能级别进行混合,您可以使用#pragma un / managed来回切换。
因此,就像您猜到的那样,#pragma托管代码获得了全部的优化器支持,而#pragma托管代码则在运行时由于抖动而得到了优化。您将在this post中找到记录的抖动优化。
答案 1 :(得分:2)
生成本地代码时,C ++ / CLI编译器支持与Microsoft的本地C ++编译器相同的优化。
生成MSIL时,C ++ / CLI编译器支持较少的优化(但仍比C#多),然后在JIT期间又进行了另一遍优化(与适用于C#的JIT和JIT时间优化相同)。
例如,生成MSIL时可以进行循环展开,但不能进行自动矢量化,因为MSIL没有SIMD指令。从理论上讲,矢量化仍然可以由JIT完成,但实际上,JIT的资源限制意味着优化效果不佳。
此外,由于语言设计,C ++可能有一些优化,但C#没有。例如,针对模板参数的每种组合编译C ++模板(包括C ++ / CLI),而仅根据通用约束完全解析.NET泛型(包括C#和C ++ / CLI)。