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