Skip to content

Niche optimisation with disjoint tags #102997

Open
@robertbastian

Description

@robertbastian

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-layoutArea: Memory layout of typesC-discussionCategory: Discussion or questions that doesn't represent real issues.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions