昨天我正在阅读C#参考,在那里看到了一条声明。请看下面的语句。
语境:
对Point使用结构而不是类可以在运行时执行的内存分配数量上产生很大差异。下面的程序创建并初始化一个100点的数组。将Point实现为一个类时,将实例化101个单独的对象-一个用于数组,一个用于100个元素。
class Point
{
public int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
class Test
{
static void Main() {
Point[] points = new Point[100];
for (int i = 0; i < 100; i++)
points[i] = new Point(i, i*i);
}
}
如果将Point实现为结构,例如
struct Point
{
public int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
只有一个对象被实例化-一个用于数组。Point实例在数组中内联分配。这种优化可能会被滥用。使用结构而不是类也可以使应用程序运行更慢或占用更多内存,因为按值传递结构实例会导致创建该结构的副本。
问题:我的问题是在值类型和引用类型的情况下如何进行内存分配?
困惑:为什么在《参考指南》中提到只能初始化1个对象。根据我对Array中每个对象的理解,将分配一个单独的内存。
编辑:可能重复此问题与jason建议的可能重复问题有些不同。我关心的是仅在值类型和引用类型的情况下如何分配内存,而该问题只是解释值类型和引用类型的概述。
引用类型的数组和值类型的数组之间的区别也许可以通过插图更容易理解:
每个Point
数组以及数组都分配在堆上,并且数组存储对每个数组的引用Point
。总共需要N + 1个分配,其中N是点数。您还需要额外的间接访问权限来访问特定字段,Point
因为您必须通过引用。
每个Point
都直接存储在数组中。堆上只有一个分配。访问字段不涉及间接。字段的内存地址可以直接从数组的内存地址,数组中项目的索引以及字段在值类型内部的位置来计算。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句