Scheme提供了一种bytevector
类型,可用于对字节和字节数组进行低级操作(请参阅r6rs和chez手册(。然而,它似乎没有提供一种方法来检索其存储的字节数组的底层指针,我需要该指针传递给外部C函数,以填充或读取字节向量中的数据。
更准确地说,我正试图在Idris2中编写一些代码,用于低级别处理字节,Idris2使用Scheme作为后端,但我是Scheme的新手,所以我肯定忽略了一些明显的问题:从字节向量中提取该指针的首选方法是什么?
将字节向量的地址作为整数返回的操作将是危险的不安全操作,因为垃圾收集器随后可能会移动字节向量并将其他对象放置在那里。将过时的地址传递给C代码可能会导致内存损坏。
Chez Scheme的foreign-procedure
的文档说,声明为u8*
的参数接受字节向量,并将其内容的地址传递给外部函数。这是安全的,因为FFI和GC合作确保对象不会在获取地址和调用外部函数之间移动——但请参阅有关在外部数据结构中保留指针的警告。另请参阅lock-object
,它暂时阻止GC移动或回收对象。
在Racket中,_bytes
和_pointer
外来类型的工作方式类似。还有一个ptr-add
操作,它将类似指针的对象与偏移量相结合。例如,如果bs
是字节串,则即使GC移动bs
,(ptr-add bs 1 _byte)
也被可靠地转换为bs
的第二字节的地址。我不知道Chez是否也有类似的功能。