结构和类对象数组的内存分配

Zeb-ur-Rehman

昨天我正在阅读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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

结构和内存分配

来自分类Dev

结构和内存分配

来自分类Dev

对象数组的内存分配

来自分类Dev

对象数组的内存分配

来自分类Dev

接口和类对象内存分配之间的区别

来自分类Dev

类对象的C ++向量和动态内存分配

来自分类Dev

内存分配和char数组

来自分类Dev

为结构数组动态分配内存

来自分类Dev

分配内存以在C中保存结构数组

来自分类Dev

结构数组的动态内存分配

来自分类Dev

结构中数组的动态内存分配

来自分类Dev

填充结构数组并在堆上分配内存

来自分类Dev

从函数和内存分配返回结构

来自分类Dev

数据结构填充和内存分配

来自分类Dev

数据结构填充和内存分配

来自分类Dev

结构内的类对象数组

来自分类Dev

结构内的类对象数组

来自分类Dev

如何在结构数组中为typedef结构分配内存

来自分类Dev

C内存分配:结构中某个结构中的定长数组

来自分类Dev

C ++类数组内存重新分配

来自分类Dev

预分配内存到对象数组

来自分类Dev

结构/值类型的内存分配和取消分配

来自分类Dev

结构/值类型的内存分配和取消分配

来自分类Dev

类对象的C ++向量和动态内存分配-第2部分

来自分类Dev

数组结构,结构数组和内存使用模式

来自分类Dev

C#对象比较和内存分配

来自分类Dev

C#对象比较和内存分配

来自分类Dev

为我将在std :: map中使用的对象数组分配和释放内存的正确方法

来自分类Dev

如何为C中的结构数组正确分配内存?