【问题标题】:TCL Freeing up memoryTCL 释放内存
【发布时间】:2012-01-10 23:02:00
【问题描述】:

我有一个关于 TCL 内存管理的基本问题。

  1. 假设我有一个 Tcl 程序。在该过程中,我声明了一个数组并在其中添加了一些数据。我对该数组进行了一些数字运算。我的问题是在程序返回之前我需要手动删除数组吗?使用:

    unset <array_name>
    

    我的答案是否定的。但我不确定,因为我不知道 Tcl 中是否有垃圾收集器。有人可以对此发表评论吗?

  2. 在 Tcl 中使用数组不好吗?我想创建列表数组,并且在阅读有关堆栈溢出的讨论时,人们被告知要使用 dict 来处理这类东西,但因为我有 Tcl 8.4,所以我不能。 Tcl中的数组有什么问题?

【问题讨论】:

  • 可能是数组,如果使用多维而不是 dict 更麻烦。但是,我没有任何东西可以比较这两种技术的内存管理。哪个效率更高?
  • 如果你做“数字运算”,其他一些数据结构有时会更好(例如 BLT 向量或 NAP wiki.tcl.tk/4015 包中的东西)

标签: tcl


【解决方案1】:
  1. 假设我有一个 Tcl 程序。在该过程中,我声明了一个数组并在其中添加了一些数据。我对该数组进行了一些数字运算。我的问题是在程序返回之前我需要手动删除数组吗?

没有。当过程返回时它将被删除(即,它的生命周期与堆栈帧的生命周期有关)。如果您愿意,您可以更早地unset 它,这将释放它的内存,但您不需要这样做。

  1. 在 Tcl 中使用数组有问题吗?我想创建列表数组,并且在阅读有关堆栈溢出的讨论时,人们被告知要使用 dict 来处理这类东西,但因为我有 Tcl 8.4,所以我不能。 Tcl 中的数组有什么问题?

数组在 8.4 中绝对没问题,只要你记得它们是一个集合,它实现了从任意字符串键到变量的映射。字典适用于您需要一个 value 来保存从字符串到任意值的映射的情况。 (关于 8.4 的某个地方有一个 dict 扩展。)您可以通过选择一些字符作为子索引之间的分隔符(例如,逗号)来使用数组来建模矩阵,并且这种技术已被许多人使用,效果很好。

然而将它们建模为列表更有效; lset 和多索引 lindex 允许有效更新和查找结果矩阵的元素。 (虽然有点冗长。)如果您要处理大量数据,那么提高效率可能非常有用。 (尽管如此,稀疏矩阵作为 Tcl 数组可能会更好。)另外请注意,如果您可以升级到 8.5,那么那里的许多操作会明显更快(特别是包括使用 info exists 测试数组元素的存在) )。

【讨论】:

  • 列表列表很好,但获取数据的步骤数也会增加。例如,我有一个这样的列表:{1 2 3 4} {5 6 7 8} 然后要访问2,我必须使用 lindex 两次。正确的? set var [lindex $mlist 0] 会给我{1 2 3 4} 然后第二个set var2 [lindex $var 1] 会给我2
  • 你可以这样做,也可以使用lindex:set var2 [lindex $mlist 0 1]的多索引形式。如果需要,lset 命令还可以采用多个索引,lsetlindex 都可以采用索引列表作为替代。
【解决方案2】:

Tcl 确实有垃圾收集(确切的实现是未定义的,无论是引用计数还是其他方法)。所以不,您不必使用unset 来避免内存泄漏。

我不确定为什么数组会被认为是坏的。您必须提供此类讨论的参考资料才能获得特定的 cmets。

【讨论】:

  • 可能是数组,如果使用多维而不是 dict 更麻烦。但是,我没有任何东西可以比较这两种技术的内存管理。哪个效率更高?
  • 我认为人们在使用 Tcl 编程时通常不会太担心效率。如果您使用的是 Tcl 8.4,则使用数组没有问题。
  • 你只需要在持久化上下文中取消设置生命周期有限的东西(例如,在全局命名空间中),但有些东西(例如,文件句柄、http令牌、对象)需要手动删除正常情况。
【解决方案3】:

不,退出过程时不需要释放本地变量。它们被自动释放。大多数时候都是这种情况,但也有例外(某些扩展可能要求您显式释放内容,而某些包,尤其是 http,会创建需要清理的令牌)

如果您在全局命名空间中创建大型数组,这些数组将不会被释放,因为它们仍然可以被访问。

在 tcl 中使用数组没有问题,但请确保您使用的是正确的工具。在 tcl 中,数组是“关联数组”,即它由字符串索引。如果您需要一个以整数为索引的 c 样式数组,则一个普通的旧列表可能会更好(您可以按值传递它),但您可能会认为它有点笨拙(下标是命令而不是带有子键的变量引用)

【讨论】:

  • 列表的下标非常快,比索引到数组(或字典)中快得多。
猜你喜欢
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 2013-12-05
  • 2015-04-22
  • 2011-01-17
  • 2021-12-23
  • 2017-06-29
相关资源
最近更新 更多