在 Delphi 中,将对象强制转换为其父对象会占用更多内存吗?
In Delphi does casting an object to its parent take a lot more memory?
我正在使用 TMemoryStream
,我需要将它传递给 var
TStream
过程(外部库)。我只是像这样将 TMemoryStream
转换为 TStream
:
var
myStream: TMemoryStream;
begin
//...
ExternalProcedure(TStream(myStream)); //procedure ExternalProcedure(var AStream: TStream);
end;
这是要避免的事情吗?它是否需要大量额外的内存(有问题的流可能是几 MB)?我的猜测是不,但在 Delphi.
中不能 100% 确定
转换不创建新对象,相应地不获取新内存。这只是编译器提供类型兼容性的指令
MBo :这种类型转换只会指示编译器假定类型是您指定的类型。这本质上是一个不会生成额外代码的转换。 (但是当你转换 value 类型时有很多例外。)
但是,我通常会避免这种不安全的转换。以下是可能出错的示例:
type
TAnimal = class
DNASequence: string;
end;
TSpider = class(TAnimal)
MoultCount: Integer;
end;
procedure ChangeAnimal(var AAnimal: TAnimal);
begin
FreeAndNil(AAnimal);
AAnimal := TAnimal.Create;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
Spider: TSpider;
begin
Spider := TSpider.Create;
try
Spider.DNASequence := 'CTGA...';
Spider.MoultCount := 3;
ChangeAnimal(TAnimal(Spider));
ShowMessage(Spider.MoultCount.ToString); // Oops! The `TSpider` variable
// points to a `TAnimal` object!
finally
Spider.Free;
end;
end;
我正在使用 TMemoryStream
,我需要将它传递给 var
TStream
过程(外部库)。我只是像这样将 TMemoryStream
转换为 TStream
:
var
myStream: TMemoryStream;
begin
//...
ExternalProcedure(TStream(myStream)); //procedure ExternalProcedure(var AStream: TStream);
end;
这是要避免的事情吗?它是否需要大量额外的内存(有问题的流可能是几 MB)?我的猜测是不,但在 Delphi.
中不能 100% 确定转换不创建新对象,相应地不获取新内存。这只是编译器提供类型兼容性的指令
MBo
但是,我通常会避免这种不安全的转换。以下是可能出错的示例:
type
TAnimal = class
DNASequence: string;
end;
TSpider = class(TAnimal)
MoultCount: Integer;
end;
procedure ChangeAnimal(var AAnimal: TAnimal);
begin
FreeAndNil(AAnimal);
AAnimal := TAnimal.Create;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
Spider: TSpider;
begin
Spider := TSpider.Create;
try
Spider.DNASequence := 'CTGA...';
Spider.MoultCount := 3;
ChangeAnimal(TAnimal(Spider));
ShowMessage(Spider.MoultCount.ToString); // Oops! The `TSpider` variable
// points to a `TAnimal` object!
finally
Spider.Free;
end;
end;