来自: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栈对象的更多相关文章

  1. Delphi2007新功能 -- 有限的栈对象

    今天使用Delphi2007,一个误输入,无意中发现Delphi2007的record类型居然能够和TObject一样定义方法和属性,而且不需要调用类似TObject.Create方法就能生成一个re ...

  2. struts2中的值栈对象ValueStack

    ValueStack, 即值栈对象. 值栈对象: 是整个struts数据存储的核心,或者叫中转站. 用户每次访问struts的action,都会创建一个Action对象.值栈对象.ActionCont ...

  3. Ognl值栈对象及struts标签

    用户每次访问struts的action,都会创建一个Action对象.值栈对象.ActionContext对象:然后把Action对象放入值栈中: 最后再把值栈对象放入request中,传入jsp页面 ...

  4. 控制对象的创建方式(禁止创建栈对象or堆对象)和创建的数量

    我们知道,C++将内存划分为三个逻辑区域:堆.栈和静态存储区.既然如此,我称位于它们之中的对象分别为堆对象,栈对象以及静态对象.通常情况下,对象创建在堆上还是在栈上,创建多少个,这都是没有限制的.但是 ...

  5. C++——内存对象 禁止产生堆对象 禁止产生栈对象

    用C或C++写程序,需要更多地关注内存,这不仅仅是因为内存的分配是否合理直接影响着程序的效率和性能,更为主要的是,当我们操作内存的时候一不小心就会出现问题,而且很多时候,这些问题都是不易发觉的,比如内 ...

  6. Struts2_day03--课程安排_OGNL概述入门_什么是值栈_获取值栈对象_值栈内部结构

    Struts2_day03 上节内容 今天内容 OGNL概述 OGNL入门案例 什么是值栈 获取值栈对象 值栈内部结构 向值栈放数据 向值栈放对象 向值栈放list集合 从值栈获取数据 获取字符串 获 ...

  7. 待解决问题:c++栈对象的析构、虚拟内存与内存管理的关系、内存管理的解决方案。

    待解决问题:c++栈对象的析构.虚拟内存与内存管理的关系.内存管理的解决方案.

  8. 多线程的基本概念和Delphi线程对象Tthread介绍

    多线程的基本概念和Delphi线程对象Tthread介绍 作者:xiaoru    WIN 98/NT/2000/XP是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU运行 ...

  9. Struts2-获取值栈对象与结构

    1.获取值栈对象有多种方式 (1)使用ActionContext类里面的方法获取值栈对象 @Override public String execute(){ //1.获取ActionContext类 ...

随机推荐

  1. 您的手机上未安装应用程序 android 点击快捷方式提示未安装程序的解决

    最近APP出现一个很奇怪的问题,在Android 4.4.2和android 4.4.3系统上点击应用的快捷方式,打不开应用,而且会提示未安装程序. 确认了应用的MainActivity中设置了and ...

  2. python语言中threading.Thread类的使用方法

    1. 编程语言里面的任务和线程是很重要的一个功能.在python里面,线程的创建有两种方式,其一使用Thread类创建 # 导入Python标准库中的Thread模块 from threading i ...

  3. linux 多播

    1.概念 单播是用于两个主机之间传送数据,广播是一个主机对局域网内的所有主机发送数据.而多播,又称为组播,它是对一组特定的主机通信.将网络上同一类型 业务逻辑上分组,只和组内的成员通信,其它主机没有加 ...

  4. 【Linear Regression】林轩田机器学习基石

    这一节开始讲基础的Linear Regression算法. (1)Linear Regression的假设空间变成了实数域 (2)Linear Regression的目标是找到使得残差更小的分割线(超 ...

  5. 基于mysqldump备份集来恢复某个误操作的表(drop,truncate)

      Preface       How to rescue a dropped or truncated table online?Dropping or truncating is ddl oper ...

  6. bitbucket相关操作

    常见命令: git checkout -b develop master 创建Develop分支的命令 git checkout master 切换到Master分支 git merge --no-f ...

  7. springboot10 framwork

    一.Spring介绍 Spring 是位于业务逻辑层的框架. 优点很多(无缝对接前后层的框架.提供AOP的支持 , 和以前的 Sstruts . Hibernate 组合成了一套框架组合 SSH .现 ...

  8. 脚本,替换ipa里面的资源,并重新打包

    今天逯同事说,可以把狂挂传奇打包的项目写成一个脚本,这样就不用担心证书有时不能用的问题了. 然后,像我这么好学的学生,当然要去执行了.(其实,以前他给的建议我都只是听听而已,这次是因为想学点东西了,所 ...

  9. GridView与ListView冲突

    由于GridView与listView都是继承自ScrollView,所以两个控件放在一起时需要重写控件方法   public class MyGridView extends GridView{  ...

  10. hadoop2.6.4【windows7】构建maven项目 系列2

    准备windows版本的hadoop2.6.4 下载windows版本的hadoop2.6.4解压在本地 新建maven项目构建hadoop依赖 <?xml version="1.0& ...