繁体   English   中英

Rust将此元素标记为“死代码”是否必要?

[英]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方面是只读的,仅在构造问题后用于查找内容。

SvmProbcrepdata字段实际上只是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM