求问[T; N] 和 &[T] 的指针大小?

原文约800字,阅读约需2分钟。发表于:

先说下我的理解,如果有误感谢大佬们指出: [T; N]类似于数组的概念,长度在编译期可知,且不会变化,长度N也是类型的一部分。[T; N]满足Sized trait [T]和[T; N]的区别在于[T]的长度在编译期不可知,不满足Sized trait。因此一般都使用&[T]来指向[T],这个指针除了有数据的地址,还保存有[T]的长度信息,因此被称为胖指针fat pointer 现在有这样一段代码 fn main() { let array: [u8; 5] = [1, 2, 3, 4, 5]; let slice: &[u8] = &array[..]; println!("Array pointer size {}", size_of_val(&&array)); // 8 println!("Slice pointer size {}", size_of_val(&slice)); // 16 println!("Array length {}", array.len()); // 5 println!("Slice length {}", slice.len()); // 5 } Array的指针大小是8 bytes,Slice则是16 bytes,似乎正好满足Slice是fat pointer的事实。 接下来问题来了,发现array.len()和slice.len()都调用的是下面的代码 impl<T> [T] { pub const fn len(&self) -> usize { ptr::metadata(self) } } array和slice都是从自己的指针中取metadata,那么两个都是胖指针?那为什么打印Array指针大小为8而不是16呢? 还是说我计算Array指针大小的写法是错误的? 求大佬们解答一下,谢谢~

本文讨论了[T; N]和[T]之间的区别,以及数组指针和切片指针的大小。作者发现数组和切片使用相同的代码获取长度,但数组指针的大小为8而不是16。作者希望得到解答。

相关推荐 去reddit讨论