C++ 和 pascal 字符串之间的区别
Difference between c++ and pascal strings
我很想知道 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::string
,operator[]
有一个 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 字符串,因为这基本上是一个独立于文字赋值的库结构。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- & 和 * 之间的区别
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- 析构函数和'delete'之间的区别
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- S() 与 S{} 之间的区别?