2006-08-23

表达式的类别与类型里面值得注意的

1. 这里的“长度”仅指参考长度(字节),在代码中可以用SizeOf()来取得该值。一些较复杂的数据类型,以及几乎所有的用户定义类型的长度,都在表中所列出的“长度”值之外。同时,这里的“长度”值还表明:如果该数据类型的变量被声明,则系统“至少”为该变量初始化的字节数。

2. 常量与全局变量的分配是不同的。但是,类型化常量与全局变量在同一内存空间中被分配,且使用相同的分配规则。

3. 官方资料中,“动态分配的内存”被定义为“动态变量”。但由于它实际上是变量的数据体部分。因此,为了将它与普通变量区分开来,这里称为变量 “动态分配的内存”。一些其他的函数也可以完成这样的内存分配,例如ReallocMem()、Initialize()、StrAlloc()和 StrNew()等。

4. 静态数组也将直接在栈上进行分配。这意味着在局部变量中声明过大的静态数组是不安全的。细节请参见2.3.3小节中的“数组类型”。

5. 以后的行文中,变量的这两个部分将分别以“变量”和“变量的内存占用”来称呼。需要一再强调的是:变量的内存占用、动态变量和变量“动态分配的内存”是同一概念。

6. 这种情况下,变量的4字节总是可以通常类型强制,当作指向其内存占用的指针进行操作。

7. 除了字符串和集合,Delphi中定义的常量大小都不能超过8字节(Int64)。否则必须声明成“类型化的”,而这种情况下,Delphi按照变量的规则进行内存分配。

8. 编译指示字$Align只对记录、类和对象有意义。它不影响字符串在堆栈和应用程序内存区中的内存分配规则。

9. 部分Delphi的内核源码同时提供两个版本,即“PUREPASCAL”和“BASM”版本。Delphi内核是以BASM版本编译的——PUREPASCAL版本的部分代码甚至在产品的正式版本中仍是有错误的。但通常而言,PUREPASCAL版本的代码是一个非常好的对照,也是学习BASM最佳的Sample。

10. 对于Linux系统来说,这两种字符串使用相同的处理机制。因此,Linux版本的WideString例程大多数直接跳转到AnsiString例程中。Delphi为WideString保留这些例程声明,以使得Linux版本的内核代码更易于维护。

11. Delphi手册中,该函数是两种声明。第三种声明只对动态数组的唯一化有意义。

12. 绝大多数(但并不是全部)的Delphi基本数据类型和明确声明过的类型,都具有惟一的一个类型信息。但是像整型这样一些简单数据类型的RTTI,通常是不需要关注的。同时需要注意的是:每一个类型信息都指向独立的内存结构。兼容的两个类型,在内存结构上也是相互独立的。

没有评论: