在Rust中设置对象参数的性能[关闭]

问题描述 投票:1回答:1

我一直想知道到目前为止我在Rust中遇到的不同实例化结构的方法。因此,当所有内容都是公共的时,有最基本/最简单的方法来手动设置所有字段:

let a = Structure { arg1: T, arg2: T, ... }

当需要隐私和更好的界面和/或默认值时,通常使用'contructors',例如new new()等:

let a = Structure::new(arg1, arg2, ...)

现在,到目前为止,这对我来说是有道理的。然而,似乎有第三种常见的做法同样让我感到困惑。这是一个具体的例子:

let mut image_file = OpenOptions::new()
                        .write(true)
                        .truncate(true)
                        .create(true)
                        .open(file_path)
                        .unwrap();

所以我的问题是:

  1. 这些不同解决方案(如果有)的性能影响是什么?
  2. 各自的一般利弊是什么?
  3. 还有更多的方法可以做同样的事情吗?
  4. 哪种是最佳做法?
struct constructor rust instantiation
1个回答
3
投票

您已经确定了3种创建struct的方法:

  1. 直接:直接初始化其字段,
  2. 构造函数:调用一个初始化struct的函数,
  3. 建造者:组装struct元素,然后最终初始化struct

还有更多的方法可以做同样的事情吗?

直接初始化有两种变化:要么直接初始化每个字段,要么初始化几个字段,用struct S { f0, .. OTHERS }“默认”其他字段,其中OTHERSS的一个实例。

构造函数和构建器方式具有指数变化,具体取决于您对参数进行分组的方式,在某些情况下,两者之间的线条将模糊。

但是,所有方法都必须在某一点上收敛并使用(1)来创建S的实例。

各自的一般利弊是什么?

这在某种程度上是无关紧要的。

3种替代方案中的每一种都满足不同的需求:

  • 直接初始化需要可访问字段因为pub油田很少见,所以它主要用在箱子里但不能被客户使用。
  • 构造函数和构建器允许建立不变量,因此是主客户端的接口。

构造函数很简单但不灵活:在不破坏向后兼容性的情况下,不能添加新参数(当然,另一个构造函数可以);另一方面,生成器是灵活的,代价是冗长。

这些不同解决方案(如果有)的性能影响是什么?

理想情况下,在优化的二进制文件中,构造函数和构建器应具有相同的成本。如果重要,请说明。

直接初始化将比它们建立不变量时更快,因为它不会。比较非等效功能的性能虽然很重要。

哪种是最佳做法?

避免直接初始化。

直接初始化不会建立不变量,由周围的代码来建立不变量,这意味着任何时候使用直接初始化都会复制不变的检查代码,这违反了DRY原则。

直接初始化也违反封装,防止底层结构的任何进一步更改,直到所用字段的类型。这通常是不合需要的。

像往常一样有例外。最重要的是实现构造函数或构建器需要使用直接初始化。

在Constructor和Builder之间进行选择更为主观。一般来说,我推荐一个Constructor,当参数很少时,即使这意味着写一些它们,例如Vec::{new, with_capacity}。如果需要为每个有意义的参数组合编写一个构造函数,那么当构造函数的数量失控时,请使用Builder。

© www.soinside.com 2019 - 2024. All rights reserved.