gpt4 book ai didi

c# - 使用 if 语句来微观管理堆栈

转载 作者:太空狗 更新时间:2023-10-29 23:55:01 28 4
gpt4 key购买 nike

是否应该使用 if 语句来协助堆栈的内存释放?

示例 A:

        var objectHolder = new ObjectHolder();
if (true)
{
List<DefinedObject> objectList;
using (var sr = new GenericStreamReader<DefinedObject>())
{
objectList= sr.Get().ToList();
}
if (true)
{
var DOF = new DefinedObjectFactory();
objectHolder.DefinedObjects = DOF.DefineObjects(objectList);
}
}
//example endpoint

示例 B:

        var objectHolder = new ObjectHolder();
List<DefinedObject> objectList;
using (var sr = new GenericStreamReader<DefinedObject>())
{
objectList= sr.Get().ToList();
}
var DOF = new DefinedObjectFactory();
objectHolder.DefinedObjects = DOF.DefineObjects(objectList);
//example endpoint

当到达示例端点时,与示例 B 中到达示例端点时相比,示例 A 在堆栈上的占用空间是否更小?

最佳答案

首先,基于堆栈的分配系统的全部要点恰恰是您不需要以任何方式对其进行优化。别担心。抖动完全能够意识到本地将永远不会被再次读取或写入,并在它认为最好的情况下重新使用其存储。让抖动发挥作用;它不需要你的帮助。 (*)

相反,编写您的程序以使局部变量对读者有意义。这就是您应该优化的目标。

最后,永远不需要说“if (true) { }”来引入新的作用域。只是引入一个新的范围。这是完全合法的说法:

void M()
{
{ // new scope
}

{ // another one
}
}

(*) 有一种情况抖动需要您的帮助,这种情况是本地引用堆上的对象,该对象包含将要被非托管代码使用的资源。抖动不知道非托管代码将使用该对象的资源,并且可能会决定没有人再使用该对象并尽早清理它。当非托管代码正在使用资源时,对象的终结器可能会在终结器线程上释放资源! 一个对象并不能保证仅仅因为局部变量持有它就保持存活。如果局部变量永远不会被再次读取,那么抖动可以重新使用它的存储并告诉垃圾收集器它收集引用的对象是安全的,这可能会使非托管代码崩溃。您可以使用 KeepAlive 来提示特定对象需要保持事件状态而不是被优化掉的抖动。

关于c# - 使用 if 语句来微观管理堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10002922/

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