slice 是否有额外的动态数据?

wan*_*len 4 rust

有一个问题:切片是否有任何额外的数据,例如字符串末尾的零或字符串开头的字符串大小?

在此代码中:

use std::collections::HashMap;

fn main()
{
  let mut hashmap : HashMap< &'static str, &'static str > = HashMap::new();
  hashmap.insert( "EUR", "Euro" );
  hashmap.insert( "USD", "US Dollar" );
  hashmap.insert( "CHF", "Swiss Francs" );

  let usd = hashmap.get( "EUR" );
  if let Some( usd ) = usd
  {
    println!( "usd : {}", usd );
  }
  // < usd : US Dollar
}
Run Code Online (Sandbox Code Playgroud)

HashMap 的键和值let mut hashmap : HashMap< &'static str, &'static str >可以具有任意长度。正确的?我不明白程序如何知道US Dollar长度/大小为 9?切片是否有任何额外的数据,例如字符串末尾的零或字符串开头的字符串大小?

游乐场就在这里

Lon*_*ami 5

当 Rust 引用指向 DST(动态大小类型)时,该引用包含该数据的长度以及指向数据开头的指针。在这种情况下,像这样的字符串"hello"的类型为&'static str,并且因为str未调整大小:

use std::mem::size_of;
assert_eq!(size_of::<&str>(), 2 * size_of::<usize>());
Run Code Online (Sandbox Code Playgroud)

一个usize用于指针本身,另一个用于长度。文档中的str表示&str解释了 a 如何成为包含有效 UTF-8 的切片(切片也未调整大小,因此引用带有长度)。