『随笔』.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+位阿里技术专家共同发起稳定性知识库开源项目
我们穿过山和大海,也见过人山人海.我们见过各类故障,也排过千雷万险.这一次,不如我们一起,开启稳定性的探索之旅.让无法解决的问题少一点点,让世界的确定性多一点点. 无论是前端业务的开发者,还是后端架构 ...
随机推荐
- Java程序算法设计视频分享,需要的来
每年都会有人说,IT行业饱和了,根本就找不到工作,其实,我想说的是,不是工作难找,而是你自己不够好! 前几天看到一CEO在微博上吐槽: 前几天招一算法工程师我们给了8万月薪*14+奖金,人家去阿里拿5 ...
- 用shell处理以下内容 1、按单词出现频率降序排序! 2、按字母出现频率降序排序! the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support
此题目有多种解法,sed.awk.tr等等,都可以解决此题,命令运用灵活多变. 编写shell脚本no_20.sh 解法1: #!/bin/bash ###-------------CopyRight ...
- mysql workbench EER图,里面的实线以及虚线的关系
ERWin里面线代表实体间的三种关系:决定关系(Identifying Relationship),非决定关系(None-Identifying Relationship),多对多(Many-To-M ...
- 网络Socket编程及实例
1 TCP和UDP介绍 在介绍TCP和UDP之前,有必要先介绍下网络体系结构的各个层次. 1.1 网络体系结构 协议:控制网络中信息的发送和接收.定义了通信实体之间交换报文的格式和次序,以及在报文传 ...
- Executor, ExecutorService 和 Executors 间的区别与联系
UML简要类图关系: 下面详细看一下三者的区别: Executor vs ExecutorService vs Executors 正如上面所说,这三者均是 Executor 框架中的一部分.Java ...
- underscore源码阅读
1:函数式编程初探 2:if(obj.length === +obj.length)的判断 3:JS对象属性用中括号表示的优点在于可以用变量表示属性 4:callee,caller---JS高级程序设 ...
- Jenkins持续集成项目搭建与实践——基于Python Selenium自动化测试(自由风格)
Jenkins简介 Jenkins是Java编写的非常流行的持续集成(CI)服务,起源于Hudson项目.所以Jenkins和Hudson功能相似. Jenkins支持各种版本的控制工具,如CVS.S ...
- Oracle-14:PLSQL
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- PL/SQL PL/SQL(Procedural Language):过程化sql语言! 在原本的sql语句之 ...
- 如何在苹果笔记本上装win7系统
有一哥们,他说他boss给他配了台苹果,可是很不习惯,让我给装一个win系统.以下是我从百度借鉴的: 步骤一 先使用Boot Camp 分割磁盘 1 在Finder工具条中点选"前往&q ...
- version.go
package blog4go const ( // 版本号 VERSION = "0.5.6" )