德尔福,串WideString的VS内存使用问题,非Unicode VCL(D7)
-
22-09-2019 - |
题
我存储一些类与WideString的参数描述它们(如名称,描述和一些其他)。现在,如果我改变所有这些WideStrings简单的“字符串”(我使用别名竟让我不得不改变只有一条线),内存使用情况是更大的约5%!比以前... 如何是可能的,因为所述串的每一字符比WideChar?
小两倍由于事先!
米。
解决方案
Delphi的存储器管理器不释放所有未使用的内存给操作系统。碎片也可以踢的非常糟糕。都取决于你实际使用的内存管理器(FastMM通常比在D7股票内存管理器是越多越好,但是任何内存管理器可以使用内存管理器特定系列内存使用模式带到它的膝盖)。此外,WideStrings,虽然都是COM字符串,不参考计数,并且可能无法甚至以后释放比正常琴弦。
Delphi中查询实际存储信息的唯一可靠方法是要求内存管理你的Delphi程序使用。 此功能在系统单元的确,对于你:
function GetHeapStatus: THeapStatus
- 的Jeroen
编辑:20100104中由Marco反应评论: (FastMM通常比在D7股票存储器管理器是较好的,但任何存储器管理器可通过使用存储器管理器特定一系列存储器使用模式被带到它的膝盖)
其他提示
这是可能的,因为这些字符串几乎肯定构成用于运行程序存储器的(相对)小的一部分。其它的空间被用于手柄,各种对象等
例如起见,我们假设你使用ANSI字符串时,有关于文本的100KB和将其转换为Widestrings代替。只有那些100KB会受到影响,但这些100KB并不构成程序的内存占用的每一个字节。空间将被用于形式,把手,数字,和其它的目的,但由于它们不被在转换改变,他们显然不会需要比转换之前更多的存储器。
WideStrings使用不同的内存管理器(一个窗口中的一个),然后AnsiStrings(Delphi的),并且参考计数不同。你是如何衡量内存使用情况?用什么工具,什么确切的柜台?
您如何衡量内存使用? IIRC WideString的存储器使用SysAllocString(),从而旁路所述的Delphi内存管理器分配。
在Delphi内存管理总是需要更多的内存,比它真正需要。它是这样的速度的提高。
您使用AnsiString类型或者是不使用WideString的时候ShortString短类型?有没有可能是你用{$ H-}编译器标志编译(全局或在某些单元)将所有“字符串”类型,ShortString短?如果你的字符串是ShortString短型的和你不指定字符串的大小,然后分配的内存始终是256个字节。