Rust 是否需要将该元件的锈迹标记为“死代码”?
我正在给libsvm写一个FFI包装。它使用的一个结构的成员是**struct{int,double}。这一点的确切说明并不重要,但它基本上只是一个双倍稀疏向量的列表 在我的包装中,显然我允许数据从生锈的一面进入,因此我有:Rust 是否需要将该元件的锈迹标记为“死代码”?,rust,Rust,我正在给libsvm写一个FFI包装。它使用的一个结构的成员是**struct{int,double}。这一点的确切说明并不重要,但它基本上只是一个双倍稀疏向量的列表 在我的包装中,显然我允许数据从生锈的一面进入,因此我有: #[repr(C)] pub struct SvmNode(pub i32, pub f64); #[repr(C)] struct CSvmProb { data: *mut *mut SvmNode // other fields that aren'
#[repr(C)]
pub struct SvmNode(pub i32, pub f64);
#[repr(C)]
struct CSvmProb {
data: *mut *mut SvmNode
// other fields that aren't important
}
pub struct SvmProb {
crep: CSvmProb,
data: Vec<Vec<SvmNode>>,
// other fields that aren't important
raw_data: Vec<*mut SvmNode>
}
extern "C" fn do_something(prob: *mut CSvmProb);
数据成员是只读的,只用于构造问题后查找内容
SvmProb的crep的数据字段实际上只是原始数据。它的构造方式是从每个数据元素获取as_mut_ptr:
问题是,在构造SvmProb之后,从未访问或设置原始_数据,在新函数构造并生成SvmProb之前,原始_数据指针被添加到crep。所以rustc/Cargo抱怨SvmProb的成员原始数据是死代码
我的问题是:这真的是死代码,还是我需要维护原始数据以使内存像我想的那样保持活力?或者,是否有一种方法可以强制Vec生成其原始指针,并告诉它在被丢弃时不再需要管理它?或者,有没有一种方法没有[allowdead_code]来提示生锈,Vec存在的唯一原因是为了内存保持活动
我意识到我可以使用heap::allocate和其他各种不安全的访问器来填充CSvmNode.data,但我觉得使用一个Vec来管理它,然后使用它的指针更安全,更不容易出错
我的问题是:这真的是死代码,还是我需要维护原始数据以使内存像我想的那样保持活力
是的,您需要维护原始数据,否则crep将无效
你真的需要SvmProb的crep字段吗?我建议您添加一个crep方法,如下所示:
impl SvmProb {
#[inline]
fn crep(&mut self) -> CSvmProb {
CSvmProb { data: self.raw_data.as_mut_ptr() }
}
}
如果需要更多数据以这种方式初始化CSvmProb,则需要先将相应字段添加到SvmProb。我不确定是否需要crep字段,但我记得这样做是出于特定原因。比如,我很确定库中有某种东西要求CSvmProb不会死。
impl SvmProb {
pub fn new(mut data: Vec<Vec<SvmNode>>) -> SvmProb {
let raw_data = Vec::with_capacity(data.len());
for v in data.iter_mut() {
raw_data.push(v.as_mut_ptr());
}
// ...
let crep = CSvmProb{ data: raw_data.as_ptr() };
SvmProb { data: data, crep: crep }
}
}
impl SvmProb {
#[inline]
fn crep(&mut self) -> CSvmProb {
CSvmProb { data: self.raw_data.as_mut_ptr() }
}
}