【问题标题】:Is disallowing accessing the elements of an array with a different type than usize a design choice?是否不允许使用与使用不同类型的设计选择访问数组元素?
【发布时间】:2021-02-10 08:24:04
【问题描述】:

我正在尝试访问数组的元素。我确信我尝试使用的类型足以索引整个数组,而 64 位索引是多余的。

我在 C 和 C++ 方面有少量经验,我知道那里有可能。

有几点不确定,想问一下:

  • 这是一种设计选择吗?
  • 在尝试访问数组元素时,C 和 C++ 是否将类型转换为 usize?
  • 我可以说服/强制 Rust 使用另一种类型来访问数组元素吗?
  • 访问较小类型的元素是否更快? (例如,是 速度 usize u8?)

不工作的 Rust 代码

fn main() {
    let some_array = [10; 255];
    let some_index: u8 = 255;

    println!("{}", some_array[some_index])
}

工作 C 代码

int main() {
    char array[255] = {0};
    char index = 12;

    printf("Element: %d", array[index]);
}

【问题讨论】:

  • 使用u8 访问通常会更慢,因为您经常需要添加从u8 到32 位或64 位的转换步骤。这就是为什么 C++ 有 uint_fast8_t 类型,通常是 32 位类型。

标签: c++ arrays c types rust


【解决方案1】:

在 Rust 中始终使用 usize 对数组或向量进行索引。这是表示长度或大小的任何值的常规类型。如果你有其他类型的索引,你可以强制转换它:

fn main() {
    let some_array = [10; 255];
    let some_index: u8 = 255;

    println!("{}", some_array[some_index as usize])
}

usize 与 32 位系统上的 u32 和 64 位系统上的 u64 相同。在较小的类型上使用这些几乎不会有性能差异。演员阵容实际上是零开销;它只是将相同的原始二进制数据视为不同的类型。

可以通过为它们实现Index trait 来为具有其他类型的自定义数据结构建立索引。

【讨论】:

  • 当我在 rust 中进行类型转换时,我是在物理上更改类型还是只是在欺骗类型系统?
  • @DamianGrzanka 这更像是在欺骗类型系统——没有开销。
  • 好的,但是您应该记住,您可以在 uszie(64 位时)中安装 58 u8,也许在主内存中不是一个交易,但在缓存中是它(根据我的数学)。 t
  • @DamianGrzanka 58 * 8 位 = 464 位。 64 位数字小于 464 位数字。
  • @Shepmaster 我认为很明显这是一个错字 - 它应该是 8 而不是 58。
【解决方案2】:

这是一种设计选择吗?

是的,原因如下所述。

在尝试访问数组元素时,C 和 C++ 是否将类型转换为 usize?

是的。对数组的索引被定义为对指针的算术运算,并且根据定义,指针的大小为usize(32 位系统上的 32 位等)

我可以说服/强制 Rust 使用另一种类型来访问数组元素吗?

没有。好吧,有点,但不适用于任意类型。您可以为您控制的类型实现SliceIndex<[T]>,以便能够使用它来索引切片。但这仍将通过在内部转换为usize 来实现。

访问较小类型的元素是否更快? (例如,是 速度 usize u8?)

不,由于指针的大小始终相同,使用较小的类型进行索引没有速度优势。事实上,如果对值进行零扩展会强制编译器使用更慢的指令,那么使用更小的类型可能会更慢。但这并不是为您的程序选择类型时要考虑的最重要的事情。

如果您将索引存储在长期存在的数据结构中,它可以节省内存以使用较小的类型,而不是仅将它们用于索引。在这种情况下,在从数据结构存储/检索时实现从/到usize 的转换可能是个好主意。

另见

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 2018-10-18
    • 2017-10-22
    • 2016-07-03
    • 2016-02-27
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 2021-01-16
    相关资源
    最近更新 更多