我正在为 C# 编写一个 DLL 作为高性能模块,所以我使用 C++/CLI,因为它很容易在 C# 中引用并支持本机代码。我在msdn上发现使用 #pragma managed(push, off) 和 #pragma managed(pop) 可以将其中的代码编译为本机代码。但根据我的简单测试,结果显示相反。
这是使用 Visual Studio 2012 使用 /clr 编译的代码。
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; }
性能分析表明,非托管 loop() 的成本是 clrloop() 的两倍。但是,如果我将 loop() 放入不同的 .cpp 文件并设置这个使用 /clr 编译的单个文件,并且不使用任何 #pragma managed(push, off) 东西,结果就像预期的那样好。
那么,这个#pragma 有什么问题?