Delphi栈对象
来自:http://blog.csdn.net/iseekcode/article/details/5158985
----------------------------------------------------------------------------
//如需转载请注明出处
//作者: 逍遥萧
//来源: http://www.xy13.cn
估计很多用了Delphi很多年的都不知道Delphi有支持栈对象.
C++里对象即可以创建为堆对象,也可以创建为栈对象
常用的对象都是从TObject继承,此种对象需要创建释放,不然会内存漏洞
而栈对象不需要创建,也不需要释放,当对生命周期完成时会自动清理
下面测试一下效果
type
PA = ^TA;
TA = object
D1: Integer;
D2: Word;
D3: Byte;
constructor Create;
destructor Destroy;
end;
constructor TA.Create;
begin
ShowMessage('Create');
end;
destructor TA.Destroy;
begin
ShowMessage('Destroy');
end;
procedure TForm2.Button1Click(Sender: TObject);
var
A: TA;
begin
ShowMessage(IntToStr(A.D1)); //对象A不需要创建,直接访问
ShowMessage(IntToStr(SizeOf(TA))); //7
end;
经测试发现对象的构造函数和析构函数并没调用,而且看起来跟packed record很相似,
堆对象是个指针,大小始终是4,而栈对象的大小由内部数据而定,可见不是指针变量
再测试栈对象,从堆上创建,即使用new关键字,并且在创建时在参数里带上构造函数
procedure TForm2.Button1Click(Sender: TObject);
var
A: PA;
begin
New(A, Create);
ShowMessage(IntToStr(A^.D1));
Dispose(A, Destroy);
end;
如果new 后面不带参数.构造函数不会被执行,而且带了之后,对象还会被初始化
这里就是唯packed record的区别了,record不能带构造函数,否则无法编译
感觉意义不大,白高兴一场,如果D7用户还有点用处,因为record里不支持方法
-------------------------------------------------------------------------
可惜,孤陋寡闻多年,才知道。
我的一个自定义数据库里,有个数据头结构,如果定义为object的话,数据库升级
版本就方便多了。
一直用D7。
据说D2007后就有记录对象了。
Delphi栈对象的更多相关文章
- Delphi2007新功能 -- 有限的栈对象
今天使用Delphi2007,一个误输入,无意中发现Delphi2007的record类型居然能够和TObject一样定义方法和属性,而且不需要调用类似TObject.Create方法就能生成一个re ...
- struts2中的值栈对象ValueStack
ValueStack, 即值栈对象. 值栈对象: 是整个struts数据存储的核心,或者叫中转站. 用户每次访问struts的action,都会创建一个Action对象.值栈对象.ActionCont ...
- Ognl值栈对象及struts标签
用户每次访问struts的action,都会创建一个Action对象.值栈对象.ActionContext对象:然后把Action对象放入值栈中: 最后再把值栈对象放入request中,传入jsp页面 ...
- 控制对象的创建方式(禁止创建栈对象or堆对象)和创建的数量
我们知道,C++将内存划分为三个逻辑区域:堆.栈和静态存储区.既然如此,我称位于它们之中的对象分别为堆对象,栈对象以及静态对象.通常情况下,对象创建在堆上还是在栈上,创建多少个,这都是没有限制的.但是 ...
- C++——内存对象 禁止产生堆对象 禁止产生栈对象
用C或C++写程序,需要更多地关注内存,这不仅仅是因为内存的分配是否合理直接影响着程序的效率和性能,更为主要的是,当我们操作内存的时候一不小心就会出现问题,而且很多时候,这些问题都是不易发觉的,比如内 ...
- Struts2_day03--课程安排_OGNL概述入门_什么是值栈_获取值栈对象_值栈内部结构
Struts2_day03 上节内容 今天内容 OGNL概述 OGNL入门案例 什么是值栈 获取值栈对象 值栈内部结构 向值栈放数据 向值栈放对象 向值栈放list集合 从值栈获取数据 获取字符串 获 ...
- 待解决问题:c++栈对象的析构、虚拟内存与内存管理的关系、内存管理的解决方案。
待解决问题:c++栈对象的析构.虚拟内存与内存管理的关系.内存管理的解决方案.
- 多线程的基本概念和Delphi线程对象Tthread介绍
多线程的基本概念和Delphi线程对象Tthread介绍 作者:xiaoru WIN 98/NT/2000/XP是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU运行 ...
- Struts2-获取值栈对象与结构
1.获取值栈对象有多种方式 (1)使用ActionContext类里面的方法获取值栈对象 @Override public String execute(){ //1.获取ActionContext类 ...
随机推荐
- easyui 获取树的平级根节点的父节点&选择性展示树的一个根节点
1.easyui的树的根节点一般是几个平级的,怎样获取这些父节点的id? 可以将获取到的平级根节点放在一个数组中 var roots=[]; roots=$("#tree1").t ...
- day02-python基础2
操作 列表是用来存储一组数据,可以实现对列表中元素的增删改查等操作. 转换: list(string):把字符串转为列表 声明: 列表使用方括号 查询: 根据元素下标获取列表中元素的值 切片: [0: ...
- (原)Unreal渲染模块 源码和实例分析说明
@author:白袍小道 说明 1.由于小道就三境武夫而已,而UE渲染部分不仅管理挺大,而且牵扯技术和内容驳杂,所以才有这篇梳理. 2.尽量会按书籍和资料,源码,小模块的调试和搬山(就是敲键盘)..等 ...
- PAT——甲级1046S:shortest Distance
这道题,折磨了我一个多小时,前前后后写了三个算法. 1046 Shortest Distance (20 point(s)) The task is really simple: given N ex ...
- JavaWeb笔记(十一)Maven
什么是Maven Maven是Apache旗下一款开源自动化的项目管理工具,它使用java语言编写,因此Maven是一款跨平台的项目管理工具. 主要功能 项目构建 在实际开发中,不仅仅是写完代码项目就 ...
- 波动数列 神奇的dp
问题描述 观察这个数列: 1 3 0 2 -1 1 -2 ... 这个数列中后一项总是比前一项增加2或者减少3. 栋栋对这种数列很好奇,他想知道长度为 n 和为 s 而且后一项总是比前一项增加a或者减 ...
- KVC 开发详情
目录 概述 KVC基本技术 KVC访问函数 KVC搜索顺序 KVC集合操作 一.概述 kvc全名是Key-value coding,kvc是一种通过字符串间接的访问oc对象的属性的一种技术. 一个oc ...
- Scala 基础(4)—— 类和对象
1. 类.字段和方法 Scala 用 class 关键字定义类,一旦定义好一个类,就可以使用 new 关键字创建对象. Scala 使用 new 调用无参构造器时,可以不使用 (),推荐不使用括号: ...
- 【bzoj4419】[Shoi2013]发微博 STL-set
题目描述 刚开通的SH微博共有n个用户(1..n标号),在短短一个月的时间内,用户们活动频繁,共有m条按时间顺序的记录: ! x 表示用户x发了一条微博: + x y 表示用户x和用户y成为了好友 ...
- 2017 多校2 hdu 6053 TrickGCD
2017 多校2 hdu 6053 TrickGCD 题目: You are given an array \(A\) , and Zhu wants to know there are how ma ...