Я не могу найти много документации о том, когда уместно объявить VALUE
как volatile
в расширениях Ruby, чтобы избежать преждевременной сборки мусора используемых объектов.
Вот что я узнал до сих пор. Кто-нибудь может заполнить пробелы?
volatile
делает не нужно использовать:volatile
делает нужно использоватьALLOC
или же malloc
макросы / функции (потому что они могут вызвать GC, когда память сильно фрагментирована)rb_funcall
, rb_ary_new
, так далее.)VALUE
s, которые используютсяВсе ли правильно? Какие детали я пропускаю? Кроме маркировки, есть volatile
единственный способ?
Маркировка переменной как volatile
запрещает компилятору C / C ++ применять определенные оптимизации, исходя из предположения, что переменные не могут изменять значения «сами по себе». Википедия: Изменчивая переменная
Я думаю, что это должно быть использовано, когда VALUE
используется совместно или может быть изменен кодом Ruby вне расширения C, чтобы компилятор знал об этом факте. Посмотри на этот пример.
Других решений пока нет …