我正在为C#编写一个DLL作为高性能模块,因此我使用C++/CLI,因为它很容易在C#中引用并支持本机代码.我在msdn上发现使用#pragma managed(push,off)和#pragma managed(pop)可以使代码编译为本机代码.但根据我的简单测试,结果表明相反.
这是使用Visual Studio 2012使用/ clr编译的代码.
Run Code Online (Sandbox Code Playgroud)int clrloop() { for (int i = 0; i < 999999999; i++) { double test=9.999; test=pow(test, 10); } return 0; } #pragma managed(push,off) int loop() { for (int i = 0; i < 999999999; i++) { double test=9.999; test=pow(test, 10); } return 0; } #pragma managed(pop) int main(array<System::String ^> ^args) { int a=loop(); int b=clrloop(); return 0; }
性能分析表明,unmanaged loop()的成本是clrloop()的两倍.但是如果我把loop()放到不同的.cpp文件中并将这个单个文件设置为wihouth/clr,并且没有使用#pragma managed(push,off)的东西,结果就像预期的那样好.
那么,这个#pragma的问题是什么?