我很想知道与pascal相比,c ++中的字符串分配有什么不同。
如何分配字符串?
C ++也有char数组/ char * / const char *,这些都有不同之处……
由长度后跟一系列字符代码组成的字符串称为a 的 Pascal字符串 强> 。它更具描述性地称为长度前缀字符串。例如,使用Windows API创建的字符串 SysAllocString function,是一个长度为前缀的字符串,a.k.a。Pascal字符串。
SysAllocString
C ++原始字符串文字由字符代码后跟一个nullvalue组成 的 零终止字符串 强> 。
从C ++ 11及更高版本的C ++开始 std::string 有一个缓冲区,可以看作一个以零结尾的字符串,但它也有一个单独的显式长度。未指定存储长度或缓冲区的位置。这在实现之间有所不同
std::string
零终止字符串或Pascal字符串的存储可以以您希望的任何方式分配,动态或作为局部变量。
用C ++ std::string 缓冲区必须 一般来说 通过标准分配器动态分配 std::string 配备,因为字符串可能是非常大的,因为客户端代码没有办法提供缓冲区。
但是,不像 std::vector 没有要求 std::string 对于足够小的字符串禁止使用固定大小的缓冲区,现在提供了很多(大多数?)实现 短字符串优化 。对于足够短的字符串值,一切都可以直接适合 std::string 宾语。例如。作为局部变量。
std::vector
有一个C ++ 11和以后的常量时间要求 operator[] 对于 std::string ,这有效地防止了某些C ++ 03实现使用的COW(Copy On Write)共享所有权策略。
operator[]
Pascal字符串有多种实现方式。 Turbo Pascal字符串主要是静态分配的,Delphi中新增的字符串类型是动态的。 Delphi字符串末尾有一个null(但不是以null结尾,字符串可以包含空字符),而Turbo Pascal则不是。德尔福有4或5种类型,包括Turbo Pascal。
但是两者都坚持使用相同的粗糙模板 UCSD Pascal (字节码解释器成名)创造。
在许多以C为中心的文献中,“Pascal Strings”通常是关键特性之一,存储字符串的长度以便检索长度或指向最后一个字符的指针是O(1)操作。
此外,Delphi / Free Pascal也可以完全模拟手动C字符串,因为除了字面赋值之外,它基本上是一个库构造。