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

时间:2018-01-22 13:21:18

标签: c++ string pascal allocation

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

如何分配字符串?

C ++也有char arrays / char * / const char *,它们的分配和使用有何不同?

2 个答案:

答案 0 :(得分:3)

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

C ++原始字符串文字由字符代码后跟一个空值,一个零终止字符串组成。

从C ++ 11及更高版本开始,C ++ std::string有一个缓冲区可以被视为以零结尾的字符串,但它也有一个单独的显式长度。未指定存储长度或缓冲区的位置。这在实施之间有所不同。

零终止字符串或Pascal字符串的存储可以任意方式分配,动态或作为局部变量。

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

然而,与std::vector不同,std::string没有要求禁止固定大小的缓冲区以获得足够小的字符串,而且许多(大多数?)实现现在提供短字符串优化。对于足够短的字符串值,一切都可以直接适合std::string对象。例如。作为一个局部变量。

operator[] std::stringgrep有一个C ++ 11及更高版本的常量时间要求,这有效地防止了某些C ++ 03实现使用的COW(Copy On Write)共享所有权策略。

答案 1 :(得分:1)

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

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

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

此外,Delphi / Free Pascal也可以完全模拟手动C字符串,因为除了字面赋值之外,它基本上是一个库构造。