Lorsque j'écrivais une extension de Ruby en langage C, j'ai commencé à remarquer le mot-clé «volatile».
volatile
n'est généralement pas pris en charge même si vous programmez en C ou C ++. Celles-ci sont essentiellement liées à l'interaction avec ** en dehors du programme **. Pour le dire simplement, l'effet est que "la lecture et l'écriture vers la destination avec" volatile "seront effectuées exactement comme elles ont été écrites dans le programme". En d'autres termes, pour éviter des optimisations telles que "J'écris plusieurs fois de suite, donc je ne le ferai que la dernière fois" ou "Je lis sans rien changer dans le code, donc je vais interrompre la lecture". Devenir. c'est,
C'est un mécanisme pratique pour la manipulation (il y a aussi article plus détaillé).
Cependant, Ruby n'a pas d'accès direct au matériel. Si oui, cela signifie «travail externe», mais qu'est-ce que c'est?
Ruby a un garbage collector, qui est implémenté au niveau du langage C de base. Et ce ramasse-miettes ne sera pas récupéré en mettant simplement le handle [^ 1] VALUE
de l'objet Ruby dans le registre ou la pile, pas seulement dans une zone spéciale.
Cependant, si l'espace n'est pas considéré comme une variable, cela est également inutile. Ainsi, «VALEUR volatile» apparaîtra fréquemment pour vous forcer à réserver de l'espace en tant que variable.
Cependant, certaines parties ne peuvent toujours pas être couvertes. Normalement, il n'y a pas de problème car VALUE
est acheminé, mais si vous retirez le pointeur du contenu avec une chaîne de caractères etc. et n'utilisez que cela, après la dernière référence à VALUE
(en langage C) ) La variable VALUE
peut devenir inutile et peut être écrasée par autre chose et devenir la proie du ramasse-miettes (Exemple. /2012/04/ruby-garbage-collection-exerb-ruby.html)). Dans un tel cas, écrivez RB_GC_GUARD (variable VALUE)
après la partie qui nécessite VALUE
afin que VALUE
puisse survivre jusqu'à ce point [^ 2].
Même dans le monde de l'extension C, la "facilité d'écriture" comme l'idée de Ruby est toujours vivante, mais je pense que le conflit avec l'obscurité du langage C est aussi un aspect indéniable.
[^ 1]: Il y a des choses comme Fixnum
, nil
, false
, true
qui le traitent comme une valeur directe au lieu d'un handle.
[^ 2]: Le contenu de RB_GC_GUARD
inclut" passer "VALUE" à une fonction dont l'optimisation est supprimée par une notation spécifique au compilateur "et" écrire "VALUE" dans une variable externe "volatile" ". C'était.
Recommended Posts