var obj: someObj;//其实好似引用 begin obj := SomeObj.Create;//在堆栈中建立obj对象. obj: 本身分配在棧 上obj := SomeObj.Create obj所引用的對象在堆上
如果Delphi开发组愿意,可以引入类似这样的一种语法:var obj: object TAnyClass(nil); obj2: TAnyClass; begin //编译器可以在入口处构造一个try/finally结构,并插入obj := TAnyClass.Create(nil)的代码, obj2 := TAnyClass.Create(anyParam); //出口处插入obj.Destroy();的代码 end;修改GetMem和TObject的实现: type TObject = class ...... class function NewInstance(aStackPtr: Pointer): TObject; virtual; end;class function TObject.NewInstance(aStackPtr: Pointer): TObject; begin if aStackPtr = nil then Result := InitInstance(_GetMem(InstanceSize)) else Result := InitInstance(aStackPtr); end;procedure TObject.FreeInstance; var P: PUsed; begin CleanupInstance; P := Self; Dec(P); if (P^.sizeFalgs and cInStack) = 0 then _FreeMem(Self); end;
beyondtkl(大龙驹</*everything I do, I DO it for YOU*/>) 所说的就是我的意思. to alphax(无之心),你是想提供一个垃圾回收机制么.刚才把C++的几本经典教材过了一边,也没找到答案. 不过凭我的理解, delphi这样做确实节省资源,就象在C++中用引用一样.>>因為 最早 設計 delphi的時候 是為了 具有 自動垃圾回收的才這麼做的.. 那现在为什么没有这个呢?
to flyinwuhan(制怒·三思而后行) class dog{...}; void func1() { Dog dog;//memory malloc in Stack //推出该函数时候,系统自动回收Stack中的空间. }Dog dog;// memory malloc in data segmentint main() { dog.wwan() }void func2() { Dog* Pdog = new Dog;// memory malloc in heap! delete Pdog; //so you must delete it; }
>>因為 最早 設計 delphi的時候 是為了 具有 自動垃圾回收的才這麼做的.. 那现在为什么没有这个呢? 設計 delphi得哪個老大 後來去ms了呀 就沒有實現了 最初是這麼考慮設計得。。 Dog dog;// memory malloc in data segment C++ 中 dog已經被構造出來了 而且是在棧上得 delphi 這樣得聲明只是聲明dog為一個引用而已 類似C++中得 Dog *pDog; 真正得構造 是 dog = Dog.Create;才是構造出來 才會在堆上分配內存,然後初始化.
void func1() { Dog dog;//memory malloc in Stack //推出该函数时候,系统自动回收Stack中的空间. }Dog dog;// memory malloc in data segment void func2() { Dog* Pdog = new Dog;// memory malloc in heap! delete Pdog; //so you must delete it; }明白了,谢谢楼主!
你说的“对象”是什么?类的实例?
“建立”对象是什么意思?是实例化一个类?实例化一个类必然要new,而new必然在堆上分配内存,怎么能在堆栈上?
还请高手指教。
想到这个问题,只是觉得每次退出函数的时候都要调用free来 destroy 对象有点不习惯而已,我想delphi迟早也会提供垃圾回收机制的.
还请高手指教。procedure func;
var
obj: someObj;//其实好似引用
begin
obj := SomeObj.Create;//在堆栈中建立obj对象.
//离开的时候必须
obj.free;
end;
楼主不是也说“delphi中所有的对象只能构造在堆中”吗?
。。还是用英文吧,免得打字出错。。c++中,无论malloc还是new都是在heap上分配内存,不是在stack上啊obj: someObj;//其实好似引用???这句话什么意思,解释一下啦
李维的VCL inside里面好像也提到了。其实是Delphi不具有这些优秀语言特性,或者说语言的设计人和实现者所侧重的东西不同
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这个观点不敢苟同。
应为:也可以让Delphi具有在栈上创建对象,>在堆上创建对象相对要快一点,
应为:在栈上创建对象相对要快一点,另to耙子前辈,>其实是Delphi不具有这些优秀语言特性,或者说语言的设计人和实现者所侧重的东西不同
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>这个观点不敢苟同。请指教
obj: someObj;//其实好似引用
begin
obj := SomeObj.Create;//在堆栈中建立obj对象.
obj: 本身分配在棧 上obj := SomeObj.Create obj所引用的對象在堆上
obj: object TAnyClass(nil);
obj2: TAnyClass;
begin
//编译器可以在入口处构造一个try/finally结构,并插入obj := TAnyClass.Create(nil)的代码, obj2 := TAnyClass.Create(anyParam); //出口处插入obj.Destroy();的代码
end;修改GetMem和TObject的实现:
type
TObject = class
......
class function NewInstance(aStackPtr: Pointer): TObject; virtual;
end;class function TObject.NewInstance(aStackPtr: Pointer): TObject;
begin
if aStackPtr = nil then
Result := InitInstance(_GetMem(InstanceSize))
else Result := InitInstance(aStackPtr);
end;procedure TObject.FreeInstance;
var
P: PUsed;
begin
CleanupInstance;
P := Self;
Dec(P);
if (P^.sizeFalgs and cInStack) = 0 then
_FreeMem(Self);
end;
所说的就是我的意思.
to alphax(无之心),你是想提供一个垃圾回收机制么.刚才把C++的几本经典教材过了一边,也没找到答案. 不过凭我的理解, delphi这样做确实节省资源,就象在C++中用引用一样.>>因為 最早 設計 delphi的時候 是為了 具有 自動垃圾回收的才這麼做的..
那现在为什么没有这个呢?
class dog{...};
void func1()
{
Dog dog;//memory malloc in Stack
//推出该函数时候,系统自动回收Stack中的空间.
}Dog dog;// memory malloc in data segmentint main()
{
dog.wwan()
}void func2()
{
Dog* Pdog = new Dog;// memory malloc in heap!
delete Pdog; //so you must delete it;
}
那现在为什么没有这个呢?
設計 delphi得哪個老大 後來去ms了呀 就沒有實現了 最初是這麼考慮設計得。。
Dog dog;// memory malloc in data segment
C++ 中 dog已經被構造出來了 而且是在棧上得
delphi 這樣得聲明只是聲明dog為一個引用而已 類似C++中得 Dog *pDog;
真正得構造 是 dog = Dog.Create;才是構造出來 才會在堆上分配內存,然後初始化.
{
Dog dog;//memory malloc in Stack
//推出该函数时候,系统自动回收Stack中的空间.
}Dog dog;// memory malloc in data segment
void func2()
{
Dog* Pdog = new Dog;// memory malloc in heap!
delete Pdog; //so you must delete it;
}明白了,谢谢楼主!