【问题标题】:When is a fixed size array allocated on the stack?什么时候在栈上分配一个固定大小的数组?
【发布时间】: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


【解决方案1】:

buffer 变量将在堆栈上分配,buffer 变量所在位置的 8192 字节内存将在堆上。

你为什么说fixed?你想加快速度吗?它几乎肯定不会...

引用 Eric Lippert 的话:

“但是在绝大多数程序中 在那里,局部变量分配 并且释放不会 性能瓶颈。 "

Ref.

【讨论】:

  • 完全同意你的看法。首先进行测量,这样您就知道要优化什么以及在哪里进行优化。通常它会在 I/O 调用中花费大量时间。
  • 权威的真理与真理的权威。你需要做一个测试来找出真相。
猜你喜欢
  • 2015-11-23
  • 2012-08-13
  • 2015-05-05
  • 2017-02-19
  • 2014-06-01
  • 1970-01-01
  • 2012-08-09
  • 2017-08-17
  • 2011-12-04
相关资源
最近更新 更多