如何从内存中最好地确定类的大小?
这是一个可以使用的基本示例类 - 请注意,这些变量除了用于示例之外没有其他用途:
type
TMyClass = class
public
fString1: string;
fString2: string;
fInteger1: Integer;
fInteger2: Integer;
constructor Create;
destructor Destroy; override;
end;
我想做的是返回与磁盘上的文件相同的大小。
因此,如果我将 TMyClass 保存到文件并且文件的大小为 2.4kb,例如,我希望获得该值,甚至不需要文件位于磁盘上(从内存获取大小)。
在在这里提问之前,我一直在搜索和阅读,这是我迄今为止尝试过的,结果好坏参半:
无论返回什么值,我都将格式化为 FileSize 格式,例如千字节和兆字节等。
我一定做错了什么,因为我知道我的类中使用了超过 12(或 4)字节的数据。我还知道我正在引用正确的类,它与我在 Form Create 和 Destroy 事件中创建和释放的类以及在运行时使用的类相同。
我正在尝试做的事情是否正确,如果是的话,我的例子应该有效吗?如果它们应该起作用,我知道我需要仔细查看我的实际类和对象。
实现此目的的肮脏方法是将我的对象类保存到文件,读取文件大小,然后删除临时文件。但我不喜欢这样做,我认为它们很肮脏并且走捷径。目的是从内存中读取我的类的大小,而不诉诸保存和临时文件等。
我期待听到您的意见和建议,谢谢。
不知道你是怎么得到12的InstanceSize
在这样的课堂上。应为 20(D2009 之前)或 24(D2009 及之后)。它比保存文件的实际大小小得多的原因是因为字符串不保存在对象本身中;它们是引用类型,实现为指向实际字符串数据的指针。
你的“肮脏方法”是在正确的轨道上。几乎确定此类对象需要多少磁盘空间的唯一方法就是实际序列化它。但您不需要将其保存到磁盘。如果您当前正在使用 TFileStream 保存对象(如果不是,则应该这样做),请改用 TMemoryStream,这会将其“保存”到内存缓冲区中。然后得到Size
流的大小,这就是对象的序列化大小,所有这些都无需创建然后删除临时文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)