【问题标题】:Deallocate / Free / Release Functions解除分配/释放/释放功能
【发布时间】:2014-07-05 20:49:29
【问题描述】:

是否可以解除分配功能?假设你有一个巨大的初始化函数,它只运行一次,在你调用它之后是否可以释放它,并使用额外的存储空间?我主要对 C 感兴趣,但如果该语言提供有趣的行为,请随时为任何其他语言发帖。

我知道函数不是在堆上分配的,因此您可能无法回收它们的内存,但这对我来说似乎是一种浪费。

【问题讨论】:

  • 不在标准 C 中。(请记住,C 语言没有任何堆、堆栈或函数“生存”的位置的概念。)
  • @OliCharlesworth 我假设你的意思是堆等依赖于实现?还有“不在标准C中”,非标准C呢?
  • 是的,完全正确。不过,您完全有可能在您所运行的任何平台上找到一种非标准的方式来执行此操作。
  • 这不是一个答案,但我建议购买更多内存。您的巨大功能可能具有例如1000 行 = 2 000 个字节已编译。不知道你在哪个平台上工作,但是 2 kB 的内存应该不会那么贵。
  • 你当然可以做一些动态加载和卸载,大多数现代桌面平台都支持...

标签: function memory-management


【解决方案1】:

使用语言功能无法做到这一点。

但是根据您使用的系统,操作系统可能会通过正常的内存管理技术自行完成。 (但如果是这样,那就是“意外”。)

让我解释一下:程序被映射到内存并运行。一段时间未使用的代码将被内存溢出。数据被放入磁盘上的交换区,以便以后能够“回收”它,但代码始终存在于可执行文件中,如果需要,可以再次从那里获取。

当然,这并非在所有系统上都会发生,但 Linux 和 AFAIK Windows 也可以这种方式工作。

【讨论】:

  • 这很有趣,但我还是想看看是否有办法用任何语言做到这一点。
  • @JeroenBollen:您似乎将“语言”与“实施”混为一谈。不太可能有任何语言对这种实现细节具有一流的支持(尽管很难证明是否定的),因为它可能被编译为在这样的概念甚至没有意义的平台上运行。但是,在特定系统上,可能有一个可用的 API 允许您操纵内存的使用方式。
  • @OliCharlesworth 这让我想到了一个问题,为什么没有语言(或所述语言的实现)允许这样的功能?
  • @Jeroen:(推测)因为(a)通常不需要,(b)因为除非语言与特定平台相关联,否则它可能会在没有概念的平台上运行甚至可能。
  • @OliCharlesworth 虽然实现是特定于平台的,但我同意常规应用程序不需要这个。
【解决方案2】:

使用 python,您可以在程序的生命周期内创建类和函数,也可以删除它们。由于在实现语言之上有一些样板(cPython 使用 C),你会丢失内存,所以它在这个应用程序中不是一个特别有用的概念

【讨论】:

  • 它是如何实现的?
  • 一个简短的说明,虽然我对我的建议相对有信心,但我没有体验过一些 CPython 代码库,所以我是从语言中推断出来的。 Python 在大多数实现中都被解释。 CPython 将生成字节码并即时解释:stackoverflow.com/a/1644742/1215241 它使用内存管理 - 垃圾收集,一切都是对象。因此,函数是对象,因此可以在语言中动态添加和删除,一旦省略所有引用。为确保删除 init 函数,请确保除一个引用之外的所有引用都是弱引用
  • 这可能是一个有趣的阅读stackoverflow.com/questions/11016078/…
  • 我知道你可以编译一个函数并将其加载为动态库,但这与这个问题并没有真正的关系。
  • 在这种情况下,它与加载动态库不同,它是一种解释语言,它赋予了它这个特性。在您的情况下,如果您可以找到函数在内存中定义的位置以及指向它的任何指针,并安全地删除它们,那么您已经实现了目标,但是该内存可能无法被程序使用,因此它是空闲的“浪费”不能用于它的设计目的。解释性语言(通常)不会编译到内存中,因此可以像附加到内存中一样轻松地删除数据。
【解决方案3】:

您可以使用共享库(例如 dll)来做到这一点。使用它们并卸载它们......

【讨论】:

  • 我知道我可以做到,加载 DLL 的函数将是我想要卸载的完美函数。
【解决方案4】:

您可以在运行时使用 JavaScript 定义函数并将它们分配给变量。稍后您可以删除该函数,或者将其定义为局部变量时将其留给垃圾收集器。

var MyImplementation = {};
MyImplementation.test = function() {
console.log("hello");
};
MyImplementation.test();
delete MyImplementation.test;
MyImplementation.test();

这会产生:

你好

TypeError: undefined is not a function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2014-12-18
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    相关资源
    最近更新 更多