[英]Is this element Rust marks as “dead code” necessary?
我正在将FFI包装器写入libsvm。 它使用的结构之一具有**struct{int, double}
作为成员。 确切的说明并不重要,但基本上只是一个双精度的稀疏向量列表。
在我的包装器中,很明显,我允许数据从Rust端进入,所以我有:
#[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);
作为参考,这些东西的C版本看起来像:
struct svm_node {
int index;
double value;
};
struct svm_prob {
struct svm_node **data;
// other fields that aren't important to the question
};
void do_something(svm_prob *prob);
data
成员在Rust方面是只读的,仅在构造问题后用于查找内容。
SvmProb
的crep
的data
字段实际上只是raw_data.as_ptr()
。 它的构造方法是从每个data
元素中获取as_mut_ptr
:
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 }
}
}
问题是, raw_data
从未访问或之后设置SvmProb
构造,所述raw_data
指针被添加到crep
被构造和由新的功能,得到前SvmProb。 因此,rustc / Cargo抱怨SvmProb
的成员raw_data
是“ SvmProb
代码”。
我的问题是:这真的是死代码吗,还是我需要维护raw_data
才能使内存像我想的那样存活? 或者,是否有一种方法可以强制Vec
产生其原始指针,并告诉它在drop
时不再需要管理它呢? 或者,是否有一种没有#[allow(dead_code)]
方式向Rust暗示Vec存在的唯一原因是出于内存保持活动的目的?
我意识到我可以通过使用heap::allocate
和其他各种不安全的访问器来填充CSvmNode.data
,但是我感觉要使用Vec来管理它,然后使用其指针更安全,并且更不易出错。
我的问题是:这真的是死代码吗,还是我需要维护raw_data才能使内存像我想的那样存活?
是的,您需要维护raw_data
,否则crep
将失效。
你绝对需要一个crep
现场SvmProb
? 相反,我建议您添加一个看起来像这样的crep()
方法:
impl SvmProb {
#[inline]
fn crep(&mut self) -> CSvmProb {
CSvmProb { data: self.raw_data.as_mut_ptr() }
}
}
如果需要更多数据以这种方式初始化CSvmProb
,则需要首先将相应的字段添加到SvmProb
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.