几年前我posted a question on SO关于如何在运行时获取数组的声明长度,如果该数组在打包记录中。答案很简单,使用Length()
函数,就像使用其他数组一样。我现在正在看到当时混乱的根源。以下是原始问题的记录:
type
TSomePDU = packed record
//...
StringField: array[0..XYZ] of AnsiChar;
//...
end;
PSomePDU = ^TSomePDU;
静态数组只是一个连续的内存块。对于每个分配的内存块,内存管理器会跟踪指针和块的大小。由于我们知道了块的大小,因此我们可以通过将内存块的大小除以数组元素类型的大小来获取数组的声明长度。也许这不是Length()
的工作原理,但我认为没有理由不这样做。
我的问题是有问题的数组位于打包记录中。打包记录被视为内存块,作为整体分配和释放。因此,当静态数组位于打包记录中时,不应该单独分配静态数组,该数组只是为了提供对该记录中字节子集的类型化访问,因此可以进行编译时检查。我也知道静态数组前面没有隐藏字节来保存数组的长度。
那么Length()
函数如何适用于这样的数组呢?
答案 0 :(得分:3)
Length()
函数是intrinsic function。
将它应用于static array时,编译器会在编译时知道结果。因此,不会进行任何函数调用,并且编译器会发出长度值作为常量存储在可执行文件中的代码。
无论声明静态数组的位置如何,都是如此。无论是全局的,本地的,对齐的记录还是打包的记录,还是在课堂上都无关紧要。