【问题标题】:Why are Arrays reference types? [closed]为什么数组是引用类型? [关闭]
【发布时间】:2018-01-10 16:35:28
【问题描述】:
int[] age=new int[5];

在阅读了很多帖子和博客之后,我仍然不清楚为什么数组是引用类型。我知道这个问题已经很老了,被问了很多次,但仍然找不到直接的答案。

已知事物:由于数组是在堆上分配的,因此它们是引用类型。

需要知道:将(编译器)数组作为引用类型的原因是什么?。 假设 age[0]=5,age[1]=25 ,如果它们的类型是对象,那么在堆栈上分配这些或引用堆有什么困难。为什么认为堆访问时间比较慢?。

为什么是堆,为什么不像结构那样在堆栈上?

【问题讨论】:

  • 所以你希望数组是……一种值类型?如果您将它们传递到其他地方,则复制?如果它们对于堆栈来说太大了怎么办?
  • 您的问题中有很多误解;从这里开始:The Stack is an implementation detail - part 1.
  • 也许值类型和引用类型比堆栈和堆更多。只是猜测。
  • @AlexAtNet 那篇关于在堆栈上分配数组的文章让我大吃一惊……一些基本功能完全超出了我的意识。不过,我倾向于避免不安全的上下文。

标签: c# .net arrays


【解决方案1】:

几个原因:

  1. 值类型是按值传递的(如复制的那样)。因此,如果您使用值类型数组调用方法,您将复制所有内容。

  2. 堆栈内存有限,主要用于快速访问当前使用的参数(正如术语堆栈所暗示的那样)。将大对象放入堆栈会导致查找其他本地状态需要更长的时间,因为它们将不再位于 CPU 缓存中的同一缓存行上。

  3. 数组内容是可修改的。因此,当您尝试设置一个值时,您会遇到可变结构的所有问题,结果却发现修改了副本,而不是“原始”。

编辑: 是的,您可以在不安全的代码中使用 stackalloc。这不是一个好主意。

【讨论】:

    猜你喜欢
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多