C# 如何尽可能有效地保存字符串列表(内存)?

C# 如何尽可能有效地保存字符串列表(内存)?,c#,arrays,list,memory-management,C#,Arrays,List,Memory Management,我有一大堆字符串。我想保持这些列表的内存效率。我试图保留一份清单。但是,每个字符串有5个字符,它使用24个字节。也就是说,应该有一些架空区域 然后,我尝试保留一个字符串数组。内存的使用效率有点高。但是,我仍然有内存使用问题 如何保存字符串列表?我知道“C#为每个字符保留2个字节”。我想保存一个5个字符的字符串,5*2=10字节。但是,为什么这个过程使用24字节 谢谢你的帮助 64位.NET中任何对象的最小大小为24字节 在32位中,它稍微小一点,但对象头总是至少有8个字节,这里我们希望字符串存储

我有一大堆字符串。我想保持这些列表的内存效率。我试图保留一份清单。但是,每个字符串有5个字符,它使用24个字节。也就是说,应该有一些架空区域

然后,我尝试保留一个字符串数组。内存的使用效率有点高。但是,我仍然有内存使用问题

如何保存字符串列表?我知道“C#为每个字符保留2个字节”。我想保存一个5个字符的字符串,5*2=10字节。但是,为什么这个过程使用24字节

谢谢你的帮助


64位.NET中任何对象的最小大小为24字节

在32位中,它稍微小一点,但对象头总是至少有8个字节,这里我们希望字符串存储它的长度(4个字节)。8 + 4 + 10 = 22. 我猜它还希望/需要所有对象都是4字节对齐的。因此,如果将它们存储为对象,则不会得到更小的表示

如果都是7位ASCII类型的字符,可以将它们存储为字节数组,但每个数组仍会占用一些空间


您最好的方法(我知道这一位更像注释)是提出不同的处理算法,而不需要它们同时都在内存中。

64位.NET中任何对象的最小大小都是24字节

在32位中,它稍微小一点,但对象头总是至少有8个字节,这里我们希望字符串存储它的长度(4个字节)。8 + 4 + 10 = 22. 我猜它还希望/需要所有对象都是4字节对齐的。因此,如果将它们存储为对象,则不会得到更小的表示

如果都是7位ASCII类型的字符,可以将它们存储为字节数组,但每个数组仍会占用一些空间


你最好的方法(我知道这一点更像是注释)是提出不同的处理算法,而不需要它们同时都在内存中。

首先,请注意以正确的大小创建的
列表
字符串[]
(相同大小)对于任何非平凡的大小都是无关紧要的;
List
实际上只是具有insert/resize/etc功能的
T[]
的花式包装。如果您只需要保存数据:
T[]
很好,但
List
通常也是如此

至于字符串-不是C保留了任何东西-是.NET定义了
string
是一个对象,它在内部是一个长度(
int
)加上
char
数据的内存,每个
char
2个字节。但是:.NET中的对象有对象头、填充/对齐等,重要的是:最小大小。因此,是的,它们占用的内存比您试图表示的原始数据要多


如果只需要实际数据,您可能不需要将数据存储为
字符串
,而是存储为原始内存-一个简单的大
字节【】
字节*
,或者作为一对成对的
int[]
/
int*
(用于页面的长度和/或偏移量)和
字符【】
/
char(对于实际字符数据)或
字节[]
/
字节*
,如果您可以使用编码数据(即您主要对IO工作感兴趣)。但是,使用这种表单将非常不方便。
-除非您使用的是
字符串
,否则几乎没有通用API愿意与您一起使用。有一些API接受原始字节/字符数据,但它们主要是编码器/解码器API和一些IO API。因此:除非您使用的是
字符串,否则它不会最近,出现了一些
Span
/
Span
API,这会稍微减少一些不便(如果您可以使用最新的.NET核心版本等),但是:我强烈怀疑,在大多数情况下,您只需要接受
字符串的开销,并接受它。

首先,请注意以正确大小创建的
列表与
字符串[]
(大小相同)之间的区别对于任何非平凡的大小来说都是无关紧要的;
List
实际上只是具有insert/resize/etc功能的
T[]
的花式包装器。如果您只需要保存数据:
T[]
很好,但是
List
通常也是如此

至于字符串-不是C保留了任何东西-是.NET定义了
string
是一个对象,它在内部是一个长度(
int
)加上
char
数据的内存,每个
char
2个字节。但是:.NET中的对象有对象头、填充/对齐等,重要的是:最小大小。因此,是的,它们占用的内存比您试图表示的原始数据要多

如果只需要实际数据,您可能不需要将数据存储为
字符串
,而是存储为原始内存-一个简单的大
字节【】
字节*
,或者作为一对成对的
int[]
/
int*
(用于页面的长度和/或偏移量)和
字符【】
/
char(对于实际字符数据)或
字节[]
/
字节*
,如果您可以使用编码数据(即您主要对IO工作感兴趣)。但是,使用这种表单将非常不方便。
-除非您使用的是
字符串
,否则几乎没有通用API愿意与您一起使用。有一些API接受原始字节/字符数据,但它们主要是编码器/解码器API和一些IO API。因此:除非您使用的是
字符串,否则它不会最近,一些
Span
/
Span
API出现了,这将使