如何从内存中最好地确定类的大小
下面是一个要使用的基本示例类-请注意,变量除了用于示例之外没有其他用途:
type
TMyClass = class
public
fString1: string;
fString2: string;
fInteger1: Integer;
fInteger2: Integer;
constructor Create;
destructor Destroy; override;
end;
我想做的是返回与磁盘上的文件大小相同的大小。
因此,例如,如果我将TMyClass保存到File,并且File的大小为2.4kb,我甚至不需要File在磁盘上(从Memory获取大小)就可以获得该值。
在问这里之前,我一直在搜索和阅读,这是我迄今为止尝试的,结果喜忧参半:
实例大小
在我的类上使用TMyClass.InstanceSize只会返回值12。
的大小
在我的类上使用SizeOf(TMyClass)只会返回值4。
无论返回什么值,我都将格式化为FileSize格式,如千字节和兆字节等。
我一定做错了什么,因为我知道我的类中使用的数据超过了12(或4)字节。我也知道我引用的是正确的类,它与我在Form Create和Destroy事件中创建和释放的类以及在运行时使用的类相同。
我试图做的是正确的方式吗?如果是,我的例子应该有效吗?如果它们应该起作用,我知道我需要更仔细地观察我的实际类和对象。
实现这一点的最糟糕的方法是将我的对象类保存到文件中,读取文件大小,然后删除临时文件。但我不喜欢这样做,我认为它们很肮脏,而且走捷径。目的是从内存中读取类的大小,而不需要保存和临时文件等。
我期待着听到你的意见和建议,谢谢。
不确定在这样的类上,InstanceSize
是如何获得12的。它应该是20(2009年2月之前)或24(2009年12月及以后)。它比保存的文件的实际大小小得多的原因是字符串没有保存在对象本身中;它们是引用类型,实现为指向实际字符串数据的指针。
你的"肮脏做法"是正确的。要想知道这样的对象需要多少磁盘空间,几乎唯一的方法就是实际序列化它。但你不需要把它保存到磁盘上。如果您当前使用TFileStream保存对象(如果不是,则应该使用),请使用TMemoryStream,它会将对象"保存"到内存缓冲区。然后获取流的Size
,这就是对象的序列化大小,而无需创建然后删除临时文件。