delphi - 在 Delphi 中,将一个对象转换为它的父对象会占用更多的内存吗?

标签 delphi memory stream

我正在使用 TMemoryStream我需要将它传递给 var TStream程序(外部库)。我刚刚投了我的 TMemoryStreamTStream像这样:

var
    myStream: TMemoryStream;

begin
    //...
    ExternalProcedure(TStream(myStream)); //procedure ExternalProcedure(var AStream: TStream);
end;
这是要避免的吗?是否需要大量额外内存(有问题的流可能是几 MB)?我的猜测是否定的,但在 Delphi 中不是 100% 确定。

最佳答案

MBo is right : 这种类型转换只会指示编译器假定类型是您指定的类型。这本质上是一个不会生成额外代码的强制转换。 (但是在转换值类型时有很多异常(exception)。)
但是,我通常会避免这种不安全的转换。以下是可能出错的示例:

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;

关于delphi - 在 Delphi 中,将一个对象转换为它的父对象会占用更多的内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62526880/

相关文章:

c++ - 直接访问结构成员

C# - 要关闭 NetworkStream,请调用 stream.Close 或 socket.Shutdown?

delphi - 在Delphi XE中删除TBitmap上的矩形

delphi - 如何使Delphi调试器在虚拟化Delphi 2009中正常工作

database - 如何正确访问在后台线程中创建的查询结果?

c++ - 使用 C++ 在 32 位 Linux 中查找进程可用的剩余内存

java - 为什么不会总是发生堆栈溢出?

Scala:将文件读取为无限/异步行流

java - ProcessBuilder 重定向到标准输出

delphi - 从原始字节数组中搜索 Unicode 字符 - Free Pascal\Lazarus 或 Delphi