gpt4 book ai didi

delphi - 优化 Delphi 中的类大小。有类似 "packed classes"的东西吗?

转载 作者:行者123 更新时间:2023-12-03 15:02:52 24 4
gpt4 key购买 nike

我正在尝试优化 Delphi 类的大小,以便它们占用尽可能少的内存,因为我创建了大量此类类。

问题是,类(class)本身很小,但它们并没有占据我预期的空间。例如,如果我有

type MyClass = class
private
mMember1 : integer;
mMember2 : boolean;
mMember3 : byte;
end;

我希望它使用 6 个字节,但是,由于对齐,它最终使用 12 个字节,即 bool 值使用 4 个字节而不是 1 个字节...字节字段也是如此...

对于记录,您可以使用 {$A1} 指令或将其声明为打包记录,以使其仅使用所需的内存。

有没有办法用类来做同样的事情? (也许有一些关于如何正确重写 NewInstance 类方法的教程?)

编辑:好的,对我正在做的事情做一些解释...

首先,实际类大小约为 40 个字节,包括 VMT 和接口(interface)指针占用的空间。

这些类都继承自 RefCounting 基类,其大小为 8 字节(整数 FRefCount 和一些允许引用计数的方法),并且它们必须支持接口(interface)(因此根本不使用打包记录)。

这些对象被传递并被转换为多个对象,而处理程序不知道它们得到了什么。例如,我有一个接收 TItems 列表并执行类似操作的类:

if Supports(List[i], IValuable, IValInstance) then
Eval(IValInstance.Value);

然后另一个处理程序可能会检查其他接口(interface)

If Supports(List[i], IStringObject, IStringInstance) then
Compose(IStringInstance.Value)

这样每个处理程序都会对列表进行不同的处理...

关于如何获取类的总大小,我正在使用修改后的内存管理器,以便我可以跟踪“真实”内存管理器为该类使用了多少内存。这样我就非常有信心实例没有被打包。

最后这是在 Delphi 7 中。我尝试使用 {$A1} 预编译器指令,但没有成功,字段以任何方式对齐,并且在最坏的情况下我可能有数百万个实例,因此节省 6 个字节可以结果节省了几MB。

最佳答案

您可以使用打包记录作为对象的字段:

type
TMyRecord = packed record
Member1 : integer;
Member2 : boolean;
Member3 : byte;
end;

TMyClass = class
private
FData : TMyRecord;
function GetMember1 : Integer;
public
property Member1 : Integer read GetMember1;
// Later versions of Delphi allow "read FData.Member1;", not sure when from
end;

function TMyClass.GetMember1 : integer;
begin
result := FData.Member1;
end;

关于delphi - 优化 Delphi 中的类大小。有类似 "packed classes"的东西吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/831099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com