Когда необходимо объявлять изменчивые ЗНАЧЕНИЯ в расширениях Ruby C?

Я не могу найти много документации о том, когда уместно объявить VALUE как volatile в расширениях Ruby, чтобы избежать преждевременной сборки мусора используемых объектов.

Вот что я узнал до сих пор. Кто-нибудь может заполнить пробелы?

когда volatile делает не нужно использовать:

  • в объектах C ++ (потому что они никогда не в стеке?)
  • в C / C ++ методах, которые не вызывают Ruby API (потому что GC не включен до вызова Ruby API)

когда volatile делает нужно использовать

  • в C / C ++ методы, которые вызывают любой из Ruby ALLOC или же malloc макросы / функции (потому что они могут вызвать GC, когда память сильно фрагментирована)
  • в методах C / C ++, которые вызывают любые функции Ruby (например, rb_funcall, rb_ary_new, так далее.)

Другие способы избежать GC

  • отметка VALUEs, которые используются
  • отключить GC во время создания объекта, а затем снова включить его
  • не используйте методы выделения Ruby (рискованно)

Все ли правильно? Какие детали я пропускаю? Кроме маркировки, есть volatile единственный способ?

6

Решение

Маркировка переменной как volatile запрещает компилятору C / C ++ применять определенные оптимизации, исходя из предположения, что переменные не могут изменять значения «сами по себе». Википедия: Изменчивая переменная

Я думаю, что это должно быть использовано, когда VALUE используется совместно или может быть изменен кодом Ruby вне расширения C, чтобы компилятор знал об этом факте. Посмотри на этот пример.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]