将委托转换为函数指针的危险

ins*_*pid 6 .net c++ garbage-collection

假设您有一个托管类,它将委托成员转换为本机函数指针并将其交给本机代码.假设类/委托保留在范围内,并且在本机代码的生命周期内不会更改(因此GC不会明显破坏它).在这种情况下应该注意哪些其他问题?例如,GC是否可以移动委托或委托引用的实际方法,并使您的本机代码具有访问冲突?

Jas*_*son 2

似乎可以固定委托/函数的内存位置,但这阻碍了 .NET GC 的一个主要优点:压缩。

GC 扫描完成后,每个对象都会在内存中重新定位,使其保持连续。与堆碎片相比,这使得访问和分配速度更快。如果你必须将一个对象固定在堆中,GC 就必须解决它,如果多次执行,可能会导致一些重要的堆碎片。(顺便说一句,在 Ron Warholic 链接的文章中,这个问题是通过 GCHandle 解决的。我不确定这是否可以在托管 C++ 之外使用。)