在 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;