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