Matlab 的内存分配机制

1、创建和修改数组——基本思想是保持内存的连续性
(1)当为数组赋值时,Matlab在内存中分配连续的虚拟块,在另一个地方,将数组的类型和维数等保存为头信息。
(2)当向数组增加新元素时,如果原来位置的连续内存区域可以容纳新增加的数据,则扩大分配的内存,然后增加元素;如果连续块不够大,需要先重新分配能够容纳原有数据和新增数据的连续内存块,再将原有数据拷贝到新分配的内存中(在此期间,内存中会有原来数据的两份拷贝,增加了out of memory的风险),并添加新的元素到新的块中,然后释放原来的内存。
(3)当删除数组元素时,先移除元素,再压缩原来分配的空间。

2、数组的拷贝

(1)当将一个数组赋值给另一个变量时,不会为新变量分配内存,新变量只是到原来数组的引用,直到新变量中元素值改变时,才会为其分配内存。
(2)通过参数传递给函数的数据,当数据内容发生改变时才会分配内存,函数内部新的数据通过返回值传递给调用该函数的函数。

3、数组头

(1)由于数组头占据存储空间(虽然不多),数据存放在几个大数组中要由于存放在多个小数组中。
(2)对结构体和元胞(cell)数组,Matlab不仅为他们创建头信息,还为结构体的每个字段和元胞数组的每个元素创建头信息,因此结构题和元胞数组消耗的内存与其创建方式有关。
(3)whos函数只能查看数据占用的存储空间,不会显示头信息占用的空间。

4、数据结构与内存

(1)8-bit、16-bit、32-bit、64-bit的有符号整型或无符号整型分别占用1、2、4、8字节空间,单精度、双精度浮点数分别占用4、8字节空间。
(2)复数的实部和虚部分别占用存贮空间,当修改实部或虚部时,会同时复制实部和虚部。
(3)当数组的元素绝大部分为0时,用稀疏矩阵存贮以节省空间。

5、内存占用计算

(1)元胞数组占用的空间计算方法为:(header_size x number_of_cells) + data,对于64位系统,header_size为112,查看header_size的方法: A = {[]}, whos A。A = {1 2 3}, A = {[1 2 3]}, A = {{1 2 3}}占用的字节数分别为:112×3+8×3,112×1+8×3,112×4+8×3。
(2)64bit系统中结构体占用空间的计算方法:fields x ((112 x array elements) + 64) + data (32bit系统中将112改为60)。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值