【问题标题】:Is this element Rust marks as "dead code" necessary?这个元素 Rust 是否需要标记为“死代码”?
【发布时间】:2015-08-29 05:26:34
【问题描述】:

我正在为 libsvm 编写 FFI 包装器。它使用的结构之一有一个**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 是“死代码”。

我的问题是:这真的是死代码,还是我需要维护raw_data 以使内存像我想的那样保持活力?或者,有没有办法强制Vec 产生其原始指针并告诉它在dropped 时不再需要管理它?或者,是否有没有#[allow(dead_code)] 的方式向 Rust 提示 Vec 存在的唯一原因是为了内存保持活动的目的?

我意识到我可以通过使用heap::allocate 和各种其他不安全的访问器来填充CSvmNode.data,但我觉得使用 Vec 来管理它然后获取它的指针更安全且更少容易出错。

【问题讨论】:

    标签: rust


    【解决方案1】:

    我的问题是:这真的是死代码,还是我需要像我想的那样维护 raw_data 以使内存保持活跃?

    是的,您需要维护raw_data,否则crep将失效。

    您绝对需要SvmProb 中的crep 字段吗?我建议您添加一个如下所示的 crep() 方法:

    impl SvmProb {
        #[inline]
        fn crep(&mut self) -> CSvmProb {
            CSvmProb { data: self.raw_data.as_mut_ptr() }
        }
    }
    

    如果您需要更多数据以这种方式初始化CSvmProb,则需要先将相应字段添加到SvmProb

    【讨论】:

    • 我不是 100% 确定我需要 crep 字段,但我记得出于特定原因这样做。就像,我很确定库中有 something 要求 CSvmProb 不会死。
    猜你喜欢
    • 1970-01-01
    • 2015-10-29
    • 2021-03-21
    • 2011-06-11
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    相关资源
    最近更新 更多