内存管理器块总是以4个字节进行对齐,并总是拥有一个4字节的头,这里包含内存块的大小及其它信息位。这意味着,内存管理器块总是以双字的形式优化排列,以保证定位内存块时CPU的效能发挥得最好。
内存管理器维护着两个状态变量:AllocMemCount和AllocMemSize,它们保存着当前分配的内存块数目、以及这些内存块的总容量。在调试时,应用程序可以利用这些变量来显示状态信息。
System单元提供了两个过程:GetMemoryManager和SetMemoryManager,它们允许程序拦截底层的内存管理器调用。System单元还提供了GetHeapStatus函数,它返回一个包含内存管理器详细状态信息的记录结构。
Variables(变量)
全局变量在程序的数据段分配,并且在程序运行期间一直存在;局部变量(在过程或函数内声明)存在于程序的堆栈中,每次调用过程或函数,局部变量进行分配,而调用结束后,局部变量被清除。编译器优化可能提前消除变量(比如使用寄存器)。
注意:在Linux下,堆栈大小只能由环境设置。
在Windows下,一个程序的堆栈由两个值定义:堆栈的最小值和最大值。这两个值受编译器指示字 $MINSTACKSIZE 和 $MAXSTACKSIZE 所控制,它们的缺省值分别是16,384(16K)和1,048,576(1M)。程序保证拥有最小容量的堆栈空间,且不允许超过堆栈的最大值。如果空闲内存不能保证最小的堆栈需求,Windows在启动程序时会报告出错。
如果程序需要的堆栈容量超过最小值,它会以4K的幅度自动增加。如果分配额外的堆栈失败,可能是没有足够的空闲内存,或者堆栈容量达到了它所允许的最大值。此时,将引发EStackOverflow异
- 153 -
Memory management
常(堆栈溢出检查完全是自动的。编译器指示字 $S 原先是控制堆栈溢出检查的,保留它是为了向后兼容性)。
在Windows或Linux下,由GetMem或New过程创建的动态变量是在堆中分配的,除非使用FreeMem或Dispose命令进行释放,否则它们将一直存在。
长字符串、宽字符串、动态数组、variant以及接口在堆中进行分配,但它们的内存是自动管理的。 Integer types(整数类型)
整型变量的格式取决于于它的最小值和最大值边界:
?
?
?
?
?
?
? 若边界都介于 -128..127(Shortint),存储为有符号字节(signed byte) 若边界都介于 0..255 (Byte),存储为无符号字节(unsigned byte) 若边界都介于 -32768..32767(Smallint),存储为有符号字(signed word) 若边界都介于 0..65535(Word),存储为无符号字(unsigned word) 若边界都介于 -2147483648..2147483647(Longint), 存储为有符号双字(signed double word) 若边界都介于 0..4294967295(Longword),存储为无符号双字(unsigned double word) 否则(Int64),存储为有符号四字(signed quadruple word)
Character types(字符类型)
Char、AnsiChar或Char的子界类型存储为一个无符号字节,WideChar存储为一个无符号字。 Boolean types(布尔类型)
Boolean类型存储为Byte,ByteBool也存储为Byte,WordBool存储为Word,LongBool存储为Longint。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-23665-114.html
是日本的克星
看看岛礁建设中还存在什么不足之处
疑似迎接