作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
是否应该使用 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/
我是一名优秀的程序员,十分优秀!