帕斯卡字符串得名于一种具有极大影响力的帕斯卡实现,叫做UCSD,因此“UCSD字符串”是一个更好的术语。这也是使字节码解释器流行的相同实现。
一般来说,它不是一个具体的类型,而是基于在字符数据前加上长度前缀的基本原理。这使得获取长度成为一个常数时间操作(O(1)),而不是扫描字符数据寻找空字符。
并非所有的帕斯卡都使用这个概念。我回想起来,最初(七十年代)的惯例是填充分配的空间,并向后扫描一个非空格字符(使字符串无法有一个终止空格)。此外,由于软件大多用于隔离,各种方案被使用,通常基于那个实现/架构的优点。
尽管该结构不是标准帕斯卡的一部分,但 Borland 最流行的方言(Turbo Pascal、Delphi 和 Free Pascal)一般基于 UCSD 方言,在其中使用帕斯卡字符串,Delphi 目前拥有 5 种这样的字符串。(short/ansi/wide/unicode/open)
另一方面,这意味着在循环中,您需要一些基于索引的附加检查来检查字符串的末尾。
因此,代替使用复制字符串:
while (p^) do begin P^=p2^
其完全等同于
while (*s++ = *t++)
在使用优化编译器时,需要执行例如C中的操作。
while (len>0) do begin p^:=p2^
甚至更多
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)操作访问最后一个被占用字符的优点,而且没有禁止使用的字符。
长度前缀字符串在文件格式中也被广泛使用,因为显然知道要读取的字节数是很有用的。