【问题标题】:ShortString in Unicode VersionUnicode 版本中的短字符串
【发布时间】:2013-11-12 15:17:05
【问题描述】:

在旧的 Delphi 版本(ANSI 字符串)中,短字符串:

var Str: String[30];

可用于降低内存成本并且仍然具有 ANSI 编码。

在当前的 Unicode 版本中,ShortString 是否像上面一样,别名为某些 Unicode 编码版本?
这种做法在降低内存成本方面的优势是否仍然存在?

【问题讨论】:

  • 一分钟就能学会的论坛,为什么还要浪费5分钟? var s: string[10]; begin WriteLn(SizeOf(s):10, SizeOf(s[1]));
  • @Arioch'The 这种反复试验的方法也可以“证明”硬币总是正面朝上。我从不喜欢推荐反复试验。例如,您的方法没有发现使短字符串使用 Unicode 字符的隐藏编译器选项。诚然没有这样的选择,但如果它存在的话,你建议的反复试验不会揭示它。
  • 有趣的是关于使用短字符串降低内存成本的部分。几天前我做了相反的事情:用长字符串替换短字符串以减少内存占用。那我成功了吗?你打赌!我将一大堆实例降低到它们原始内存占用量的一小部分,包括长字符串的内存(如果有的话)。我不得不提到它是一个 pre-Unicode Delphi。
  • 感谢分享,如果我也遇到这种情况,我也会分享。

标签: string delphi unicode


【解决方案1】:

Delphi 短字符串始终使用 ANSI 编码,即使在现代 Unicode 支持的 Delphi 版本中也是如此。它们被认为是一种遗留数据类型,因此 Embarcadero 在引入 Unicode 时选择不进行更改。

不管怎样,使用短字符串并不一定会降低内存成本。只有当你的字符串都接近相同的长度时,它才会这样做。如果您的字符串在长度上有任何显着变化,那么使用动态(又名长)字符串会降低内存开销。

我不认为短字符串比动态字符串更好。它们的存在仅仅是因为它们早于动态字符串。如果首先发明了动态字符串,那么短字符串将不存在。事实上,它们在新的移动编译器中并不存在。换句话说,只需使用动态字符串。

【讨论】:

  • 我问是因为我将旧的 ANSI 应用程序移植到 Unicode 版本,并且它充满了 ShortString。我想我会把它们都改成字符串。
  • 是的,我认为这是明智的。注意程序边界的任何代码。通常,这将是将这些字符串写入/读取到文件的代码。
  • 我会做错事。我以为 ShortString 的每个字符都变成了 WideChar,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 2020-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 2019-02-18
相关资源
最近更新 更多