Delphi字符串共享问题

4
我有大量对象,每个对象都存储了一个文件名。所有文件名都在给定的基础目录下(我们称其为C:\BaseDir\)。现在我考虑两种方案:
  1. 将绝对路径存储在对象中。
  2. 将相对路径存储在对象中,并额外存储基础路径。
如果我正确理解Delphi字符串,那么第二种方法需要更少的内存,因为基础路径字符串是共享的——只要我像这样将同一个字符串字段传递给所有对象:
TDataObject.Create (FBasePath, RelFileName);

这种假设是正确的吗?在内存中只会有一个基本路径的字符串实例吗?

如果有人知道处理这种情况的更好方法,请随意发表评论。

谢谢!

2个回答

6

您说得对。当您使用两个字符串变量写 s1:=s2 时,内存中会有一个字符串,并且至少有两个指向它的引用。

您还问是否尝试减少内存中字符串的数量是一个好主意。这取决于您拥有的字符串数量相对于其他内存消耗对象的数量。只有您自己才能真正回答这个问题。


2
正如David所说,公共字符串将被共享(除非您使用ie UniqueString())。
话虽如此,这似乎是过早的优化。如果您实际上需要使用完整路径并且永远不需要单独使用目录和文件名部分,那么只有在真正遇到内存问题时才应考虑将它们拆分。 不断地连接基本部分和文件名部分可能会显著减慢程序的运行速度并导致内存碎片化。

过早的优化,是可以理解的。但是保持基本路径与相对路径分离可能有设计原因——比如使全局更改基本路径变得更容易,同时保持所有相对路径指向当前基本路径。但在这种情况下,最好将基本路径作为单独的全局字符串变量进行维护,并在每次文件访问之前将相对路径连接到对象中。 - Mark Wilsdorf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接