我找不到太多关于何时适合声明的文档VALUE
as volatile
Ruby 扩展中以避免过早对正在使用的对象进行垃圾回收。
这是我到目前为止所学到的。有人可以填空吗?
When volatile
does not需要使用:
- 在 C++ 对象成员中 (因为它们从来不在堆栈上?)
- 在不调用 Ruby API 的 C/C++ 方法中(因为在调用 Ruby API 之前 GC 不会打开)
When volatile
does需要使用
- 在调用任何 Ruby 的 C/C++ 方法中
ALLOC
or malloc
宏/函数(因为当内存高度碎片化时这些会触发GC)
- 在调用任何 Ruby 函数的 C/C++ 方法中(例如,
rb_funcall
, rb_ary_new
, etc.)
其他避免GC的方法
- mark
VALUE
正在使用的
- 在对象创建期间禁用 GC,然后重新启用它
- 不要使用 Ruby 的分配方法(有风险)
一切都正确吗?我缺少什么细节?除了标记之外,还有volatile
唯一的办法?
我想说的经验法则是,如果您的变量值可以在运行时随时更改,并且您不知道何时更改,请使用volatile
关键词。这包括中断。例如,您有中断回调函数,可以计算用户在键盘上按下某项的次数。您的程序不知道用户何时按下键盘上的按钮,因此您的计数器变量必须声明为volatile
关键词。
如前所述,它禁用变量的某些编译器优化。例如:
int a = 5;
while(a == 5){
//do something
}
编译器优化了while(a == 5)
声明给while(true)
因为它发现变量 a 在运行时不能更改,并且检查 a 的值是没有用的a
每个循环。所以你最终陷入了无限循环。但如果你添加关键字volatile
:
volatile int a = 5;
while(a == 5){
//do something
}
您只需告诉编译器将变量保留原样即可。不要对其进行任何优化,某些中断可能会改变它的值。在这方面它工作得很好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)