0

我正在存储一些带有 WideString 参数的类来描述它们(如名称、描述和其他一些)。现在,如果我将所有这些 WideStrings 更改为简单的“字符串”(实际上我使用的是别名,所以我只需要更改一行),内存使用量大约会增加 5%!比以前...这怎么可能,因为字符串的每个字符都比 WideChar 小两倍?

提前致谢!

米。

4

6 回答 6

4

Delphi 内存管理器不会将所有未使用的内存释放给操作系统。碎片化也可能非常糟糕。两者都取决于您使用的实际内存管理器(FastMM 通常比 D7 中的库存内存管理器更好,但任何内存管理器都可以通过使用内存管理器特定的一系列内存使用模式来屈服)。此外,WideStrings,虽然它们是 COM 字符串,但不计入引用计数,甚至可能比普通字符串更晚才被释放。

在 Delphi 中查询实际内存消息的唯一可靠方法是询问您的 Delphi 程序使用的内存管理器。系统单元中的此功能为您执行此操作:

function GetHeapStatus: THeapStatus

——杰伦

edit: 20100104 in reaction to comment by Marco: (FastMM is usually better than the stock memory manager in D7, but any memory manager can be brought to it's knees by using a memory manager specific series of memory usage patterns)

于 2010-01-03T12:17:51.380 回答
0

这是可能的,因为这些字符串几乎肯定构成了用于运行程序的内存的(相对)一小部分。其他空间由手柄、各种对象等使用。

举例来说,假设您在使用 ANSI 字符串时有大约 100KB 的文本,而您将其转换为 Widestrings。只有那 100KB 会受到影响,但那 100KB 并不构成程序内存占用的每一个字节。空间将用于表单、句柄、数字和其他对象,但是因为它们在转换中没有被更改,所以它们显然不需要比转换前更多的内存。

于 2010-01-02T21:55:32.003 回答
0

WideStrings 使用不同的内存管理器(Windows 管理器)然后 AnsiStrings(Delphi 的)并且引用计数不同。你是如何测量内存使用量的?用什么工具和什么精确的计数器?

于 2010-01-02T22:40:51.953 回答
0

你如何衡量使用的内存?IIRC WideString 内存是使用 SysAllocString() 分配的,从而绕过了 Delphi 内存管理器。

于 2010-01-02T22:42:10.583 回答
0

Delphi 中的内存管理器总是占用比它真正需要的更多的内存。就是这样的速度提升。

于 2010-01-03T09:52:39.207 回答
0

不使用 WideString 时,您使用的是 AnsiString 还是 ShortString 类型?您是否有可能使用将所有“String”类型视为 ShortString 的 {$H–} 编译器标志(全局或在某个单元中)进行编译?如果您的字符串是 ShortString 类型并且您没有指定字符串大小,则分配的内存始终为 256 字节。

于 2010-01-03T11:43:37.840 回答