【问题标题】:How to design a Rust struct with optional features decided at compile time?如何设计一个具有在编译时决定的可选特性的 Rust 结构?
【发布时间】:2019-09-11 03:16:13
【问题描述】:

我有一个结构Game,我希望能够构建一个对象,但可以在编译时删除功能,以优化内存或处理器周期。

struct Game {
    history: Vec<SomeType>,
}

impl Game {
    fn new() {}

    fn new_opti() {}
}

例如,在这种结构中,优化后的版本将没有历史记录。在这里,我用Option&lt;Vec&lt;SomeType&gt;&gt; 替换了history,并在优化版本中放置了None,并更改了依赖于历史记录的方法的行为,并禁用了一些方法。

我认为这是一种 hacky 方式,但有什么更好的方式呢?不需要只保留一个结构。

【问题讨论】:

  • “更好的方法”——在哪方面?你能告诉我们更多关于你的要求吗? IE。结构Game 的大小重要吗?速度是一个问题吗?或者如果每次访问history,我们先检查它是否是None
  • 优化的第一条规则是永远不要猜测要优化什么。 (在大多数情况下,您的猜测将完全错误。)构建您的东西,对其进行分析,然后根据您的测量结果找出 1. 如果您需要优化任何东西, 2. 如果您这样做,您到底有什么优化,3.如果你发现你需要优化什么,用条件编译解决它是否有意义(这是你刚刚描述的行为)。
  • 您是在寻找编译时选项还是运行时选项?
  • Option&lt;Vec&lt;T&gt;&gt; 占用与Vec&lt;T&gt; (What is the overhead of Rust's Option type?) 相同的空间,并且很少看到它,因为通常您不需要区分空的Vec 和@ 987654334@ 不存在。
  • @LukasKalbertodt 一种更好的方法,例如 softwareengineering.stackexchange.com/questions/356262/…,他们提出了策略模式。

标签: rust


【解决方案1】:

由于您在 cmets 中提到您需要编译时答案,因此您可以在选择时简单地编译该字段:

struct Game {    
    #[cfg(foo)]
    history: Vec<SomeType>,

    ...
}

同样,您可以使用字段编译出代码。

【讨论】:

    猜你喜欢
    • 2021-10-24
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 2016-06-18
    • 1970-01-01
    相关资源
    最近更新 更多