【发布时间】:2011-05-19 02:24:19
【问题描述】:
我有以下方法将字节从套接字流复制到磁盘:
public static void CopyStream(Stream input, Stream output)
{
// Insert null checking here for production
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, bytesRead);
}
}
我很好奇的是:buffer会被分配到栈上还是
堆?可以肯定的是,我可以使这种方法不安全,并将 fixed 关键字添加到
变量声明,但如果我不必这样做,我不想这样做。
【问题讨论】:
-
很确定它是从堆中分配的,但你为什么要关心呢?如果有对它的引用,GC 不会破坏内存...
-
如果你想在堆栈上分配它,我看不出“固定”对你有什么帮助。当然,如果您希望它在堆栈上分配,恰当命名的“stackalloc”关键字就是您想要的,而不是“固定的”。也就是说,你到底为什么要在堆栈上分配这个?堆栈寄存器危险移动 8K 是否比托管堆高水位标记安全移动 8K 更好?
-
另外:您担心分配的性能吗?您担心分配所需的几纳秒,而不担心将您正在写入的巨大铁盘旋转到正确位置所需的数千或数百万纳秒?在燃烧毫秒时优化纳秒没有任何意义。
标签: c# heap-memory fixed stack-memory unsafe-pointers