首页 > 解决方案 > 是否不允许使用与使用不同类型的设计选择访问数组的元素?

问题描述

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

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

我不确定几点并想问:

不工作的锈代码

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]);
}

标签: c++arraysctypesrust

解决方案


是设计选择吗?

是的,原因如下所述。

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

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

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

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

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

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

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

也可以看看


推荐阅读