【问题标题】:Difference between c++ and pascal strings [closed]c ++和pascal字符串之间的区别[关闭]
【发布时间】:2018-01-22 13:21:18
【问题描述】:

我很想知道 c++ 中的字符串分配与 pascal 相比有什么区别。

字符串是如何分配的?

C++也有char数组/char*/const char*,它们在分配和使用上有什么不同?

【问题讨论】:

  • 你可以从 here 的某个地方找出 C++ 方面。
  • 这个问题有非常明确的狭义答案。一点都不宽泛,更别提“太宽泛”了。
  • 我已经投票决定重新开放,因为我确信我会从这个问题中学到一些东西。
  • @Cheersandhth.-Alf 回答这个问题意味着您要写一篇关于 C 字符串如何工作以及 Pascal 字符串如何工作以及它们之间的区别的文章。没有这样的答案,你永远做不到。因此,这个问题非常适合“过于宽泛”的密切原因。
  • @Cheersandhth.-Alf,没错。这就是我说 Delphi 字符串的原因。

标签: c++ string pascal allocation


【解决方案1】:

由一个长度和一系列字符代码组成的字符串称为Pascal string。它更具描述性地称为长度前缀字符串。例如,使用 Windows API 的 SysAllocString 函数创建的字符串是一个以长度为前缀的字符串,也就是 Pascal 字符串。

一个 C++ 原始字符串文字由字符代码和一个空值组成,一个以零结尾的字符串

从 C++11 和更高版本开始,C++ std::string 有一个可以被视为以零结尾的字符串的缓冲区,但它也有一个单独的显式长度。没有指定存储长度或缓冲区的位置。这因实现而异。


零结尾字符串或 Pascal 字符串的存储可以按照您希望的任何方式动态分配或作为局部变量分配。

对于 C++ std::string,缓冲区必须通常通过std::string 配备的标准分配器动态分配,因为字符串可以任意大,并且因为存在客户端代码无法提供缓冲区。

但是,与 std::vector 不同的是,std::string 没有要求为足够小的字符串禁止固定大小的缓冲区,并且现在很多(大多数?)实现都提供了短字符串优化 .对于足够短的字符串值,所有内容都可以直接放入std::string 对象中。例如。作为局部变量。


std::stringoperator[] 有 C++11 及更高版本的恒定时间要求,这有效地阻止了某些 C++03 实现使用的 COW(写入时复制)共享所有权策略。

【讨论】:

  • 这是一个可怕的 wiki 段落,完全没有来源。显然作者对帕斯卡字符串了解不多。
  • @MarcovandeVoort:我同意你的字面意思。 Wikipedia para 的作者似乎将这个概念限制为八位字节大小的长度前缀,就像在 Turbo Pascal 中一样,所以我将 Windows SysAllocString 示例作为一个平衡点。关于 Pascal 字符串(一般概念,而不是文字“Pascal 实现中使用的字符串”)(stackoverflow.com/questions/25068903/what-are-pascal-strings),没有不好的 SO 答案。
  • @MarcovandeVoort:也就是说,我在 1982 年在 HP3000 上学习了 Pascal,在大多数实现中,我们使用 packed array of char 作为字符串。然而,在大学的第二年,我们必须使用带有 UCSD p-Pascal 的 DEC Rainbow 小型工作站。我记得string 类型... :-)
  • 如果您的意思是那里的第一个回复,出于显而易见的原因,我同意。这也是为什么我的帖子中的链接“UCSD Pascal”链接到您命名的文章的原因。顺便说一句,你的 Hp3000 帕斯卡的结束方式是什么?空格填充?
  • 哦,是你。抱歉,我没注意到。需要咖啡!
【解决方案2】:

Pascal 字符串有多种实现。 Turbo Pascal 字符串大多是静态分配的,而 Delphi 中新出现的字符串类型是动态的。 Delphi 字符串末尾有一个空值(但不是以空值结尾的,字符串可以包含空字符),而 Turbo Pascal 不是。 Delphi 有 4 或 5 种这样的类型,包括 Turbo Pascal 的一种。

但是两者都遵循UCSD Pascal(字节码解释器的名声)创造的相同粗略模板。

在许多以 C 为中心的文献中,“Pascal 字符串”通常是关于关键特征之一,即存储字符串的长度,以便检索长度或指向最后一个字符的指针是 O(1) 操作。

此外,Delphi/Free Pascal 还可以完全模拟手动 C 字符串,因为这基本上是一个库结构,除了文字赋值。

【讨论】:

  • 谢谢 :) 这给了我一个很好的起点
  • 您可能也想阅读这篇文章:"PChars: no strings attached"。它是关于 Delphi 的字符串类型以及它们如何与 C 风格的“字符串”相关的,但应该对各种 Pascal 实现很有用。
猜你喜欢
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 2017-01-29
  • 2014-05-20
  • 1970-01-01
相关资源
最近更新 更多