C++ 和 pascal 字符串之间的区别

Difference between c++ and pascal strings

本文关键字:区别 之间 字符串 pascal C++      更新时间:2023-10-16

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

如何分配字符串?

C++也有 char 数组/char*/const char*,它们在分配和使用方面有何不同?

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

C++原始字符串文本由字符代码后跟 nullvalue(以零结尾的字符串)组成。

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


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

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

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


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

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

然而,两者都遵循UCSD Pascal(字节码解释器成名)创造的相同粗略模板。

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

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