什么时候需要在Ruby C扩展中声明不稳定的VALUE?

Doc*_*awk 6 c c++ ruby garbage-collection mark-and-sweep

我找不到很多文档,说明何时适合在Ruby扩展中声明VALUEas volatile,以避免使用中对象的过早垃圾收集.

这是我到目前为止所学到的.任何人都可以填补空白吗?

volatile不是需要使用:

  • 在C++对象成员中(因为它们从不在堆栈中?)
  • 在不调用Ruby API的C/C++方法中(因为在调用Ruby API 之前GC没有打开)

如果volatile 确实需要使用

  • 在C/C++方法中调用任何Ruby ALLOCmalloc宏/函数(因为这些可以在内存高度分散时触发GC)
  • 在C/C++方法调用任何Ruby功能(例如,rb_funcall,rb_ary_new等等)

其他避免GC的方法

  • 标记VALUEs正在使用中
  • 在对象创建期间禁用GC,然后重新启用它
  • 不要使用Ruby的分配方法(有风险)

一切都正确吗?我错过了什么细节?除了标记,是volatile唯一的方法吗?

fha*_*ahn 0

基于变量volatile不能“自行”更改值的假设,将变量标记为可防止 C/C++ 编译器应用某些优化。维基百科:挥发性变量

VALUE我认为当 a与 C 扩展之外的 Ruby 代码共享或可以更改时,应该使用它,以使编译器意识到这一事实。看看这个例子