Это сойдет вам с рук на MoarVM, по крайней мере, на данный момент, при условии, что вы сохраните ссылку на Blob
или Buf
в Perl 6 до тех пор, пока это требуется нативному коду и (в в случае Buf
) вы не пишете в него, что может привести к изменению размера.
MoarVM выделяет объект Blob
/ Buf
внутри детской и перемещает его во время прогонов ГХ. Однако этот объект не содержит данных; скорее он содержит размер и указатель на блок памяти, содержащий значения. Этот блок памяти не выделяется с помощью GC и поэтому не будет перемещаться.
+------------------------+
| GC-managed Blob object |
+------------------------+ +------------------------+
| Elements |----->| Non-GC-managed memory |
+------------------------+ | (this bit is passed to |
| Size | | native code) |
+------------------------+ +------------------------+
Стоит ли полагаться на это, это более сложный вопрос. Некоторые соображения:
- Насколько я могу судить, все могло бы пойти не так хорошо, если бы я работал на JVM. Я не знаю о бэкэнде JavaScript. Вы могли бы на законных основаниях решить, что из-за уровней усыновления вам пока придется беспокоиться только о работе на MoarVM.
- В зависимости от деталей реализации MoarVM вполне подходит, если вам просто нужна скорость в вашем собственном коде, но если вы работаете над модулем, который вы ожидаете получить широкое распространение, вы можете подумать, стоит ли это того. Команды Rakudo и MoarVM проделали большую работу, чтобы не регрессировать рабочий код в модульной экосистеме, даже в тех случаях, когда можно утверждать, что он зависел от ошибок или неопределенного поведения. Однако это может заблокировать улучшения. Кроме того, в некоторых случаях поломка считается стоящей. В любом случае, это отнимает много времени и ложится на команду добровольцев. Конечно, когда авторы модулей отзывчивы и могут применять предоставленные исправления, это несколько меньше проблем.
Проблема с «положением черты» заключается в том, что решение - по крайней мере, относительно JVM - кажется, должно быть принято заранее, когда выделяется память, содержащая данные. В этом случае переносимое решение, вероятно, не может позволить пометить существующий Buf
/ Blob
как таковой. Возможно, лучшим способом будет то, что объекты ввода-вывода будут запрашивать что-то вроде CArray
, так что нулевое копирование может быть достигнуто при наличии данных в «правильном виде памяти» в первую очередь. , Это, вероятно, разумный запрос на добавление функций.