优化 Delphi 中的类大小。有没有类似“打包课程”之类的东西?

2023-12-23

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

问题是,课程本身很小,但并没有占据我预期的空间。例如,如果我有

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

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

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

有什么办法可以通过类来做同样的事情吗? (也许有一些关于如何正确重写 NewInstance 类方法的教程?)

Edit:好吧,稍微解释一下我在做什么......

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

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

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

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

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

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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优化 Delphi 中的类大小。有没有类似“打包课程”之类的东西? 的相关文章

  • delphi THashSHA2 在大文件上返回错误的 SHA256

    Data Cloud CloudAPI pas has class function TCloudSHA256Authentication GetStreamToHashSHA256Hex const Content TStream str
  • TThread.resume 在 Delphi-2010 中已弃用,应该在什么地方使用?

    在我的多线程应用程序中 I use TThread 挂起 and TThread resume 自从将我的应用程序移至 Delphi 2010 后 我收到以下警告消息 DCC 警告 xxx pas 277 W1000 符号 Resume 已
  • Delphi定时器比毫秒更精确

    我在 Delphi 中有一个程序 它以 25 赫兹 每秒 25 次 的速度从外部应用程序获取帧 然后通过创建 1 2 个额外帧将其转换为 60 赫兹 每秒 60 帧 我需要通过连续构建帧缓冲区并从单独的线程输出帧来输出这些额外的帧 问题是
  • Mathematica 使用符号而不是数字调用 NMinimize?

    我在使用时注意到以下行为NMinimize在数学中 目标函数的第一次调用是使用变量名称 而不是像人们所期望的那样使用空间中的点 因此 例如 如果我的目标函数是一个模块 则该模块仅被调用一次 进行符号评估 然后在进一步的迭代中 使用变量空间中
  • -ffast-math 可以安全地用于典型项目吗?

    在回答我建议的问题时 ffast math 有评论指出这是危险的 我个人的感觉是 在科学计算之外 是可以的 我还假设严肃的金融应用程序使用定点而不是浮点 当然 如果你想在你的项目中使用它 最终的答案是在你的项目上测试它 看看它有多大影响 但
  • 读取存储在注册表中的 GUID 值

    我尝试读取存储为的 GUID 值binaryDelphi 注册表中的值 当我用BintoHex读取它时 但结果是相反的 看来我必须交换字节 但我认为 BinToHex 可以做到 我参考了这个线程 但找不到正确的解决方案 如何在 Delphi
  • 我可以分配多少内存?

    如果我的机器上有16 GB的RAM 我可以将多少分配给我正在执行的Java命令行计划 我假设java Xmx 16g 会让我的系统崩溃吗 EDIT 根据评论 我尝试了java Xmx16g 并且它没有使我的机器崩溃 程序仍然内存不足 我试过
  • 创建无边框表单而不丢失 Windows 命令

    我已将表单更改为无边框表单 我只是更改了BorderStyle财产给bsNone 但现在我的应用程序失去了 Windows 锚点和一些命令 例如 WIN 对齐表单客户端 WIN 最小化表格 WIN 表格右对齐 WIN 表格左对齐 我尝试过设
  • MySQL INSERT 语句在大表中是否会变慢?

    我可以看到如何SELECT and UPDATE随着表的不断增长 语句会变得越来越慢 但是呢INSERT INSERT也会变慢 特别是如果你有很多indexes也必须更新 但不同的存储引擎之间存在差异 MyISAM对于很多人来说更快SELE
  • 安装软件包时出现无法加载软件包 %s 错误

    我正在 Delphi 2007 上进行测试 我的小组项目由 2 个包组成 包运行 bpl 它被标记为 仅运行时 并包含一个名为 uMyTestRun pas 的单元 其中定义了一个空的 TFrame 后代 unit uMyTestRun i
  • 如何改变TDateTimePicker的颜色?

    如何更改 a 的颜色TDateTimePicker A 日期和时间选择器可以有一种颜色 通常这是通过设置来完成的Color procedure TForm1 FormCreate Sender TObject begin DateTimeP
  • 如何使用 Span 和 stackalloc 创建临时小列表

    我正在阅读一些用 C 编写的代码的描述 这些代码由于在堆栈上而不是堆上分配临时数组以在非常热的循环中使用而提高了速度 它被描述为类似于 SBO 优化 有问题的对象类似于List
  • 使用具有来自平面数字数组的最大和的子数组填充数组

    我需要填充一个数组 其中可能包含不确定数量的子数组 托盘 每个子数组的最大尺寸为 265 厘米 我有一个整数 包 的平面数组 需要在托盘中进行最佳排列 例如 50 厘米 45 厘米 30 厘米 如何动态创建一个系统来创建代表具有最佳空间优化
  • 在这些情况下限制破折号的正则表达式模式

    Scenario 我正在使用第三方文件重命名软件 该软件是用 Delphi 编写的 并且具有 pascal 脚本支持 该应用程序允许使用正则表达式来重命名文件 这意味着 如果我需要对文件名执行的操作不能仅使用一个正则表达式来完成 那么我可以
  • Delphi - 引用在运行时创建的组件

    我正在使用 Delphi 5 并且在运行时创建许多面板 然后在面板上创建按钮 显然也是在运行时创建 我需要这样做 因为将来我可能需要动态创建更多面板 按钮组合 我可以完成所有这些 但我不知道如何引用我创建的面板 因为我找不到访问面板组件名称
  • InnoDB vs. MyISAM 插入查询时间

    我有一个大型 MySQL 表 约 1000 万行 6 5G 用于读取和写入 它是MyISAM 由于MyISAM 的所有表写入锁 我获得了很多锁 我决定尝试迁移到 InnoDB 推荐用于读 写表 它只锁定写入时的特定行 转换后 我测试了插入语
  • 如何使用 DSPACK 将自定义音频缓冲区注入 DirectX 过滤器图表?

    我使用 Delphi 6 和 DSPACK 来执行一些涉及音频和 DirectX 的操作 我在 输入 方面找到了将枚举的音频输入设备之一分配给 TFilter 对象并将该过滤器连接到 TSampleGrabber 对象的位置 这为我提供了将
  • 如何防止编译器优化掉断点?

    我编写了一个 if 子句来检查是否应该中断程序进行调试 if a lt 0 a a a不应该变成负数 但我发现它确实如此 并且我想中断调试以了解如果发生这种情况它为什么会变成负数 因此我编写了这个 if 子句 在线上a a 我设置了一个断点
  • 应用程序需要很长时间才能同步线程(或根本不同步)

    我在 Delphi XE5 iOS 和 Android 中使用 REST 组件 我目前正在通过 iOS 模拟器进行测试 我的应用程序often挂在我的代码中的以下行 R Request Execute 经过一些调试后 我发现它特别挂在 RE
  • 文件数据到数组正在使用大量内存

    我正在获取一个带有制表符分隔值的大型文本文件 并将它们添加到一个数组中 当我在 32 Mb 文件上运行代码时 Python 内存消耗急剧增加 使用大约 500 Mb RAM 我需要能够为 2 GB 文件甚至可能更大的文件运行此代码 我当前的

随机推荐

  • 无边框窗口和桌面尺寸相同时闪烁

    我正在尝试创建一个充满屏幕的无边框窗口 http pcgamingwiki com wiki Glossary 3aBorderless fullscreen windowed带有 OpenGL 视口 问题是 当我将窗口和视口设置为与桌面大
  • CI 服务器比较? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在寻找不同的比较持续集成 http en wikipedia org wiki Continuous integration CI 服务器
  • 如何并行执行 2 个 Observable,忽略它们的结果并执行下一个 Observable

    我必须并行执行 2 个 observable 不关心它们的输出 当它们都完成时 gt 运行另一个 observable 这是我的解决方案 但我觉得还有更好的解决方案 rx Observable
  • 如何利用 Robot Framework 编写正则表达式来查找/替换各种日期字符串

    我使用机器人框架进行自动化测试 将文件读入变量 我正在解析该变量的各种日期格式 并尝试使用正则表达式将日期替换为当前日期 我正在努力解决的是让正则表达式在机器人框架中工作 我已经在各种网站 如 pythex 和 regex101 中编写了正
  • 函数重载和模板推导优先级

    考虑以下函数声明 template
  • 什么是不变性以及为什么我应该担心它?

    我读过几篇关于不变性的文章 但仍然没有很好地理解这个概念 我最近在这里创建了一个线程 其中提到了不变性 但由于这本身就是一个主题 所以我现在正在创建一个专门的线程 我在过去的帖子中提到 我认为不变性是使对象只读并赋予其低可见性的过程 另一位
  • Django 1.2:登录问题(GET参数:next)

    我有一个关于 django 的新问题 这些天我发布了一个丢失的问题 这是我的情况 我有一个自定义登录视图 在设置中注册为登录 url 我在其中对用户进行身份验证 我选择创建自定义视图以便能够添加消息和日志记录 身份验证工作正常 但我对 GE
  • 如何在 RSpec 中包含多个模块?

    我不确定如何将多个模块包含到 RSpec 中 所以让我描述一下我的情况 Under app helpers我有两个带有帮助程序的文件 其中包含模块ApplicationHelper and MailersHelper 尽管这些是我在视图和邮
  • Android 中的 Glide 多种变换

    我一直在使用 Glide 在我的应用程序中加载图像 我有一个自定义转换 我在加载图像时使用它ImageView 问题是我想应用我的自定义转换 centerCrop两者都在获取的图像上 但 Glide 仅使用我的自定义转换并在中显示图像Ima
  • 来自 C++ 模型的 QML MapPolygon

    我想动态添加 删除 编辑MapPolygon在 QML 地图应用程序中 我还有一些其他创建多边形的工作 文件导出 导入等 所以我认为我应该使用MapItemView使用 C 模型提取多边形数据 我尝试使用自己的基于 QObject 的对象创
  • 如何使用 image 在 solana 上创建令牌,并立即禁用铸造新令牌?

    我尝试搜索 但旧指南说创建令牌并将其添加到 solana 存储库的令牌列表中 但它现在是只读的 我尝试搜索 但我发现的所有内容都不是有效的解决方案 死服务和诈骗服务什么的允许禁用 mint 并将 self 添加为 token cotrole
  • 访问用于绑定 gridview 的数据或 dataItem

    我有一个 gridview 我以编程方式设置数据源并将其数据绑定到对象集合 对于创建的每一行 我在字段中使用不同的方法从对象中提取相关信息 如下所示
  • 如何处理通知中混合的 RTL 和 LTR 语言?

    背景 Android 4 3增加了大量对RTL 从右到左 语言的支持 例如希伯来语和阿拉伯语 问题 即使有 textDirection layoutDirection 和 gravity 我也找不到通知生成器的等效项 甚至在兼容性库中也找不
  • 如何创建更新触发器以增加/减少 1 个数字到总票数

    我有两张表 posts id title content total votes 1 title1 content1 3 2 title2 content2 2 votes id id post value
  • 为什么 UISearchBar 在返回时会出现奇怪的闪烁?

    我的 UINavigationItem 的 titleView 中有一个 UISearchBar 与 UISearchController 关联 当我向后导航时 它似乎在闪烁 有人以前见过这个吗 闪光视频 https www youtube
  • GitHub 是否限制对公共“原始”文件的访问?

    GitHub 有公共访问限制吗 示例文件 https raw githubusercontent com vuejs vue dev package json 如果一百万个用户下载这个文件会发生什么 这是来自 GitHub 员工关于 原始
  • Rails 在 64 毫秒内完成 406 不可接受

    我的网站上有一个表格 其中有一个页面可以编辑 删除 添加邮箱 http example com settings mailboxes http example com settings mailboxes http example com
  • NuGet 用于多个项目的解决方案

    假设我有一个包含 3 个项目的解决方案 Core UI Tests 我使用的一些 NuGet 包将适用于所有 3 个项目 有些仅适用于 UI 和测试 有些仅适用于测试 如 NUnit 是什么right使用 NuGet 进行设置的方法 当我需
  • Python 内省:如何获取类方法的变量名?

    我想获取类方法的关键字参数的名称 我想我了解如何获取方法的名称以及如何获取特定方法的变量名称 但我不知道如何组合这些 class A object def A1 self test1 None self test1 test1 def A2
  • 优化 Delphi 中的类大小。有没有类似“打包课程”之类的东西?

    我正在尝试优化 Delphi 类的大小 以便它们占用尽可能少的内存 因为我创建了大量的类 问题是 课程本身很小 但并没有占据我预期的空间 例如 如果我有 type MyClass class private mMember1 integer