C++CLI 是否优化?

Is C++CLI optimized?

如果我用 C++CLI/托管 C++ 编写程序,编译器会执行任何优化吗?

我知道对于 C#,有一些优化是在编译时完成的,大部分优化是由 JIT 完成的。 C++CLI 也是这样吗?

一个类似的问题:我可以为 C++CLI 执行相当于 -O2 标志的操作吗?我已经知道“-c Release”标志,但我不清楚它做了什么样的优化。

谢谢!

生成本机代码时,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 中)仅根据泛型约束完全解析。

C++/CLI 代码始终在发布版本中进行优化,是的。关键靠谁,你敢怎么混就怎么混。如果将过多的本机 C++ 代码编译为 MSIL,这往往会出错。很难注意到,代码生成器可以处理任何兼容的 C++03 代码,并且很少对任何 C++1x 咒语发出尖叫声。

一个很好的提醒,抖动与 C++ 编译器的后端没有太大区别。 MSIL 与 LLVM 所需的 IR 相比效果非常好。 MSVC++ 编译器用于本机代码的 IR 未记录且不可见。

这使得将包装在其自己的静态库或 DLL 中的本机 C++ 隔离成为一种很好的做法。但是在函数级混合是可能的,你可以用#pragma un/managed.

来回切换

所以这很像您猜测的那样,#pragma 非托管代码得到了优化器的充分喜爱,而#pragma managed 在运行时通过抖动得到了优化。您会在 this post.

中找到抖动优化记录