c/c++不支持object pascal中指定下标的数组,下标只能从0开始。
(5) 结构
object pascal不支持struct(在pascal中称为record)中的位域(bitfield)。bitfield
可以bit为单位(不需要整字节)来存储结构成员,可以减小结构的存储空间。不过存取
效率会有所降低。
(6) 字符串
字符串处理是object pascal的强项之一。能够支持灵活高效的串处理。严格意义上讲,c/c++不能算支持原生的字符串类型。char *和char[]更近似于用户自定义类型,因为编译器不支持字符串的内存自动分配和回收,需要用户自己调用malloc()和free()。object pascal也支持c/c++风格的字符串(称为pchar)。不过string类型更加强大。从实现上来看,object pascal的string类型使用前缀表示串长度(1字节前缀的short string和4字节前缀的long string,两种string自动兼容,并且long string也兼容pchar),c/c++中的char *和char[]使用后缀chr(0)表示串结束。不同的表示方法对串处理性能有很大的影响:对于大量,复杂的字符串操作,用object pascal可以写出比c/c++快几十倍的程序(许多用pascal写的pascal编译器,比如free pascal,pascal pro等,虽然技术水平一般,但编译速度也很快,在某种程度上也得益于pascal的字符串处理效率)。比如取串长度函数length/strlen(),object pascal的实现只需要一条mov指令,而c/c++的实现则需要进行重复串扫描直到找到结尾0为止。object pascal的string类型在支持unicode字符方面也有优势。要知道c/c++的字符串给现代操作系统支持unicode字符带来了很大的困扰,比如串’abc’的unicode表示为:41 00 42 00 43 00,这使c/c++程序根本无法处理这种字符串。虽然修改编译器可以很容易解决这个问题,但光修改编译器是不够的,还要修改操作系统,否则以前的大量c/c++程序根本无法在新操作系统上使用(这简直是灾难 --- 你连notepad都没了,怎么办?:-)。windows采用凡是涉及字符串处理的api都提供两套的解决方案。比如textout,有用于处理ascii字符的textouta和用于处理unicode字符的textoutw。而unix/linux采用另一种办法:凡是涉及字符串处理的api都使用utf8压缩编码(一种类似于rtf的编码方法:凡是ascii字符都直接存储,多字节字符则用\进行转义),虽然(勉强)保证了兼容性却也代价不小。
(ps:c++中的string/ansistring是用类模拟的,所以性能...)
(7) 多重继承
毫无疑问,object pascal不支持多重继承;并且也看不出borland有增加这一特性的意向(其实增加是轻而易举的)。object pascal通过接口(interface)实现多重继承。interface不仅可以引入用object pascal实现的对象,也可以引入其他语言实现的com/dcom/corba对象。你真的需要多重继承吗?我想大多数程序员和我一样都从来没有使用过多重继承(连vcl这么强大灵活的体系结构都根本没有用到多重继承)。
文章来源于领测软件测试网 https://www.ltesting.net/