以与文件大小相同的格式获取类或对象的大小?

2024-05-02

如何从内存中最好地确定类的大小?

这是一个可以使用的基本示例类 - 请注意,这些变量除了用于示例之外没有其他用途:

type
  TMyClass = class
  public
    fString1: string;
    fString2: string;
    fInteger1: Integer;
    fInteger2: Integer;

    constructor Create;
    destructor Destroy; override;
  end;

我想做的是返回与磁盘上的文件相同的大小。

因此,如果我将 TMyClass 保存到文件并且文件的大小为 2.4kb,例如,我希望获得该值,甚至不需要文件位于磁盘上(从内存获取大小)。

在在这里提问之前,我一直在搜索和阅读,这是我迄今为止尝试过的,结果好坏参半:

  • 实例大小

    在我的类上使用 TMyClass.InstanceSize 仅返回值 12。

  • SizeOf

    在我的类上使用 SizeOf(TMyClass) 只会返回值 4。

无论返回什么值,我都将格式化为 FileSize 格式,例如千字节和兆字节等。

我一定做错了什么,因为我知道我的类中使用了超过 12(或 4)字节的数据。我还知道我正在引用正确的类,它与我在 Form Create 和 Destroy 事件中创建和释放的类以及在运行时使用的类相同。

我正在尝试做的事情是否正确,如果是的话,我的例子应该有效吗?如果它们应该起作用,我知道我需要仔细查看我的实际类和对象。

实现此目的的肮脏方法是将我的对象类保存到文件,读取文件大小,然后删除临时文件。但我不喜欢这样做,我认为它们很肮脏并且走捷径。目的是从内存中读取我的类的大小,而不诉诸保存和临时文件等。

我期待听到您的意见和建议,谢谢。


不知道你是怎么得到12的InstanceSize在这样的课堂上。应为 20(D2009 之前)或 24(D2009 及之后)。它比保存文件的实际大小小得多的原因是因为字符串不保存在对象本身中;它们是引用类型,实现为指向实际字符串数据的指针。

你的“肮脏方法”是在正确的轨道上。几乎确定此类对象需要多少磁盘空间的唯一方法就是实际序列化它。但您不需要将其保存到磁盘。如果您当前正在使用 TFileStream 保存对象(如果不是,则应该这样做),请改用 TMemoryStream,这会将其“保存”到内存缓冲区中。然后得到Size流的大小,这就是对象的序列化大小,所有这些都无需创建然后删除临时文件。

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

以与文件大小相同的格式获取类或对象的大小? 的相关文章

  • 如何将接口类型传递给过程

    如何将接口类型传递给过程参数 type Hello PortType interface ISoapInvokable 243CBD89 8766 F19D 38DF 427D7A02EAEE function GetDeneme s st
  • 作为属性的类引用

    谷歌对于这类搜索毫无用处 因为你会得到数亿个结果 其中没有一个与特定问题相关 问题很简单 Delphi 中是否可以有类引用属性 如果是这样 怎么办 这是我尝试过的 type TMyObject class end TMyObjectClas
  • TControlState.csDesignerHide 与 TControlStyle.csNoDesignVisible

    VCL 似乎提供了两种向表单设计者隐藏控件的机制 TControlState csDesignerHide and TControlStyle csNoDesignVisible 就 IDE 而言 它们之间有什么区别 什么时候应该使用哪个
  • 条件表达式在包内是否被破坏?

    考虑以下片段 requires designide rtl vcl IF RTLVersion lt 19 0 E2026 Constant expression expected IF CompilerVersion 22 0 same
  • delphi分组框标题颜色变化

    我正在使用 BDS 2006 想知道您是否可以使用项目中存在的 XPmanifest 更改组框和单选按钮组标题的颜色 因为它始终是蓝色 唯一的方法是重写 Paint 方法TGroupBox http docwiki embarcadero
  • 如何使用 jQuery 和“长轮询”通过 Indy HTTP 服务器动态更新 HTML 页面?

    我读过这篇文章使用 JavaScript 和 jQuery 的简单长轮询示例 http techoctave com c7 posts 60 simple long polling example with javascript and j
  • 在 Outlook 中创建带有附件的邮件并显示它

    我想在 Outlook 中创建一封带有附件的邮件并在发送之前显示它 但我想我已经尝试了几乎在网上找到的所有示例 但没有任何运气 我可以使用 Indy 但我非常想使用 Outlook 来确保邮件正确 因为它是用于商业用途 函数的任何输入 该函
  • Delphi - 将字符串从 UTF-8 转换回来

    我在将 UTF 8 编码字符串转换回 delphi 可用的字符串时遇到问题 该应用程序是用 XE8 编写的 并部署在 Windows 和 OSX 上 该应用程序分别在 Windows 和 OSX 上使用 LimeLM API dll 和 d
  • 能否从 Vista Shell 获取 48x48 或 64x64 图标?

    如果 Vista Shell 中存在 48x48 或 64x64 图标 如何使用 SHGetFileInfo 获取在 TImage 中显示图标的句柄 我想从图像列表中选择一个代表文件夹路径的图标 并在 Timage 中显示 48x48 或
  • 为应用程序启用主题

    我有一个旧的应用程序 在Win XP中的delphi 7中启动 现在我正在使用delphi 2009 win Vista 如果我开始一个新项目 所有按钮都有一个圆形边缘 但在我的旧应用程序中 所有按钮都有 方形 形状的外观 有什么设置我错过
  • 获取字符、整数和日期字段的字段 oldValue 和 newValue

    我试图只保留表更改的历史记录 所以我想获取一个字段在更改为oldValue之前的值 然后获取它更改为newValue的值 两个值都应转换为字符串 因此 这是该表的一个示例 PartNumber Description 12345 Test
  • 如何将 TGifImage 中的帧提取为位图?

    下面的演示尝试在表单的画布上绘制 GIF 这不起作用 图像不会前进 如何让它发挥作用 procedure TForm1 FormCreate Sender TObject begin GIF TGIFImage Create GIF Loa
  • 如何将 JSON 字符串转换为图像?

    我有一个将图像转换为 JSON 数组的应用程序 并将其保存到 blob 字段中 function getImage String var memorystream TMemoryStream jsonArray TJSONArray beg
  • 如何读取注册表项的默认值

    我有一个 Delphi XE2 项目来使用注册表项进行某些操作 所以我定义了以下代码 procedure TMainForm BitBtn01Click Sender TObject var RegistryEntry TRegistry
  • 如何追踪手柄泄漏?

    在我的一个应用程序中 我观察到句柄数量不断增加 在不使用应用程序的情况下 该数字大约每秒增加一次 因此后台处理代码的某些部分一定存在句柄泄漏 我如何追踪此类泄漏 有什么工具可以帮助解决这个问题吗 跟踪句柄泄漏时要寻找哪些模式 导致手柄泄漏的
  • Delphi - 如何获取 USB 可移动硬盘和记忆棒的列表?

    在我的应用程序 Delphi 中 我需要列出所有 USB 存储设备 这些可以是闪存棒or外部存储驱动器 有一个Jvcl成分JvDriveCombo 并且它有DriveType属性 问题是我是否选择DriveType Fixed那么除了外部驱
  • 查找Delphi项目中的所有编译错误

    我正在对我的 Delphi 项目进行一些重构 我希望能够做出改变 然后看看all项目中因该更改而中断的地方 类似于 Eclipse 列出项目的所有编译错误 在 Java 中 在 Delphi 中 我可以进行更改 然后重新编译我的项目 但编译
  • 如何从 Delphi 中的函数返回对象而不导致访问冲突?

    我有一个返回 TStringList 的 delphi 函数 但是当我返回一个值并尝试使用它时 我收到一个访问冲突错误 即 myStringList FuncStringList myStringList Items Count lt Th
  • 调试器异常错误和内存超调

    我尝试运行以下代码 但它显示有关内存地址的错误 并显示一条消息 循环后 n 可能未定义 请看一看 var n max integer n integer r R1 f h0 Array of Real const h 0 00889 nip
  • Delphi中使用FindVCLWindow调用WinHelp32(WinXP Pro SP3 32bit)

    有什么问题吗 procedure TForm1 VCLHelpClick Sender TObject var Ctrl TWinControl begin Ctrl FindVCLWindow Mouse CursorPos if Ctr

随机推荐

  • Summernote onKeyup 事件未按预期工作

    我将 Summernote 编辑器应用于文本区域 我希望当我在编辑器中键入一些文本时 该文本应反映在 div 中 因此我有一个文本区域和一个 div result 其中应在每次按键时写入更改事件
  • 计算回头客

    我正在分析一家商店的销售数据 并希望计算 第一订单客户 在下个月变成回头客的百分比 我有一个包含所有订单的数据框 其中包括客户 ID 日期和标记 如果这是他 她的第一笔订单 这是我的数据 import pandas as pd data N
  • 运行时之前初始化的数据段值将存储在哪里?

    通常数据段在C code位于RAM易失性存储器 由初始化数据段组成 未初始化数据段 BSS 堆栈内存和堆 堆栈内存仅在运行时调用例程和在push and pull的价值观 堆用于动态内存分配调用malloc calloc and reall
  • 我在 Python 中查找重复循环的正则表达式模式有什么问题?

    我想匹配任何具有重复循环的字符串 就像这个数据一样 3333333333333333333333333333333333333333 1 digit cycle 3 1666666666666666666666666666666666666
  • React 18 的 create-react-app 依赖版本问题

    npx create react app my project导致以下依赖错误 npx版本 8 5 0 Installing template dependencies using npm npm ERR code ERESOLVE npm
  • 通过 Facebook iOS SDK 获取我的所有活动

    在我的 iOS 应用程序中 我使用以下代码获取访问令牌 self facebook authorize NSArray arrayWithObjects user events friends events nil 然后我使用以下代码请求我
  • java堆空间OutOfMemoryError分析工具

    我正在得到一个OutOfMemoryError Java heap space 我可以使用任何工具来查找根本原因吗 您可以使用一些分析工具 例如 eclipse mat 分析应用程序的堆转储 以查看哪些内容消耗了多少堆 但首先您需要获取应用
  • 如何选择不同级别的多个节点?

    拥有这个 简化的 XML
  • Visual Studio 2017 无法安装多个组件

    Visual Studio 2017 社区版发行版的安装程序因多个组件而失败 由于以下原因 产品无法安装列出的工作负载和组件 一个或多个包失败 工作负载不完整 使用 NET进行移动开发 Microsoft VisualStudio Work
  • C++:错误:限定名称的使用无效

    更新 我认为它已经修复了 多谢你们 我收到错误 但我无法弄清楚 我有这个代码 A Structure with one variable and a constructor struct Structure public int dataM
  • 设置背景时按钮变大 - 如何使其变小

    我想让我的按钮在设置背景之前缩小或恢复正常 我知道使用背景色调可以使用相同的背景颜色来解决此问题 但我的问题是我在背景上使用选择器 当选择器设置为按钮背景时 它变得更宽 当我将背景切换为背景色调时 颜色变得不同 例如对我来说是紫色 并且按下
  • 如何在 ActiveAdmin 中正确配置 Rails 4.1 枚举

    我有一个 Rails 4 1 应用程序 其中使用枚举来表示对象的隐私级别 在我的架构中 t integer privacy level default 0 在我的模型中 enum privacy level privacy private
  • 从 SQL 表在 SQL 中创建数据透视视图

    我有下表TEMP 我想使用 SQL 创建一个数据透视视图 排序依据CATEGORYASC 通过LEVEL降序和SETASC 并填写value 预期输出 我已尝试以下代码 但无法解决引发错误的聚合部分 SELECT FROM SELECT S
  • 自动化 Windows UI 测试方法

    我们正在寻求设置自动化 UI 测试 并想知道最好的方法是什么 潜在的陷阱是什么 设置费用是否昂贵 提前致谢 B 自动化测试最大的消耗可能是时间 有很多非常昂贵的工具 但也有免费的工具 即使是昂贵的工具的成本也不太可能与正确设置自动化测试所需
  • 如何处理Spring Boot中的SQLIntegrityConstraintViolationException?

    我正在 RestController 工作 尝试使用 try catch 块处理 SQLIntegrityConstraintViolationException 但我不知道为什么 catch 块从未执行 这是休息控制器 import ja
  • 使用 socket.io node.js 和传入消息的通知系统的架构实现和设计

    免责声明 我之前没有使用过node js 我以前没有使用过socket io 我正在考虑实现 Google Plus Facebook StackOverflow 风格的通知系统 我不是一个没有经验的开发人员 最终我会解决这个问题 但我只是
  • 增加android中的网格间距

    我有一个网格视图 其中三列中有很多项目 我想增加它们之间的间距 我怎样才能在安卓中做到这一点 您可以使用android verticalSpacing and android horizontalSpacing在 GridView 标记中并
  • Letrec 和可重入延续

    有人告诉我 以下表达式的计算结果为 0 但许多方案的实现将其计算为 1 let cont f letrec x call with current continuation lambda c set cont c 0 y call with
  • makefile 中的 $< 和 $@ 是什么意思?

    I have a csv b csv 在我的docs csv目录中 我需要将每个文件转换为 json 文件 我遵循这个question https stackoverflow com questions 2706064 compile al
  • 以与文件大小相同的格式获取类或对象的大小?

    如何从内存中最好地确定类的大小 这是一个可以使用的基本示例类 请注意 这些变量除了用于示例之外没有其他用途 type TMyClass class public fString1 string fString2 string fIntege