c++ - 是否不允许使用与使用不同类型的设计选择访问数组的元素?
问题描述
我正在尝试访问数组的元素。我确信我尝试使用的类型足以索引整个数组,而 64 位索引是多余的。
我在 C 和 C++ 方面有少量经验,我知道那里是可能的。
我不确定几点并想问:
- 是设计选择吗?
usize
尝试访问数组元素时,C 和 C++ 是否将类型转换为?- 我可以说服/强制 Rust 使用另一种类型来访问数组元素吗?
- 访问较小类型的元素是否更快?(例如<的速度是 ?)
usize
u8
不工作的锈代码
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]);
}
解决方案
是设计选择吗?
是的,原因如下所述。
usize
尝试访问数组元素时,C 和 C++ 是否将类型转换为?
是的。对数组的索引定义为指针上的算术运算,并且指针的usize
大小由定义决定(32 位系统上的 32 位等)
我可以说服/强制 Rust 使用另一种类型来访问数组元素吗?
不。好吧,有点,但不适用于任意类型。您可以SliceIndex<[T]>
为您控制的类型实现,以便能够使用它来索引切片。但这仍将通过转换为usize
内部来实现。
访问较小类型的元素是否更快?(例如<的速度是 ?)
usize
u8
不,由于指针的大小始终相同,因此使用较小的类型进行索引没有速度优势。事实上,如果对值进行零扩展会强制编译器使用更慢的指令,那么使用更小的类型可能会更慢。但这不是为程序选择类型时要考虑的最重要的事情。
如果您将索引存储在长期存在的数据结构中,它可以节省内存以使用较小的类型,而不是仅将它们用于索引。usize
在这种情况下,在从数据结构存储/检索时实现从/到的转换可能是一个好主意。
也可以看看
推荐阅读
- javascript - 我怎样才能让这个 javascript 工作不止一次?
- python - 如何为每个交叉验证折叠显示混淆矩阵和报告(召回、精度、fmeasure)
- testing - 在 Flutter 测试中获取小部件的位置?
- reactjs - undefined is not a function '(0, _reactNavigation.StackNavigator)' 未定义)
- amazon-web-services - aws ebs 快照与 sc1“冷”hhd 的优势
- clojurescript - 使用 js->clj 转换为 json 时如何将关键字保留在数组中?
- java - 将 SQL 连接到 php 或 java
- java - Oracle JDBC 从过程中获取 SYS_REFCURSOR
- python - 我的 python 代码中不断出现“invalid \x escape”错误。我究竟做错了什么?
- python - Peewee ORM:根据外键字段(backrefs)上的属性进行选择