以与文件大小相同的格式获取类或对象的大小?

3 delphi

如何从内存中最好地确定类的大小?

这是一个要使用的基本示例类 - 请注意,除了示例之外,变量没有用处:

type
  TMyClass = class
  public
    fString1: string;
    fString2: string;
    fInteger1: Integer;
    fInteger2: Integer;

    constructor Create;
    destructor Destroy; override;
  end;
Run Code Online (Sandbox Code Playgroud)

我想要做的是返回相同的大小,就像它是磁盘上的文件一样.

所以,如果我救TMyClass到文件和文件的大小是例如2.4kb,我想获得该值甚至无需文件是在磁盘上(正从内存的大小).

我在问这里之前一直在寻找和阅读,这是我迄今为止尝试的结果好坏参半:

  • InstanceSize

    在我的类上使用TMyClass.InstanceSize只返回值12.

  • 中SizeOf

    在我的类上使用SizeOf(TMyClass)只返回值4.

无论值返回什么,我将格式化为FileSize格式,如千字节和兆字节等.

我必须做错事,因为我知道在我的班级上使用了超过12(或4)个字节的数据.我也知道我正在引用正确的类,它是我在Form Create和Destroy事件中创建和释放的同一个类 - 以及在运行时使用.

我正在尝试以正确的方式去做,如果是这样,我的例子是否有效?如果他们应该工作,我知道我需要仔细看看我的实际课程和对象.

实现这一目标的肮脏方法是我将对象类保存到文件,读取文件大小然后删除临时文件.但我不喜欢这样的方法,我认为它们很脏并且采取捷径.目的是从内存中读取类的大小,而不依赖于保存和临时文件等.

我期待听到您的意见和建议,谢谢.

Mas*_*ler 9

不知道你是怎么InstanceSize在这样的课上得到12分的.它应该是20(D2009之前)或24(D2009及之后).它比你保存的文件的实际大小小得多的原因是因为字符串没有保存在对象本身中; 它们是引用类型,实现为指向实际字符串数据的指针.

你的"肮脏方法"走在正确的轨道上.几乎是找出对象所需的磁盘空间的唯一方法是实际序列化它.但是您不需要将其保存到磁盘.如果您当前正在使用TFileStream保存对象(如果您不是,则应该如此),而是使用TMemoryStream,它将"保存"到内存缓冲区.然后获取Size流的大小,这是对象的序列化大小,所有这些都无需创建然后删除临时文件.