【问题标题】:How does an array knows its size? [closed]数组如何知道它的大小? [关闭]
【发布时间】:2014-06-29 17:44:44
【问题描述】:

我想知道 - 使用不同的编程语言(比如 Objective-C、C# 和 Java)。

数组如何知道它的大小? 当我询问数组大小(或计数)时,幕后发生了什么?

【问题讨论】:

  • 大小存储在某处。
  • 这绝对应该被单独归为一种编程语言。不同语言的实现可能会有很大差异。
  • @nhgrif 细节会因实现而异,但实际的源语言与它几乎没有关系。 (除了在运行时长度可能无法恢复的大类语言。)

标签: java c# objective-c arrays nsarray


【解决方案1】:

如 cmets 中所述,数组大小存储为某种私有变量。把它想象成一个数组类(我认为它实际上是这样完成的)。

Class Array
{
   Private int size;
}

当您创建一个新数组时,它会设置该大小。如果您以某种方式更改数组大小,(取决于语言)将创建一个新的数组类,并将旧的数据复制到新的。当然还有其他技巧可以奏效。

再次,我不确定这是否是它在某些语言中的工作方式,但您可以在数组末尾有一个特殊字符(如字符串的 .\0 字符),然后遍历所有件。这当然意味着要获得长度是一个 O(n) 操作,它不像最后一个 (O(1)) 那样恒定。

如果您的语言中有指针,您也可以使用指针。有一个指向前面的指针,一个指向末尾的指针,然后做减法以获得大小。这比 O(n) 方法快,但每次执行减法都需要更多指令。

有多种方法可以做到这一点。如果你想看看它是如何在 C# 中完成的,你可以看看 Mono 是怎么做的。

【讨论】:

  • Java 的 .lengthpublic
  • 它的 getter 属性是公开的,是的。但是允许用户手动更改数组大小值是糟糕的设计。
  • 不,字段 本身public,但也是 final,所以这个问题是无效的。 IOW,你不能改变它。
  • 哦,好吧,我不知道。我对 Java 不是很熟悉(我想这就是你假设的情况)。
  • 当你试图回答一个应该简单地结束的问题时会发生这种情况。
【解决方案2】:

在将数组视为对象的语言中,可以在创建时将其存储在字段中。 例如,在 Java 中,您可以使用其length 字段来查询数组的长度。 这显然不是表示数组的唯一方法。

在 C 中,数组只是一个连续存储的数据块,由指向第一个块的指针表示。您可以使用sizeof 运算符查询其大小(以字节为单位)。然后可以通过将其总大小除以单个数据类型的大小来获得其长度。因此,如果你有一个数组arrsizeof(arr)/sizeof(arr[0]) 就是它的长度。

但这还不是全部,举个极端的例子,数组在 Haskell 中的工作方式非常不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2011-04-04
    • 1970-01-01
    • 2015-01-15
    相关资源
    最近更新 更多