簡體   English   中英

為什么Nil增加一個枚舉大小而不是另一個?如何為Rust枚舉分配內存?

[英]Why does Nil increase one enum size but not another? How is memory allocated for Rust enums?

如果我定義以下枚舉,Nil不會增加枚舉的大小:

  use std::mem::size_of;

  enum Foo {
    Cons(~char)
  }

  enum Bar {
    Cons(~char),
    Nil
  }

  println!("{}", size_of::<Foo>());
  println!("{}", size_of::<Bar>());

  // -> 4
  // -> 4

另一方面:

  enum Foo {
    Cons(char)
  }

  enum Foo {
    Cons(char),
    Nil
  }

產量:

  // -> 4
  // -> 8

定義枚舉時發生了什么? 如何為這些結構分配內存?

對枚舉的一種天真的方法是為其最大變體的內容分配足夠的空間,以及判別。 這是標准的標記聯合

Rust比這更聰明一點。 (它可能更加聰明,但目前還不是。)它知道給定一個~T ,至少有一個值,該內存位置不能為:零。 因此,在你的enum { Cons(~T), Nil } ,它能夠將其優化為一個單詞,內存中的任何非零值意味着Cons(~T)和內存中的零值意義Nil

處理char ,不能進行優化:零是有效的代碼點。 碰巧的是, char被定義為一個Unicode碼點,因此它實際上是可能的變體優化成空間,有被大量在末端備用比特(Unicode字符只需要21個比特,所以,在32位空間我們有11個備用位)。 這表明Rust的枚舉判別優化目前並不是特別聰明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM