Delphi中数据的内存结构

时间:2010-01-26 14:50:30  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:;在这个小节里,我们将分析一些数据类型变量在内存中的真实存放格式,从而了解这些类型的真实运作方式。不同平台对于数据的内存管理方式是有所不同的,那么本书呢,当然都是指Windows平台。1. Boolean类型基础类型Boolean变量被存储为一个Byte,数值为0代表False,为1代表True。其他扩展类型是为了和操作系统与其他语言兼容而设立。ByteBool存储为一...
  正文:

一些数据类型在内存中的实际存储方式,并不是表面上看起来那样子的。比如一个动态数组,并不是简单地在内存开辟一个区域,然后按地址顺序逐个放置数组的元素,长字符串也不是字符们脑门贴脑勺挤成一个长蛇阵那么简单。

    在这个小节里,我们将分析一些数据类型变量在内存中的真实存放格式,从而了解这些类型的真实运作方式。不同平台对于数据的内存管理方式是有所不同的,那么本书呢,当然都是指Windows平台。

1. Boolean类型

基础类型Boolean变量被存储为一个Byte,数值为0代表False,为1代表True。

其他扩展类型是为了和操作系统与其他语言兼容而设立。ByteBool存储为一个Byte,wordBool存储为一个Word,LongBool存储为一个LongInt。数值0代表False,非0则表示True。

2. Enumerated类型

它的存储格式和编译指令$Z相关。$Z1(默认)、$Z2、$Z4分别表示被存储为Byte、Word、DWORD(即LongWord)。也就是说,枚举变量其实是一个整数,根据这个整数值可以取得不同的枚举值。比如整数为5时,那么就表示枚举值应该是原始集合的第5个有序值。

所以从上面也可以看到,集合中有序值的最大个数是随$Z变化的。在默认情况($Z1)下,最多只能枚举256个有序值。

3. AnsiString/String类型

它内部包含四个域:

偏移/Byte   内容

-8    存储引用计数;

-4    存储字符长度;

0..Length-1    存储实际字符;

Length    零字符(NULL或者#0)。

可见,一个String变量实际上是一个指针,指向第一个字符所在位置(即偏移0处)。

引用计数域帮助管理内存的自动释放工作。对于一个字符串常数,引用计数总是-1。

零字符域便于和PChar类型的转化。

WideString变量是类似的,但是少了引用计数域。

在这里我们也发现,AnsiString和WideString都用4个Byte(即32Bits)来存储字符长度,而32Bits所能表示的最大整数是2147483647(即2G),所以它们的最大字符长度为2GB。当然,以后的Delphi版本是可以扩展这个长度的。

知道了String的实际存储结构,我们就可用下面的代码取得字符串的长度(注意这样做只是为了说明原理,实际编程则没必要搞得这么复杂,直接使用函数Length即可):




var
S: String;
L: Integer;
begin
  S := 'lxpbuaa';
  L := PInteger(Integer(S) - 4)^;
  {或者 L := PInteger(PInteger(@S)^ - 4)^;}
  {或者 L := PInteger(PInteger(Addr(S))^ - 4)^;}
  {最终得到L = Length(S) = 7;}
end;



4. Set类型

集合实际是一个Bit数组,每个Bit分别用0/1表示是否包含对应元素。因为Delphi规定了集合类型的元素不能超过256个,所以一个集合变量最多占用256个Bit(即8个字节)。

集合总被分配最小字节个数的内存,比如有6个元素的被分配1个字节,有9个元素的被分配2个字节。

5. Dynamic array类型

动态数组内存也被划分为几个域:

偏移/Byte         内容

-8             存储引用计数

-4             存储元素数目

0..Length * (元素的大小) -1    存储元素值

它和长字符串的存储是十分类似的,所以大家一看就明白,我没必要再多说了。

6. Variant类型

Variant内部存储为TVarData类型的记录。TVarData被定义在System单元。

该记录主要包含两个字段:

(1)VType(TvarType类型),它用来存储数据的类型。在上一小节我们已经讲过这个类型。

(2)另一个字段为8字节大小,用来存储实际数据或者指向该实际数据的指针。

所以,根据这两个字段,一个Variant可以和其他数据类型相互转化。

小结
    本文揭示了数据类型在底层的管理方法,剖析了一些常见类型的数据在内存中的存储格式和信息控制方法,有利于我们深入认识数据类型的设计和运作机理。

"Delphi中数据的内存结构"由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Language/Delphi/2010-01-26/12442.html


关键字:

关于《Delphi中数据的内存结构》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td