『随笔』.Net 底层 数组[] 的 基本设计探秘 512 子数组
static void Main(string[] args)
{
Console.ReadKey(); //初始化数组 不会立即开辟内存字节, 只有实际给数组赋值时 才会开辟内存
//
//猜测数组内部的实现原理如下:
//
// > 数组内部 还有一个 数组集合
// > 赋值时, 会通过索引找到 对应的那个 数组集合的子数组, 然后初始化这个 子数组
// > 取值时, 如果索引对应的 子数组还没有创建, 则直接返回 NULL
//
// > 经过下面代码的 测算, 子数组的长度为 512 左右
// > 比如: 你初始化一个 2048 个元素的数组, 数组内部其实开辟了 4个子数组
//
// > 下面的 array 和 array2,
// 前者 i=i+1 肯定会 初始化每一个 子数组
// 后者 i=i+512 会跳跃定位 子数组
// > 最后 array 和 array2 占用内存一样多 —— 即: 跳跃 512 依然完成了全部子数组的初始化 object[] array = new object[ * * ]; //NULL 每个占 8 字节 总内存 173M
for (int i = ; i < array.Length; i = i + )
array[i] = null; object[] array2 = new object[ * * ];
for (int i = ; i < array2.Length; i = i + ) //i=i+1 i=i+512 最后开辟的内存是一样多的 (索引跳跃512 就会定位到 下一个子数组, 然后初始化这个 子数组)
array2[i] = null; //int[] array3 = new int[20 * 1024 * 1024]; //Int32 每个占 4 字节
//for (int i = 0; i < array3.Length; i = i + 1)
// array3[i] = 1; Console.ReadKey(); }
测试代码 比较简单。
32位程序,启动时 8M,
开辟 object[] 数组,全部赋值 NULL,内存飙到 173M
object 在 数组中的指针 占 8 字节
通过跳跃赋值, 得出结论:
数组内部 包含 若干个 子数组, 子数组 固定长度 512(左右)
『随笔』.Net 底层 数组[] 的 基本设计探秘 512 子数组的更多相关文章
- 『随笔』WCF开发那些需要注意的坑
执行如下 批处理:"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\svcutil.exe" http://127.0.0.1: ...
- 『随笔』C# 程序 修改 ConfigurationManager 后,不重启 刷新配置
基本共识: ConfigurationManager 自带缓存,且不支持 写入. 如果 通过 文本写入方式 修改 配置文件,程序 无法刷新加载 最新配置. PS. Web.config 除外:Web. ...
- 『随笔』Socket 链接 必须 上下行 同时使用
结论: > Socket 理论上 支持 只上行,或者 只下行. > 心跳包 必须是 上下行的 —— 心跳包请求(上行) - 心跳包响应(下行). > 如果 长时间 只有单向链接(只发 ...
- [LeetCode] Split Array with Equal Sum 分割数组成和相同的子数组
Given an array with n integers, you need to find if there are triplets (i, j, k) which satisfies fol ...
- [LeetCode] 548. Split Array with Equal Sum 分割数组成和相同的子数组
Given an array with n integers, you need to find if there are triplets (i, j, k) which satisfies fol ...
- js 数组相减 (一个数组去掉不符合条件的子数组)
数组相减?我也希望将来在ES8或者更好js版本能带来数组之间相互运算的方法,但是现在不能,咱们只能靠已有的方法实现: var arr1 = [2,3,5,88,99,444,66],arr2 = [2 ...
- Leetcode 523.连续的子数组和
连续的子数组和 给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数. 示例 1: ...
- 『cs231n』通过代码理解风格迁移
『cs231n』卷积神经网络的可视化应用 文件目录 vgg16.py import os import numpy as np import tensorflow as tf from downloa ...
- 『StabilityGuide』| 10+位阿里技术专家共同发起稳定性知识库开源项目
我们穿过山和大海,也见过人山人海.我们见过各类故障,也排过千雷万险.这一次,不如我们一起,开启稳定性的探索之旅.让无法解决的问题少一点点,让世界的确定性多一点点. 无论是前端业务的开发者,还是后端架构 ...
随机推荐
- mysql-索引、关系、范式
索引 几乎所有的索引都是建立在字段之上 索引:系统根据某种算法,将已有的数据(未来可能新增的数据也算),单独建立一个文件,这个文件能够快速的匹配数据,并且能够快速的找到对应的表中的记录 索引意义 能够 ...
- vim编辑器常见命令归纳大全
Esc:命令行模式 i:插入命令 a:附加命令 o:打开命令 c:修改命令 r:取代命令 s:替换命令 以上进入文本输入模式 : 进入末行模式 末行模式: w:保存 q:退出,没保存则无法退出 w ...
- 基于DP的LCS(最长公共子序列)问题
最长公共子序列,即给出两个序列,给出最长的公共序列,例如: 序列1 understand 序列2 underground 最长公共序列undernd,长度为7 一般这类问题很适合使用动态规划,其动态规 ...
- WordPress调用特色图片地址源,去除特色图片img标签其他样式
我们在制作WordPress主题时候想要给wordpress特色图片,这也是为了更加的美观,但是我们直接使用wordpress特色图片引用代码的时候却发现,出现下面的情况. wordpress特色图片 ...
- ORC文字识别软件破解版
下载地址:http://pan.baidu.com/s/1bnCiXdl 点击 然后可以免费用了ABBYY了!!
- Unity3D学习(四):小游戏Konster的整体代码重构
前言 翻了下之前写的代码,画了个图看了下代码结构,感觉太烂了,有很多地方的代码重复啰嗦,耦合也紧,开个随笔记录下重构的过程. 过程 _____2017.10.13_____ 结构图: 目前发现的待改进 ...
- mysql由于权限问题看不到用户数据库
一.登录数据库 [root@localhost ~]# mysql -u root mysql > show databases; +--------------------+| Databas ...
- linux几种时间函数总结
一.linux时间函数总结 最近的工作中用到的时间函数比较频繁,今天抽时间总结一下,在linux下,常用的获取时间的函数有如下几个: asctime, ctime, gmtime, localti ...
- no system images installed for this target这个问题如何解决?
今天想查看个项目的布局,结果发现这个Hierarchy这个工具没有提供对实体机的支持,所以就想加一个模拟机,结果还曝出了这么么一个错误,导致不能设置模拟机: 在网上的查找下,发现原来是缺失了 圈中的是 ...
- Linux时间子系统之(二):软件架构
专题文档汇总目录 Notes:从框架上讲解了时间子系统,从底向上包括CPU Local TImer.Global Counter.Clock Souce/Clock Events模块管理.Tick D ...