Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cli C++/CLI:非托管类方法中是否允许使用本地托管变量?_C++ Cli - Fatal编程技术网

C++ cli C++/CLI:非托管类方法中是否允许使用本地托管变量?

C++ cli C++/CLI:非托管类方法中是否允许使用本地托管变量?,c++-cli,C++ Cli,我知道gcroot用于保存对本机类中托管对象的引用,但是在非托管类函数中使用托管对象作为local变量怎么样? 编译器似乎没有在这方面生成错误,但它是否“正确”?它会影响性能吗?没有本地托管对象这样的东西。所有托管对象都存储在堆上,这是垃圾收集器完成其工作所必需的。只能将引用作为局部变量。运行时的指针 如果在非托管函数中使用有效的/clr或#pragma managed编译代码,则可以使用托管对象引用。这样的代码将被翻译成IL,并在运行时得到及时编译,就像普通托管代码一样。否则它不会具有托管代码

我知道gcroot用于保存对本机类中托管对象的引用,但是在非托管类函数中使用托管对象作为local变量怎么样?
编译器似乎没有在这方面生成错误,但它是否“正确”?它会影响性能吗?

没有本地托管对象这样的东西。所有托管对象都存储在堆上,这是垃圾收集器完成其工作所必需的。只能将引用作为局部变量。运行时的指针

如果在非托管函数中使用有效的/clr或
#pragma managed
编译代码,则可以使用托管对象引用。这样的代码将被翻译成IL,并在运行时得到及时编译,就像普通托管代码一样。否则它不会具有托管代码的特性,没有验证,您将遭受所有正常的指针错误。是的,这会影响性能,因为这样的代码没有得到正常的优化器的喜爱。抖动中内置的优化器没有那么有效,因为它在时间限制下工作


不使用/clr选项编译本机代码,或在代码中使用
#pragma unmanaged
动态切换编译器。

托管对象,托管值类型(
value struct
value class
enum class
)的值和托管引用类型的句柄(
ref struct
ref class
)可以在编译为MSIL的代码中使用

和编译到MSIL的代码可以是非托管对象的一部分(例如,标准C++类型的虚拟成员函数可以编译为MSIL,Visual C++编译器),它只是工作“技术将确保V表正确设置”当将标准C++代码生成的事件和回调转发到托管的GUI世界时,这是非常有用的。但是如果您想从C++中调用一个托管代码(也许是C ^),则可以应用这一算法。
正如Hans提到的,在MSIL和特定函数的机器代码生成之间切换会对性能产生影响。但如果您位于本机托管边界上,则编译到MSIL并使用“It Just Works”a/k/a“C++互操作”是迄今为止性能最高的替代方案。

一句话:“如果出错,在非托管函数中使用托管对象引用是可能的”是误导性的……在“非托管函数”(非本机!)中使用托管对象不是错误的。这是在“非托管类”中使用gcroot对象的正常方式我已经回答了C++/CLI问题很久了。我还没有遇到一个实际上是为了他的C++代码编译到IL的OP。如果你使用C++ +CLI,那么你通常想要IL代码……主要是针对特定的部分……但是OP在讨论使用<代码> GCROOT < /代码>…这假设他理解他所做的事情。如果您正在使用gcroot,那么使用gcroot对象的唯一方法就是在非托管类/函数中使用IL代码!或者您是否看到gcroot的其他用法???Hans,请返回并研究引用类型和值类型之间的差异。再加上Jochen已经指出的错误,这个答案是100%错误的。值类型e值不是托管对象。请停止对我的答案发表愚蠢的评论。