『随笔』.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+位阿里技术专家共同发起稳定性知识库开源项目
我们穿过山和大海,也见过人山人海.我们见过各类故障,也排过千雷万险.这一次,不如我们一起,开启稳定性的探索之旅.让无法解决的问题少一点点,让世界的确定性多一点点. 无论是前端业务的开发者,还是后端架构 ...
随机推荐
- 利用Python进行数据分析——pandas入门
利用Python进行数据分析--pandas入门 基于NumPy建立的 from pandas importSeries,DataFrame,import pandas as pd 一.两种数据结构 ...
- python访问mysql
1,下载mysql-connector-python-2.0.4 pythoin访问mysql需要有客户端,这个就是连接mysql的库 解压后如下图: 双击lib 以windows为例 把mysql ...
- 使用ADO.NET操作数据库
如有转载的请注明出处!蟹蟹 1.1使用对象连接OLE DB 数据源 OLE DB 数据源包含具有OLE DB 驱动程序的任何数据源,如SQL Server.Access.Excel.Oracle等. ...
- Cookie熟知
Cookie能干什么 会话(cookie,session)技术的一种.因为http协议是无状态的,每次都是基于一个请求一个响应.每次请求和响应都跟上次没有关系.我们需要记录之前对话信息.cookie技 ...
- 输入流IS和输出流OS学习总结
1.我们编写的程序,除了自身会定义一些数据信息外,经常还会引用外界的数据,或是将自身的数据发送到外界,比如我们编写的程序想读取一个文本文件, 又或者是我们想将程序的一些数据写到一个文件中,这时我们就要 ...
- seo优化做起来不是哪么简单,其实需要的是思维
SEO百科:随着人们互联网的认识水平的提升,SEO似乎也已经得到了更多的认识.无论是浅显还是深入,SEO一直被大众认为是简单的,甚至是不值得一提的东西,甚至认为SEO无非就是作弊,SEO并 ...
- OpenStack架构详解
OpenStack提供开放源码软件,建立公共和私有云. OpenStack是一个社区和一个项目,以及开放源码软件,以帮助企业运行的虚拟计算或者存储云. OpenStackd开源项目由社区维护,包括Op ...
- CoreData的简单使用
一.基础知识: CoreData是对SQLite的封装,使用的时候比较方便,减少对SQL语句的使用. CoreData中的核心对象 NSManagedObjectModel:代表Core Data 的 ...
- String和StringBuffer的区别?
这个我经常用的是String,说真的,用StringBuffer的次数还真是少,唯一让我觉得特别的方法就是appand这个方法是StringBuffer独有的,那么他们到底有什么区别呢,我们知道Str ...
- 纯CSS打造进度条
进度条效果如下: CSS部分 body { background-color: white; } .progress-bar { display: flex; flex-direction: row; ...