为数组维数时,为每个元素分配了多少内存?

时间:2009-05-07 14:30:56

标签: .net vb.net arrays memory-management

例如,在VB.NET中:

  Dim strArray(5) As String

据我了解,因为这是一个数组,计算机将为5个元素中的每一个分配连续的内存位置。但是为这五个元素中的每一个分配了多少空间?如果我决定在阵列的第2位放置一个5MB的文本块怎么办?

值类型是否不同(例如,Int32数组)?我认为如果必须为单个元素调整内存块,则必须创建一个全新的数组以保留连续的内存功能。

2 个答案:

答案 0 :(得分:4)

如果你创建一个引用类型的数组,我认为只有引用保存在变量中。那就是:

Dim strArray(5) As String

实际上只有6个引用大,每个引用有4个字节(不确定)。

实际数据将(可能)存储在堆上。

这并不意味着更改字符串的长度是微不足道的 - 每次更改时仍必须重新分配它们。

答案 1 :(得分:3)

在.NET中:

  • 数组通常存储在堆上(除非你在C#中使用stackalloc之类的东西)
  • 如果您创建一个引用类型值数组(例如字符串),则数组包含引用
  • 运行32位CLR时引用为4个字节,运行64位CLR时引用为8个字节
  • 虽然数组本身在内存中是连续的,但没有什么可以说字符串本身是连续的

所以在你的情况下,数组对象本身将是

normal object overhead 
+ 4 bytes for the length (IIRC) 
+ (4 or 8 bytes per element) * 6 elements

数组中的引用可以引用内存中任何位置的任何字符串,或Nothing

对于值类型,数组直接保存值 - 因此Int32的数组将占用:

normal object overhead
+ 4 bytes for the length
+ 4 bytes per element

Int64的数组将采用:

normal object overhead
+ 4 bytes for the length
+ 8 bytes per element

(等)。尽管逻辑上只是一个位,但布尔值每个元素占用一个字节。