C++ 和 Pascal 字符串之间的区别
Difference between c++ and pascal strings
很想知道与 pascal 相比,c++ 中的字符串分配有何不同。
如何分配字符串?
C++也有chararrays/char*/const char*,它们在分配和使用上有何不同?
Pascal 字符串有多种实现。 Turbo Pascal 字符串大部分是静态分配的,Delphi 中新增的字符串类型是动态的。 Delphi 字符串末尾有空值(但不是以空值结尾,字符串可以包含空字符),而 Turbo Pascal 则不是。 Delphi 有 4 或 5 个这样的类型,包括 Turbo Pascal 类型。
然而,两者都遵循 UCSD Pascal(因字节码解释器而闻名)创造的相同粗略模板。
在很多以 C 为中心的文献中 "Pascal Strings" 通常是关于关键特征之一,存储字符串的长度以便检索长度或指向最后一个字符的指针是 O(1 ) 操作。
此外,Delphi/Free Pascal 还可以完全模拟手动 C 字符串,因为除了文字赋值之外,这基本上是一个库构造。
由长度后跟字符代码序列组成的字符串称为Pascal string。它更形象地称为长度前缀字符串。例如,使用 Windows API 的 SysAllocString
函数创建的字符串是长度前缀字符串 a.k.a。帕斯卡字符串。
C++ 原始字符串文字由字符代码后跟空值组成,零终止字符串。
从 C++11 开始,C++ std::string
有一个缓冲区,可以看作是一个以零结尾的字符串,但它也有一个单独的显式长度。没有指定长度或缓冲区的存储位置。这因实现而异。
以零结尾的字符串或 Pascal 字符串的存储可以按您希望的任何方式分配,动态分配或作为局部变量分配。
使用 C++ std::string
缓冲区必须 通常 动态分配,通过 std::string
配备的标准分配器,因为字符串可以任意大,因为客户端代码无法提供缓冲区。
然而,与 std::vector
不同的是,std::string
没有要求禁止为足够小的字符串使用固定大小的缓冲区,因此许多(大多数?)实现现在提供 短字符串优化。对于足够短的字符串值,所有内容都可以直接放入 std::string
对象中。例如。作为局部变量。
对于std::string
,operator[]
有一个C++11及以后的常量时间要求,这有效地防止了某些C++03使用的COW(写时复制)共享所有权策略实现。
很想知道与 pascal 相比,c++ 中的字符串分配有何不同。
如何分配字符串?
C++也有chararrays/char*/const char*,它们在分配和使用上有何不同?
Pascal 字符串有多种实现。 Turbo Pascal 字符串大部分是静态分配的,Delphi 中新增的字符串类型是动态的。 Delphi 字符串末尾有空值(但不是以空值结尾,字符串可以包含空字符),而 Turbo Pascal 则不是。 Delphi 有 4 或 5 个这样的类型,包括 Turbo Pascal 类型。
然而,两者都遵循 UCSD Pascal(因字节码解释器而闻名)创造的相同粗略模板。
在很多以 C 为中心的文献中 "Pascal Strings" 通常是关于关键特征之一,存储字符串的长度以便检索长度或指向最后一个字符的指针是 O(1 ) 操作。
此外,Delphi/Free Pascal 还可以完全模拟手动 C 字符串,因为除了文字赋值之外,这基本上是一个库构造。
由长度后跟字符代码序列组成的字符串称为Pascal string。它更形象地称为长度前缀字符串。例如,使用 Windows API 的 SysAllocString
函数创建的字符串是长度前缀字符串 a.k.a。帕斯卡字符串。
C++ 原始字符串文字由字符代码后跟空值组成,零终止字符串。
从 C++11 开始,C++ std::string
有一个缓冲区,可以看作是一个以零结尾的字符串,但它也有一个单独的显式长度。没有指定长度或缓冲区的存储位置。这因实现而异。
以零结尾的字符串或 Pascal 字符串的存储可以按您希望的任何方式分配,动态分配或作为局部变量分配。
使用 C++ std::string
缓冲区必须 通常 动态分配,通过 std::string
配备的标准分配器,因为字符串可以任意大,因为客户端代码无法提供缓冲区。
然而,与 std::vector
不同的是,std::string
没有要求禁止为足够小的字符串使用固定大小的缓冲区,因此许多(大多数?)实现现在提供 短字符串优化。对于足够短的字符串值,所有内容都可以直接放入 std::string
对象中。例如。作为局部变量。
对于std::string
,operator[]
有一个C++11及以后的常量时间要求,这有效地防止了某些C++03使用的COW(写时复制)共享所有权策略实现。