Ufu*_*fuk 1 c# arrays memory-management list
我有一个巨大的字符串列表.我想把这些列表保存为内存效率.我试图抓住一个清单.但是,它为每个包含5个字符的字符串使用24个字节.也就是说,应该有一些开销区域.
然后,我试着抓住一个字符串数组.内存使用率有点高效.但是,我还有内存使用问题.
我怎么能拿一个字符串列表?我知道"C#为每个字符保留2个字节".我想要一个包含5个字符的字符串,即5*2 = 10个字节.但是,为什么它在这个过程中使用24个字节?
谢谢你的帮助.
首先,请注意,List<string> 以正确大小创建的 a与string[](相同大小)之间的差异对于任何非平凡大小都是无关紧要的; List<T>对于T[]insert/resize/etc功能来说,a 实际上只是一个花哨的包装器.如果你只需要保存数据:T[]很好,但List<T>通常也是如此.
至于字符串 - 它不是C#保留任何东西 - 它是.NET定义a string是一个对象,它在内部是一个length(int)加上char数据的内存,每个2个字节char.但是:.NET中的对象具有对象标题,填充/对齐等 - 而且重要的是:最小大小.所以,是的,它们占用的内存不仅仅是您尝试表示的原始数据.
如果你只需要实际的数据,你也许可以存储数据并不像string,但作为原始内存-无论是简单的大byte[]或byte*,或作为孪生对int[]/ int*(对于长度和/或偏移到网页)和char[]/ char*(对于实际的字符数据),或者byte[]/ byte*如果你可以使用编码数据(即你主要对IO工作感兴趣).但是,使用这样的表单将非常不方便 - 除非您正在谈论,否则几乎没有常见的API会与您一起玩string.有一些 API的接受原始字节/字符数据,但在很大程度上是编码器/解码器API,以及一些IO的API.再说一次:除非你正在做的事情:它不会结束.最近,出现了一些Span<char>/ Span<byte>API,这会使这稍微不那么不方便(如果你可以使用最新的.NET Core版本等),但是:我强烈怀疑在大多数情况下你只需要接受string开销并与之共存.
| 归档时间: |
|
| 查看次数: |
174 次 |
| 最近记录: |