有两个相同的数组需要双内存吗?

1 .net c# memory arrays indexing

我对如何处理内存的数组有一些问题的理解.我很难用语言解释,所以我会给你写一些代码:)

string[] arr1 = new string[10];
string[] arr2 = new string[10];

/* Fill 'arr1' with random strings */

for(int i = 0; i < 10; i++)
{
        arr2[i] = arr1[i]
} 
Run Code Online (Sandbox Code Playgroud)

这需要内存的2倍(arr1和arr2中的字符串大小)吗?

最初答案对我来说似乎非常明显"不",但后来我记得那个包含所有元素的数组存储在大量连续的内存中以便快速编制索引,所以目前我不知道:)

Bro*_*ass 7

是的,与具有单个阵列相比,它将占用内存的两倍,数组对象实例和它们占用的内存是完全分开的.

由于string是引用类型,每个数组将存储10个字符串引用.引用类似于指针,因为它们只包含描述("引用"),其中在内存中找到实际的对象实例(例如,内存地址).

这意味着arr1并且arr2在您的示例中具有实际指向相同10个字符串实例的引用(因为您只是复制引用).

对于另一方面包含值类型的数组(例如,任何基本类型或struct),该数组占用一个大块中数组中所有项所需的完整连续内存空间 - 每个值类型需要与其包含的字段一样多的空间.

  • 我认为这是非常误导的.如果我有一个包含10个字符串的数组,每个字符串有1 MB,那么这将消耗~10MB.如果我有另一个包含相同字符串的数组,它将不会消耗另外的~10MB,因此与单个数组相比,它不会"占用内存的两倍". (2认同)

svi*_*ick 7

第一个数组包含十个对字符串的引用,因此它需要内存来保存它们.这同样适用于第二个阵列.

但字符串是分开存储的.如果将字符串从一个数组复制到另一个数组,则不会分配额外的内存.

因此,在您的情况下,消耗的总内存是(忽略开销):

  • 参考尺寸的10倍 arr1
  • 参考尺寸的10倍 arr2
  • 10个字符串所需的内存,一次