gpt4 book ai didi

c# - 在 C# 早期使用 float 大括号释放变量

转载 作者:太空宇宙 更新时间:2023-11-03 19:20:50 25 4
gpt4 key购买 nike

C# 变量在声明类型的地方实例化(例如 string s;)并在当前作用域的右大括号处释放:

// Operates with Q memory
void FantasyMethod() {
var o = new BigObject();

{
var temp = new BigObject();
Populate(temp); // Populates o1 with N megabytes of data

o = PerformSomeOperationsOn(temp); // Returns a BigObject of size M (M is close to N)

// Currently, M+N memory is occupied, we have Q-M-N free
}

// Let's tell the garbage collector to catch up
GC.Collect();
GC.WaitForPendingFinalizers();

// Currently, M memory is occupied

DoUsefulStuffWith(o); // This method can only work if at least Q-M-N/2 memory is free
}

这样做的一个好处是我可以在函数返回之前释放大变量。在上面的(简单的) block 中,我通过在不再需要时立即处理一个大变量来节省我有限的可用内存。

  1. 以上是否正确?
  2. 这样做是个好主意吗(我对赞成和反对的论据感兴趣,而不是个人意见或偏好)?提取裸括号 block 作为一种方法会降低内存使用效率吗?如果出于可读性原因我不想创建新方法怎么办?

最佳答案

One benefit of this is that I can free large variables before the function returns.

没有。 C# 不是 C++,对象没有析构函数,并且您不能保证对象在离开其声明范围并且不存在对其的有效引用时会被回收。

如果您需要那种级别的可预测性,那么您不应该使用托管语言,句号。确实存在有助于减轻 C# 中的内存压力的技术,但并不经常需要这些技术,而且您永远无法获得像 C 或 C++ 这样的语言所能提供的控制级别。

根据您的修改:

GC.Collect尝试运行 GC pass,但它不能保证。 GC.WaitForPendingFinalizers阻塞,直到所有被标记为终结的对象都运行了它们的终结器。

If an object implements a finalizer and has not disabled finalization by calling SuppressFinalize, the object is placed in a list of objects that are marked as ready for finalization. The garbage collector calls the Finalize methods for the objects in this list and removes the entries from the list. This method blocks until all finalizers have run to completion.

关于c# - 在 C# 早期使用 float 大括号释放变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12379244/

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