【问题标题】:How C# Array works with memory?C# 数组如何处理内存?
【发布时间】:2018-12-17 05:13:14
【问题描述】:

C# 中的数组只是一块连续的内存,就像在任何其他语言中一样。 默认情况下,在 T[] 处按索引操作获取元素将花费我们 O(1),因为计算 index * sizeof(T)。但这只有在我们知道 sizeof(T) 时才有效。

所以我试图打破它:

var sampleArray = new string[10];
sampleArray[0] = "1";
sampleArray[1] = "2";

var objectArray = (object[]) sampleArray;
objectArray[2] = 42;

并且可以预见地得到运行时System.ArrayTypeMismatchException

好的,但是今天我找到了这个例子:

var arr = new[] { new object[] { new[] { 1 }, 2, "3" } };
var someValue = arr[0][1];

并且这个例子是编译运行无异常的。

为什么?

如果元素不同,对象数组如何知道任何元素的大小?

这如何在低级处理不同长度的字符串?

我不认为Array 为每个元素存储“元”信息...... 还是我错了?

【问题讨论】:

  • 您应该阅读提供标准类型结构的 unix 手册。在 unix 中,结构的大小需要确定。因此,对于非标准对象,长度会在需要时继续对象。字符串以 '\n' 结束。在 Net 库中,结构(或类)不仅是连续内存块,还包含类型和大小(在需要时)。 c# 有 Anonymous(运行时)和 Non- Anonymous 类型(在编译时定义)。
  • @JohnG 当然不会抛出异常,下次请仔细阅读问题
  • @jdweng 我知道 Unix 上类型大小的工作原理。你试图回答另一个问题。请下次也仔细阅读问题。
  • 我读了这个问题。为什么你认为 c# 与 c 语言有什么不同?对象的大小必须是确定的。你说:“C# 中的数组只是一块连续的内存,就像任何其他语言一样”。然后说“我知道 Unix 的类型大小是如何工作的”是矛盾的。 Unix 是 c 语言,它不仅仅是内存块。

标签: c# .net memory low-level


【解决方案1】:

StringObject引用类型,即数组 string[] 和 object[] 包含对数据的引用,而不是数据本身。

引用具有固定大小(32 位或 64 位,具体取决于处理器架构)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2011-06-08
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多