首页 文章

System.Length()如何在Delphi中为静态数组工作?

提问于
浏览 1903
0

几年前我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 回答

  • 3

    Length() 函数是intrinsic function .

    将其应用于static array时,编译器会在编译时知道结果 . 因此,不进行任何函数调用,并且编译器发出的代码的长度值在可执行文件中存储为常量 .

    无论声明静态数组的位置如何都是如此 . 无论是全局,本地,对齐记录还是打包记录,还是在类中,都无关紧要 .

相关问题