提问人:huzzm 提问时间:11/17/2023 最后编辑:huzzm 更新时间:11/18/2023 访问量:45
记录类型、记忆使用情况和复制操作
Record types, memorry usage and copy operations
问:
如果我在 C# 中定义一条记录,例如
public record Pair(int First, int Second);
我有一个循环,我在那里做
Pair x = new(1, 2);
while (...)
{
x = new(x.First + 1, x.Second + 1);
}
我的 IDE 在以大输入大小执行我的程序后突出显示了那行代码,并告诉我这里分配了很多 (100MB),因为 Pair 类型是不可变的,并且在每次循环迭代中都会创建一个副本(内存分配)。
我的问题是,我可以完全信任这个说法,还是编译器会优化它?
我重写了代码,使 Pair 记录一个类,并提供修改内容的方法,以便在整个程序执行期间只有一个实例处于活动状态。
public class Location
{
public Location()
{
First = 0;
Second = 0;
}
public void Increment()
{
First++;
Second++;
}
public int First { get; private set; }
public int Second { get; private set; }
}
因此,在循环中,我现在可以执行以下操作:
Pair x = new(1, 2);
while (...)
{
x.Increment();
}
但是当我用
var proc = System.Diagnostics.Process.GetCurrentProcess();
Console.WriteLine($"{proc.PrivateMemorySize64/1000000.0}MB");
然后使用的 MB 并没有真正下降,没有明显的差异,这让我感到疑惑。
答: 暂无答案
评论
public record struct Pair(int First, int Second);
<=== 繁荣public readonly record struct Pair(int First, int Second);
int