1
35
主要是历史原因。fillchar()可以追溯到turbo-pascal时代,并用于此目的。这个名字确实有点用词不当,因为当它说fill时 烧焦 (),真的满了 字节 ()原因是最后一个参数可以采用char 或 一个字节。因此,fillchar(foo,sizeof(foo),0)和fillchar(foo,sizeof(foo),0)是等效的。另一个令人困惑的原因是,截至Delphi2009年,即使char相当于widechar,fillchar仍然只填充字节。在研究Fillchar最常见的用法以确定大多数人是使用Fillchar实际用字符数据填充内存,还是仅使用它用某个给定的字节值初始化内存时,我们发现后一种情况主导了它的使用,而不是前一种情况。因此,我们决定以fillchar字节为中心。 如果不在适当的上下文中使用,则清除包含使用“托管”类型之一(字符串、变量、接口、动态数组)声明的字段的Fillchar记录是不安全的。然而,在您给出的示例中,对本地声明的记录变量调用fillchar实际上是安全的。 只要这是你在这个范围内对记录做的第一件事 . 原因是编译器已经生成代码来初始化记录中的字符串字段。这将已将字符串字段设置为0(零)。调用fillchar(foo,sizeof(foo),0)只会用0字节覆盖整个记录,包括已经为0的字符串字段。在记录变量上使用FILLCHAR 之后 不建议为字符串字段指定值。使用初始化常量技术是这个问题的一个很好的解决方案,因为编译器可以生成适当的代码,以确保在分配期间正确地完成现有的记录值。 |
2
15
如果您有Delphi2009及更高版本,请使用
见 David's answer 对这个问题 How to properly free records that contain various types in Delphi at once? . 编辑:
使用
初始化记录的方法可以变得更简单:
有时,您希望参数具有非默认值,然后这样做:
这将节省一些输入,重点放在重要的内容上。 |
3
9
Fillchar可以确保在
新建,未初始化
结构(记录、缓冲区、数组…)。
当你有能力直接摆弄记忆时,总有一种方法可以让你的脚受伤。 |
4
4
菲尔查尔 通常用来填充 数组 或 记录 只有数字类型和数组。你说得对,如果有 串 (或任何引用计数变量) 记录 . 尽管你建议使用 康斯特 要初始化它,当我有一个 可变长度 数组 我要初始化的。 |
5
2
传统上,字符是一个单字节(对于Delphi2009不再是这样),因此使用带0的fillchar将初始化分配的内存,使其只包含空值、字节0或bin 00000000。 你应该使用 零内存 用于兼容性的函数,其调用参数与旧Fillchar相同。 |
6
2
问题也可能是:
没有
零内存
在Windows中运行。在头文件中(
零内存是语言中性术语 “您平台的功能可用于零内存”
Delphi等价于
因为Delphi没有宏(并且在内联之前),所以调用 零内存 意味着您必须在实际开始之前接受额外函数调用的惩罚。 菲尔查尔 . 所以在很多方面, 菲尔查尔 是一个性能微优化-现在已经不存在了 零内存 内联:
奖金读数Windows还包含 SecureZeroMemory 功能。它的作用和 零内存 . 如果它和 零内存 ,它为什么存在?
因为一些智能C/C++编译器可能会认识到将内存设置为
我不认为Delphi的编译器和其他编译器一样聪明,所以不需要 安全保险柜 . |
7
1
这个问题有一个更广泛的含义,在我的脑海里已经有好多年了。我也是,从小就用Fillchar做记录。这很好,因为我们经常在(数据)记录中添加新字段,当然Fillchar(rec,sizeof(rec),0)会处理这些新字段。如果我们“正确地做”,我们必须遍历记录的所有字段,其中一些字段是枚举类型,其中一些字段可能是记录本身,结果代码的可读性较低,如果我们不努力地向其添加新的记录字段,也可能是错误的。字符串字段很常见,因此fillchar现在是no。几个月前,我把字符串字段记录中的所有FillChar转换为迭代清除,但我对解决方案不满意,我想知道是否有一种简单类型(顺序/浮点)的“填充”和变量和字符串的“最终确定”的简洁方法? |
8
0
以下是不使用fillchar初始化资料的更好方法:
Record in record (Cannot initialize)
|
GTDev · 记录中的大写字段名称 6 年前 |
NormX · 在窗体访问上打印预览到当前记录 7 年前 |
user9107323 · PHP会话记录只返回一条记录 7 年前 |
CaesiumWhale · 在Ada标记类型中创建2D数组字段 7 年前 |
Nikolay Josh Konovalenko · 分配记录VHDL 7 年前 |