数组内存如何分配

第一个问题:

int [] test = new test[100];

我知道在堆中分配了100个单元的内存空间,但是在栈中存储的是堆中的地址,问栈中分配了几个单元的内存空间来存地址呢?
我自己查了下栈中好像是只保存了堆中100个单元的首地址,不大确定,求解?还有就是如果栈中只分配了一个单元存储堆中首地址的话,那我们test[10]这样查数组中的某个元素怎么定位的,是到堆中遍历数组吗?

第二个问题:

A [] test = new A[100];

A是一个类,网上是这么说的:会先在托管堆为test分配一次空间,并且这时不会自动初始化任何元素(即test[i]均为null)。等到以后有代码初始化某个元素的时候(A[0]=new A();),这个引用类型元素的存储空间才会被分配在托管堆上。
我想问的是"先在托管堆为test分配一次空间",这句话是什么意思,它分配了100个单位的内存空间吗?但后面A[0] = new A();进行实例化时,它才分配了真正存储数据的单元,但开始分配的100个单元的空间有什么用呢?

首先,如果你声明的是值类型的数组,那么CLR分配内存时在堆中一次性分配足够的内存空间,每个单元应该是所存储类型的两倍左右的容量,也就是200份int 类型的内存。该数据是已值方式存储的。

如果是引用类型的话会创建100分的地址存储引用空间,只是在没初始化数组中具体值的时候都每个单元都存储的是null引用,这个引用是4个字节长,当你对数组中某项初始化的时候,系统再次动态在堆中分配内存,并在这个数组项中存储新分配内存的引用。

原则:

1、简单的值类型的数组,每个数组成员是一个引用(指针),引用到栈上的空间(因为值类型变量的内存分配在栈上)

2、引用类型,类类型的数组,每个数组成员仍是一个引用(指针),引用到堆上的空间(因为类的实例的内存分配在堆上)

class Person{}

Person[] myPerson;

myPerson = new Person[2];

myPerson[0] = new Person;

myPerson[1] = new Person;

Persons是一个变量,它是一个可以容纳两个引用空间的内存块,
因为数组在声明定义的时候是能够知道元素个数的,所以在堆栈
上分配的内存空间是预先可以知道的
(这里的堆栈简化理解可以理解成为栈,在C++中由系统管理内存,
堆内存的管理是人工的C++中)
两个引用实际上就是两个指针变量,在32位机中,myPerson变量就是64字节(2*32)两个指针变量的内存
空间,这64字节的内存空间名字命名为myPerson

时间: 2024-10-15 00:32:23

数组内存如何分配的相关文章

C++二维数组内存分配

在C++中,用new和delete分配和释放内存: 1.例如,给一个4*5的二维数组分配内存 方法一:直接申请二维数组,逐一分配内存 1 int **array; 2 //分配内存 3 array=new int*[4]; 4 5 for (int i=0;i<4;i++) 6 array[i]=new int[5]; 7 8 //释放内存 9 for (int i=0;i<4;i++) 10 delete[] array[i]; 11 12 delete[] array; 方法二:按照一维数

内存的分配与回收

实验三  内存的分配与回收 物联网工程                      赖燕菲                   201306104147 一.实验目的 为了合理地分配和使用这些存储空间,当用户提出申请主存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间和使用情况,找出足够的空闲区域给申请者.当作业撤离归还主存资源时,则存储管理要收回占用的主存空间.主存的分配和回收的实现是与主存储器的管理方式有关的,通过本实验帮助我们理解在不同的存储管理方式下应怎样实现主存空间的分

动态数组,数组初始化,数组内存释放,向数组中添加一个元素,向数组中添加多个元素,数组打印,顺序查找,二分查找,查找数组并返回地址,冒泡排序,改变数组中某个元素的值,删除一个数值,删除所有,查找含有

 1定义接口: Num.h #ifndef_NUM_H_ #define_NUM_H_ #include<stdio.h> #include<stdlib.h> /************************************************************************/ /*数组的结构体类型                                                    */ /*******************

(转)Java 内存区域分配和垃圾回收(GC)机制

Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代 码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢.这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制.概括地说,该机制对 JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop

C语言动态分配二维数组内存

C语言内存管理主要包括malloc().remalloc().free()三个函数. malloc原型 extern void *malloc(unsigned int num_bytes); m行n列的 二维数组的分配,主要有三种方法: 一.分配一个长度为m的二级指针,指针的指向的内容分别指向一个长度为n的一位数组 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h>

C++中关于[]静态数组和new分配的动态数组的区别分析

这篇文章主要介绍了C++中关于[]静态数组和new分配的动态数组的区别分析,很重要的概念,需要的朋友可以参考下 本文以实例分析了C++语言中关于[]静态数组和new分配的动态数组的区别,可以帮助大家加深对C++语言数组的理解.具体区别如下: 一.对静态数组名进行sizeof运算时,结果是整个数组占用空间的大小:因此可以用sizeof(数组名)/sizeof(*数组名)来获取数组的长度.int a[5]; 则sizeof(a)=20,sizeof(*a)=4.因为整个数组共占20字节,首个元素(i

内存连续分配管理方式

内存连续分配方式,是指为一个用户程序分配一个连续的内存空间.它主要包括单一连续分配.固定分区分配和动态分区分配. 单一连续分配 内存在此方式下分为系统区和用户区,系统区仅提供给操作系统使用,通常在低地址部分:用户区是为用户提供的.除系统区之外的内存空间.这种方式无需进行内存保护. 这种方式的优点是简单.无外部碎片,不需要额外的技术支持.缺点是只能用于单用户.单任务的操作系统中,有内部碎片,存储器的利用率极低. 固定分区分配 固定分区分配是最简单的一种多道程序存储管理方式,它将用户内存空间划分为若

C语言:内存的分配与管理

1.内存区域的划分标准: 代码段             存储代码 数据段             静态/全局数据.常量(const) 堆区(heap)      动态内存分配(更灵活的设置容器大小存储数据) 栈区(stack)     局部变量.函数参数 2.内存分配方式的原理:静态分配和动态分配 静态分配:编译器在处理程序源代码时分配(变量) 动态分配:程序执行时按动态要求来分配(由程序员来决定,用完得人为释放) 比较:静态的程序执行前分配,效率高,灵活差,对象是有名字的变量,内存分配和释放

Java内存管理第二篇 - 内存的分配

Java内存管理无非就是对内存进行分配和释放.对于分配来说,基本类型和对象的引用存储到栈中,常量存储到常量池中,对象存储到堆上,这是一般的分配.而对于回收来说要复杂的多,如果回收不好,还可能造成分配出去的内存得不到回收而造成内存泄漏. 这一篇将简单介绍一下Java内存的分配,下一篇将介绍内存的回收及内存泄漏等知识. 1.JVM内存模型 1.程序计数器(Program Counter Register): 程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,可以理解为是