2011-05-19 86 views
1

我有以下方法,从套接字流复制字节磁盘:何时在堆栈上分配固定大小的数组?

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关键字添加到 变量声明中,但我不想这样做,如果我不必这样做。

+2

很确定它是从堆中分配的,但为什么要关心?如果有参考资料,GC不会影响内存... – seand 2011-05-19 02:30:50

+1

如果您希望将其分配到堆栈中,我无法看到“固定”对您有何帮助。当然,如果你希望它在堆栈上分配,恰当命名的“stackalloc”关键字是你想要的,而不是“固定的”。那就是说,为什么你要把这个分配到堆栈上? 8K有没有关于堆栈寄存器的危险运动,你觉得比托管堆高水位安全移动8K更好? – 2011-05-19 06:48:39

+2

此外:你是否担心分配的表现?你担心它需要几纳秒才能完成分配,而不担心数千或数百万纳秒的时间会将你正在写入的巨大铁盘旋转到正确位置?在燃烧毫秒时,优化毫微秒毫无意义。 – 2011-05-19 07:21:03

回答

4

buffer变量将被分配在堆栈上,8192字节内存buffer变量保存位置将在堆上。为什么你在说fixed?你想加快速度吗?它几乎可以肯定不会......

引述埃里克利珀:

“但是在绝大多数的程序 在那里,本地变量分配 和释放都不会是 性能瓶颈“。

Ref

+1

完全同意你的意见。先测量一下,这样你就知道在哪里以及在哪里优化通常它会在I/O调用中花费很多时间。 – Mel 2011-05-19 02:42:44