代码之家  ›  专栏  ›  技术社区  ›  Verdagon

C++ CLI优化了吗?

  •  0
  • Verdagon  · 技术社区  · 7 年前

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

    我知道对于C#来说,有些优化是在编译时完成的,大多数优化是由JIT完成的。对于C++ CLI来说是一样的吗?

    类似的问题:对于C++ CLI,我能做一个等价的-O2标志吗?我已经知道“-c Release”标志,但是我不清楚它做了什么样的优化。

    谢谢!

    0 回复  |  直到 7 年前
        1
  •  2
  •   Ben Voigt    7 年前

    在生成本机代码时,C++/CLI编译器支持与微软的本机C++编译器相同的优化。

    当生成MSIL时,C++/CLI编译器支持较少数量的优化(但仍多于C *),然后在JIT中发生另一优化传递(相同的JIT和相同的JIT时间优化,适用于C *)。

    例如,在生成MSIL时可以展开循环,但不能自动矢量化,因为MSIL没有SIMD指令。矢量化在理论上仍然可以由JIT完成,但在实践中,JIT的资源约束意味着优化的效率较低。

    此外,由于语言设计,C++可能存在一些优化,但不能进行C语言优化。例如,为模板参数的每个组合编译C++模板(包括C++ + CLI),而.NET泛型(包括在C语言中和C++ +CLI中)仅基于通用约束完全解决。

        2
  •  4
  •   Hans Passant    7 年前

    在发布版本中,C++/CLI代码总是优化的,是的。关键是谁,你可以随心所欲地混合。如果将太多的本机C++代码编译成非二进制代码,这往往会出错。很难注意到,代码生成器可以处理任何兼容的C++ 03代码,很少对任何C++ 1x咒语进行尖叫。

    一个很好的提醒,抖动与C++编译器的后端没有太大的不同。比如说,MSIL与LLVM所需的IR相当好。MSVC++编译器对本机代码使用的IR未被记录和不可见。

    这使得在自己的静态库或DLL中隔离本机C++包是一个很好的做法。但是,在函数级别上进行混合是可能的,可以用γ-语用/非管理方式来回切换。

    所以很像你猜的那样,#pragma unmanaged代码得到了优化器的完全喜爱,而#pragma managed在运行时通过抖动得到了优化。您可以在 this post .