是否不允许访问与使用设计选择不同的类型的数组元素?

Dam*_*nka 1 c c++ arrays types rust

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

我在 C 和 C++ 方面的经验很少,我知道在那里是可能的。

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

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

不工作 Rust 代码

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

    println!("{}", some_array[some_index])
}
Run Code Online (Sandbox Code Playgroud)

工作 C 代码

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

    printf("Element: %d", array[index]);
}
Run Code Online (Sandbox Code Playgroud)

tre*_*tcl 5

是设计选择吗?

是的,原因如下所述。

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

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

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

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

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

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

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

也可以看看