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