我找不到太多关于何时适合在 Ruby 扩展中声明 a VALUE
asvolatile
以避免过早地对使用中的对象进行垃圾收集的文档。
这是我到目前为止所学到的。任何人都可以填空吗?
什么时候volatile
不需要使用:
- 在 C++ 对象成员中(因为它们从不在堆栈上?)
- 在不调用 Ruby API 的 C/C++ 方法中(因为在调用 Ruby API 之前 GC 不会打开)
什么volatile
时候需要使用
- 在调用任何 Ruby
ALLOC
或malloc
宏/函数的 C/C++ 方法中(因为这些可以在内存高度碎片化时触发 GC) - 在调用任何 Ruby 函数的 C/C++ 方法中(例如,、、
rb_funcall
等rb_ary_new
)
其他避免GC的方法
VALUE
正在使用的标记- 在对象创建期间禁用 GC,然后重新启用它
- 不要使用 Ruby 的分配方法(有风险)
一切都正确吗?我缺少什么细节?除了标记,是volatile
唯一的方法吗?