Kay*_*ues 17 string pascal data-structures
它们是以编程语言还是数学家命名的?
Pascal字符串的定义特征是什么?在Wikipedia关于字符串的文章中,似乎定义的特征是在第一个字节中存储字符串的长度.在另一篇文章中,我得到的印象是字符串的内存布局也很重要.
在阅读一个不相关的SO线程时,有人提到Pascal字符串使Excel快速运行.Pascal字符串优于以null结尾的字符串有什么优势?或者更一般地说,Pascal字符串在什么情况下表现优异?
Pascal字符串是否以其他语言实现?
最后,我是否将两个单词("Pascal Strings")或仅第一个("Pascal字符串")大写?我是技术作家......
Mar*_*ort 15
Pascal字符串受到一个特定的,但具有巨大影响力的Pascal实现,名为UCSD.所以UCSD Strings是一个更好的术语.这与使字节码解释器流行的实现相同.
一般来说,它不是一种特定类型,而是将大小作为字符数据前缀的基本原则.这使得获得长度为恒定时间操作(O(1))而不是扫描nul字符的字符数据.
并非所有帕斯卡都使用这个概念.IIRC,最初的(七十年代)惯例是空间填充分配,并向后扫描非空格字符(使字符串不可能有终止空间).此外,由于软件主要用于隔离,因此使用了各种方案,通常基于对该实现/体系结构有利的方案.
来自Borland(Turbo Pascal,Delphi和Free Pascal)的最流行的方言通常基于UCSD方言,因此有pascal字符串,Delphi目前有5个这样的字符串.(短/ ANSI /宽/ unicode的/打开的)
另一方面,这意味着在循环中,您需要根据索引进行一些额外的检查以检查字符串的结尾.
所以改为使用复制字符串
while (p^) do begin P^=p2^; inc(p) inc(p2); end;
Run Code Online (Sandbox Code Playgroud)
这完全等同于
while (*s++ = *t++);
Run Code Online (Sandbox Code Playgroud)
在C中使用优化编译器时.
你需要这样做
while (len>0) do begin p^:=p2^; inc(p) inc(p2); dec(len); end;
Run Code Online (Sandbox Code Playgroud)
甚至
i:=1;
while (i<=len) do begin p[i]:=p2[i]; inc(i); end;
Run Code Online (Sandbox Code Playgroud)
这使得Pascal字符串循环中的指令数略大于等效的零终止字符串,并添加了一个实时值.另外,UCSD是字节码(p-code)解释器语言,后一种基于pascal字符串使用的代码是"安全的".
如果体系结构内置了后增量(++)运算符(就像PDP-8,11的C是最初开发的那样),指针版本甚至更便宜,特别是没有优化.如今优化编译器可以轻松地检测这些结构中的任何一个,并将它们转换为最好的结构.
更重要的是,由于九十年代早期的安全性变得更加重要,并且通常仅依赖于空终止字符串属性,因为验证中的小错误可能导致潜在的可利用缓冲区溢出问题.因此,C及其标准不推荐使用旧的字符串,现在使用需要最大长度的旧字符串例程(strNcpy等)的"-n-"版本.这会增加相同的额外实时值,类似于长度,就像手动管理的Pascal字符串原则一样,程序员必须注意传递长度(或C的-N-函数的最大缓冲区大小).Pascal字符串仍然具有在O(1)操作中到达最后一个被占用的char的优点,并且事实上没有禁止的字符.
长度前缀字符串也广泛用于文件格式,因为很明显,前面读取的字节数很有用.
小智 10
这是一个古老的名字,可以追溯到"C语言与Pascal语言"实际上是人们所做的比较的日子.根据您的要求,它要么专门存储第一个字节中的长度,要么指任何长度前缀(两个字节,四个字节).其他内存管理细节不包括在内,它们依赖于实现,而不是C字符串的根本区别.
Pascal字符串擅长......一切.NUL终止字符串在短字符串上保存一到三个字节,这可能在1970年有用,但在几乎所有情况下都不值得一提.除了无法存储零字节(对文本来说不是太糟糕但排除任何类型的二进制数据)之外,您无法有效地确定字符串长度.这会对字符串算法的很大一部分产生负面影响.您链接到的注释中的一个示例是字符串比较:如果您有长度,则可以return false在比较不同长度的字符串时立即显示.还有许多其他与性能无关的缺点.
由于这些原因,几乎每个比1980年更新的语言实现都使用字符串的长度前缀.这是"pascal字符串"名称过时的另一个原因.