我很想知道与pascal相比,c ++中的字符串分配有什么不同。
如何分配字符串?
C ++也有char arrays / char * / const char *,它们的分配和使用有何不同?
答案 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::string
对grep
有一个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字符串,因为除了字面赋值之外,它基本上是一个库构造。