rust-lang / rust

Empowering everyone to build reliable and efficient software.
https://www.rust-lang.org
Other
96.55k stars 12.47k forks source link

Niche optimisation with disjoint tags #102997

Open robertbastian opened 1 year ago

robertbastian commented 1 year ago

These two types could be laid out the same. However, the second type makes it explicit that the tag is logically split across different bytes. Is this something we'd be okay with the compiler doing on its own? Inspecting the next part of the tag might require an extra load.

enum ShortSlice<T> {
    Empty,
    Single(T),
    Multi(Box<[T]>),
}
dbg!(size_of::<ShortSlice<NonZeroUsize>>()); // 24

enum ShortSlice2<T> {
    ZeroOne(Option<T>),
    Multi(Box<[T]>),
}

dbg!(size_of::<ShortSlice2<NonZeroUsize>>()); // 16

https://play.rust-lang.org/?version=nightly&mode=release&edition=2021&gist=a15d6b9d5389d781c5d778b250a02627

robertbastian commented 1 year ago

@mikebenfield

jruderman commented 1 year ago

How does the compiler determine that this sort of optimization should be done for Option?