c# list 容量_一文看懂C#中List的扩容机制

本文深入探讨C#中List的扩容机制,揭示其默认的翻倍扩容策略,并通过实例展示当List达到4194304个元素后再添加一个元素,实际占用空间会翻倍至32M。通过Windbg分析,确认了旧数组在扩容后并未立即释放,导致实际占用48M。文章提供了如何通过设置Capacity来压缩空间和自定义List实现更灵活的扩容策略,建议开发者根据业务需求合理使用List以避免不必要的内存开销。
摘要由CSDN通过智能技术生成

一:背景

1. 讲故事

在前一篇大内存排查中,我们看到了Dictionary正在做扩容操作,当时这个字典的count=251w,你把字典玩的66飞起,其实都是底层为你负重前行,比如其中的扩容机制,当你遇到几百万甚至千万的大集合这个扩容机制还真的需要挖一下,免的入戏太深,难以自拔。

二:List扩容机制

1. 如何查看

要想看它的扩容机制,可以用ILSpy去看看List的源码即可,非常简单。

从源码的 int num = (_items.Length == 0) ? 4 : (_items.Length * 2)可以非常清楚的看到,4个空间起步,后面都是*2的扩容,也就说当你有2^(n-1) + 1个元素,实际上你需要占用2^n个空间。

下面我用C#代码演示一下:

static void Main(string[] args)

{

var list1 = Enumerable.Range(0, (int)Math.Pow(2, 22)).ToList();

var list2 = new List(list1);

list2.Add(1);

Console.WriteLine($"list1.Capacity={list1.Capacity}");

Console.WriteLine($"list2.Capacity={list2.Capacity}");

Console.ReadLine();

}

------ output -------

list1.Capacity=4194304

list2.Capacity=8388608

从代码中可以看到,当List中已有 4194304个元素的时候,再往其中塞入一个元素,仅仅是多一个,在底层可是翻倍的空间占用哦,太可气了,要想往深处看可以用windbg看一下各自数组占用大小。

0:000>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值