gpt4 book ai didi

c# - 使用 ref 传递引用类型是否节省内存?

转载 作者:太空狗 更新时间:2023-10-29 19:50:48 25 4
gpt4 key购买 nike

在 C# 中,方法的参数可以是引用类型或值类型。传递引用类型时,会传递引用的副本。这样,如果在方法内部我们尝试将传递的引用重新分配给另一个对象实例,则在方法外部重新分配是不可见的。

为使其正常工作,C# 具有 ref 修饰符。使用 ref 传递引用类型实际上使用原始引用而不是副本。 (如果我错了请纠正我)。

在这种情况下,由于我们没有创建引用的副本,我们是否节省了内存?如果一个方法被广泛调用,这是否会提高应用程序的整体性能?

谢谢!

最佳答案

claim

不,它没有。如果有的话,它会因为额外的查找而变慢。

没有理由通过引用传递引用类型,除非您特别打算稍后分配给它。


证明

由于有些人似乎认为编译器传递的是“变量本身”,所以看一下这段代码的反汇编:

using System;

static class Program
{
static void Test(ref object o) { GC.KeepAlive(o); }

static void Main(string[] args)
{
object temp = args;
Test(ref temp);
}
}

这是(在 x86 上,为简单起见):

// Main():
// Set up the stack
00000000 push ebp // Save the base pointer
00000001 mov ebp,esp // Set up stack pointer
00000003 sub esp,8 // Reserve space for local variables
00000006 xor eax,eax // Zero out the EAX register

// Copy the object reference to the local variable `temp` (I /think/)
00000008 mov dword ptr [ebp-4],eax // Copy its content to memory (temp)
0000000b mov dword ptr [ebp-8],ecx // Copy ECX (where'd it come from??)
0000000e cmp dword ptr ds:[00318D5Ch],0 // Compare this against zero
00000015 je 0000001C // Jump if it was null (?)
00000017 call 6F910029 // (Calls some internal method, idk)

// THIS is where our code finally starts running
0000001c mov eax,dword ptr [ebp-8] // Copy the reference to register
0000001f mov dword ptr [ebp-4],eax // ** COPY it AGAIN to memory
00000022 lea ecx,[ebp-4] // ** Take the ADDRESS of the copy
00000025 call dword ptr ds:[00319734h] // Call the method

// We're done with the call
0000002b nop // Do nothing (breakpoint helper)
0000002c mov esp,ebp // Restore stack
0000002e pop ebp // Epilogue
0000002f ret // Return

这是来自代码的优化编译。显然,传递的是变量的地址,而不是“变量本身”。

关于c# - 使用 ref 传递引用类型是否节省内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7171842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com