gpt4 book ai didi

rust - 在 Rust 上接收 C++ uint8_t* 缓冲区的最佳方式

转载 作者:行者123 更新时间:2023-12-03 11:44:26 25 4
gpt4 key购买 nike

假设我有一个 C++ 分配的缓冲区 uint8_t*我想从 Rust 访问它:
一种方法是使用 C++ 函数:

uint8_t receive(uint8_t** data, size_t* size) {
//allocates the data, writes to it and then points *data to it
return 0;//on success
}
然而,这让 Rust 负责释放数据。相同的
uint8_t* receive(size_t* size) {
uit8_t* data = //allocates data
*size = data_size;
return data;
}
我的想法是在 Rust 上分配数据,然后传递一个指针让 C++ 填充:
uint8_t receive(uint8_t* data, size_t size) {
//fills data up to size
return 0;
}
但是,我们不能简单地在 Rust 中分配一个缓冲区并期望它与 C/C++ 兼容。它还具有必须提前知道大小的限制,或者对所有缓冲区使用足够大的大小。
什么是最好的解决方案?

最佳答案

通常,您需要使用相同的语言分配内存和释放内存。不能保证 C 或 C++ 和 Rust 将使用相同的分配器。例如,在 Windows 上,不同的共享库可以使用不同的分配器,因此一个共享库分配的内存不一定会被另一个共享库释放。 Rust 还可以使用不需要匹配系统分配器的自定义分配器。
一种方法是让您的 receive函数调用 extern "C" Rust 函数以合适的大小分配或释放您想要的内存。
如果你确实想在 Rust 中分配它,你可以创建一个 Vec<u8>使用 Vec::with_capacity ,然后使用夜间 API,Vec::into_raw_parts将其转换为指针、大小和容量,然后稍后通过执行 Vec::from_raw_parts 将其销毁并丢弃对象,这将释放它。这确实假设 Rust 中的数据布局与 C++ 相同,但对于具有内置类型的连续内存块,这可能是一个安全的假设,因为 Rust 实际上需要遵循系统 ABI。
当然,由于这一切都使用指针,所以必然是unsafe。 .
您可能还会发现您的 receive函数可以用 Rust 写成 extern "C"功能,可能会更好地满足您的需求。在不了解您的用例的情况下,很难说。

关于rust - 在 Rust 上接收 C++ uint8_t* 缓冲区的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64761841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com