gpt4 book ai didi

string - 什么是帕斯卡字符串?

转载 作者:行者123 更新时间:2023-12-03 13:57:13 25 4
gpt4 key购买 nike

它们是以编程语言还是数学家命名的?

帕斯卡字符串的定义特征是什么?在 Wikipedia's article on strings似乎定义特征是将字符串的长度存储在第一个字节中。在另一篇文章中,我的印象是 the memory layout of the strings也很重要。

在细读一个无关的 SO 线程时,有人提到 Pascal strings make Excel fast . Pascal 字符串与空终止字符串相比有哪些优势?或者更一般地说,Pascal 字符串在什么情况下表现出色?

Pascal 字符串是否以任何其他语言实现?

最后,我是将两个单词都大写(“Pascal Strings”)还是只大写第一个(“Pascal strings”)?我是技术文...

最佳答案

Pascal 字符串因一种特定但影响巨大的 Pascal 实现而流行,名为 UCSD。所以 UCSD 字符串 是一个更好的术语。这与使字节码解释器流行的实现相同。
一般来说,它不是一种特定的类型,而是将大小作为字符数据前缀的基本原则。这使得获取长度成为一个恒定时间操作 (O(1)),而不是扫描字符数据中的空字符。
并非所有帕斯卡都使用这个概念。 IIRC,原始(七十年代)约定是用空格填充分配,并向后扫描非空格字符(使字符串不可能有终止空格)。此外,由于软件大多是孤立使用的,因此使用了各种方案,通常基于对该实现/架构有利的内容。
虽然该结构不是 Standard Pascal 的一部分,但最流行的 Borland 方言(Turbo Pascal、Delphi 和 Free Pascal)通常基于 UCSD 方言,因此有 pascal 字符串,Delphi 目前有 5 个这样的字符串。 (短/ansi/宽/unicode/开放)
另一方面,这意味着在循环中,您需要一些基于索引的额外检查来检查字符串的结尾。
所以改为使用复制字符串

while (p^) do begin P^=p2^; inc(p) inc(p2); end;
这完全等同于
while (*s++ = *t++);
在 C 中使用优化编译器时。
你需要做例如
while (len>0) do begin p^:=p2^; inc(p) inc(p2); dec(len); end;
甚至
i:=1;
while (i<=len) do begin p[i]:=p2[i]; inc(i); end;
这使得 Pascal 字符串循环中的指令数量略大于等效的零终止字符串,并增加了一个实时值。此外,UCSD 是一种字节码(p-code)解释器语言,后者基于 pascal 字符串使用的代码是“安全的”。
对于内置后增量 (++) 运算符的架构(如最初为 PDP-8,11 开发的 C),指针版本甚至更便宜,特别是没有优化。如今,优化编译器可以轻松检测任何这些构造并将它们转换为最佳构造。
更重要的是,由于 90 年代初期的安全性变得更加重要,并且通常不赞成仅依赖空终止字符串属性,因为验证中的小错误可能会导致潜在的可利用的缓冲区溢出问题。因此,C 及其标准不赞成使用旧的字符串,现在使用需要传递最大长度的旧字符串例程(strNcpy 等)的“-n-”版本。这是添加了相同的额外实时值,类似于长度,就像手动管理的 Pascal 字符串原则一样,程序员必须注意传递长度(或 C 的 -N- 函数的最大缓冲区大小)。 Pascal 字符串仍然具有在 O(1) 操作中获取最后一个占用字符的优势,并且没有禁止字符的事实。
长度前缀字符串也广泛用于文件格式,因为很明显,知道预先读取的字节数很有用。

关于string - 什么是帕斯卡字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25068903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com