在非托管结构上使用时,fixed语句的开销是多少?

Elo*_*off 1 c# unsafe

特别是,我正在考虑这样的场景:

    unsafe struct Foo
    {
        public int Bar;

        public Foo* GetMyAddr()
        {
            fixed (Foo* addr = &this)
                return addr;
        }
    }
Run Code Online (Sandbox Code Playgroud)

假设存储在非托管内存中的Foo,我试图找出在GetMyAddr中评估fixed语句所涉及的内容.我知道作为程序员,这个结构永远不会在托管堆上,我只需要以最有效的方式在非托管内存中获取它的地址.如果在这里使用任何锁定或原子操作,我会特别担心,因为这会使它完全不合适.

Jar*_*ger 7

这不会做你认为它会做的事情."fixed"语句仅在"fixed"语句本身的持续时间内对托管对象(this)进行固定,一旦"返回",该语句就会结束.有关详细信息,请参阅MSDN文档.

您已经说过"Foo"处于非托管内存中,这意味着托管GC不会在您身上移动它.在那种情况下,你不能直接返回"&this"吗?或者,您可能需要考虑使用非托管对象并将其编组为托管对象.给出你正在做的事情的更多背景,我们都能够提供更具体的建议.

  • 是的.他需要一个GCHandle来固定它以外的任何持续时间. (3认同)