如果gc在go中是可选的怎么办?

kfm*_*e04 2 garbage-collection go

这样的语言是可行的还是有特定的功能,绝对需要某种形式的gc?

注意:我不是反gc,但是来自C/C++背景并且在实时服务器应用程序上工作,我更喜欢保持一定程度的控制如何以及何时收获内存(不能有10s垃圾 - 在现场运行中发生的收集).

鉴于我的要求,我的担忧是否切合实际?或者go gc如此之好以至于我的担忧是没有根据的?

Go的gc是我唯一一个关于尝试使用我的C++实时服务器端口的保留.

Eva*_*haw 7

使用可选GC需要更改语言.这是一个完全有效的Go函数,它将使C程序员的皮肤爬行:

func foo() *int {
    a := 1
    return &a
}
Run Code Online (Sandbox Code Playgroud)

这很好,因为Go编译器会发现a需要在堆上分配变量.它将在以后进行垃圾收集,您无需关心.(好吧,好吧,在某些情况下你可能.但是大多数时候你没有.)

您可以编写各种编译器将执行此类操作的方案.没有垃圾收集器就不一样了.

您可以采取一些措施来帮助GC时间,但在某种程度上,您将无视该语言的优势.我对推荐这些做法犹豫不决,但可以选择:

  • 免费清单
  • 使用不安全的软件包,您甚至可以编写自己的分配器并手动释放内存,但是您需要为要分配的每种类型提供一个函数.或者使用反射传递要分配的类型,返回空接口,并使用类型断言来获取具体值.

最重要的是,对于具有硬实时要求的应用程序来说,Go可能不是一个好的选择.也就是说,我也不认为你会看到任何接近10秒垃圾收集的东西.考虑一下您的要求是什么,如果您有任何疑问,请进行一些测量.

如果可以,请尝试最新的Go代码.有一些垃圾收集器改进和一些编译器优化导致更少的分配.但是,如果您的发布时间较短,您可能会坚持使用当前的稳定版本几个月.