Rust: рдПрд▓рд╛рдЯреЗрдЯрд░ рд▓рдХреНрд╖рдг рдФрд░ рдПрд╕рдЯреА :: рдвреЗрд░

рдХреЛ рдирд┐рд░реНрдорд┐рдд 8 рдЕрдкреНрд░реИрд▓ 2016  ┬╖  412рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rust-lang/rust

Comments рдЗрд╕ рдлреАрдЪрд░ рдореЗрдВ рдПрдХ рд╕рдорд░реНрдкрд┐рдд рд╡рд░реНрдХрд┐рдВрдЧ рдЧреНрд░реБрдк рд╣реИ , рдХреГрдкрдпрд╛ рд╡рд░реНрдХрд┐рдВрдЧ рдЧреНрд░реБрдк рдХреЗ рд░реЗрдкреЛ рдХреЛ рдХрдореЗрдВрдЯ рдФрд░ рдЪрд┐рдВрддрд╛рдПрдВ рдмрддрд╛рдПрдВред

рдореВрд▓ рдкреЛрд╕реНрдЯ:


FCP рдкреНрд░рд╕реНрддрд╛рд╡: https://github.com/rust-lang/rust/issues/32838#issuecomment -3333959515
FCP рдЪреЗрдХрдмреЙрдХреНрд╕: https://github.com/rust-lang/rust/issues/32838#issuecomment -336980230


рдЬрдВрдЧ-рд▓рдВрдЧ / rfcs # 1398 рдФрд░ std::heap рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджрд╛ред

  • [x] рднреВрдорд┐ struct Layout , trait Allocator , рдФрд░ alloc рдХреНрд░реЗрдЯ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (https://github.com/rust-lang/rust/pull/42313)
  • [x] рдпрд╣ рддрдп рдХрд░реЗрдВ рдХрд┐ рднрд╛рдЧреЛрдВ рдХреЛ рдХрд╣рд╛рдВ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЬреИрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЗрдВрдкреНрд▓рд╛рдВрдЯ рдореЗрдВ alloc рдЯреЛрдХрд░рд╛ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди Layout / Allocator _could_ libcore ... (https://github.com/rust-lang/rust/pull/42313)
  • [] рд╕реНрд░реЛрдд рдХреЛрдб рд╕реЗ Fixme: рдУрд╡рд░рдлрд╝реНрд▓реЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдСрдбрд┐рдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди ( Layout , (рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ overflowing_add рдФрд░ overflowing_mul рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ)ред
  • [x] рддрдп рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ realloc_in_place рдХреЛ grow_in_place рдФрд░ shrink_in_place ( рдЯрд┐рдкреНрдкрдгреА ) (https://github.com/rust-lang/rust/pull/42313) рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
  • [] рд╕рдВрдмрджреНрдз рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЦрд┐рд▓рд╛рдл / рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ ( рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ)
  • [] рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдХрд┐ fn dealloc рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╕рдВрд░реЗрдЦрдг рдкрд░ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВред ( рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ rfc рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрди rfc рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ Alloc PR рдкрд░ рдЪрд░реНрдЪрд╛ рджреЗрдЦреЗрдВ)ред

    • рдХреНрдпрд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЧрдП рд╕рдЯреАрдХ align рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ? рдЗрд╕ рдмрд╛рдд рдХреЛ рд▓реЗрдХрд░ рдЪрд┐рдВрддрд╛ рдЬрддрд╛рдИ рдЧрдИ рд╣реИ рдХрд┐ рдЬреЗрдорд▓реЙрдХ рдХреА рддрд░рд╣ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред ( more рдЪрд░реНрдЪрд╛ )ред @ruuda рдФрд░ @rkruppe рдРрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рдкрд░ рдЕрдм рддрдХ рдХреЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рдЪрд╛рд░ рдорд┐рд▓реЗ рд╣реИрдВред

  • [] AllocErr Error рдмрдЬрд╛рдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? ( рдЯрд┐рдкреНрдкрдгреА )
  • [x] рдХреНрдпрд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЧрдП рд╕рдЯреАрдХ рдЖрдХрд╛рд░ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ? usable_size рд╡реНрдпрд╛рдкрд╛рд░ рдХреЗ рд╕рд╛рде, рд╣рдо рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐ рдпрджрд┐ рдЖрдк (size, align) рд╕рд╛рде рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ size...usable_size(size, align) рдХреА рд╕реАрдорд╛ рдореЗрдВ рдХрд╣реАрдВ рдПрдХ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдорд▓реЙрдХ рдЗрд╕рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реИ (рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рд╕рдЯреАрдХ size рд╕рд╛рде рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ) рдФрд░ рдЗрд╕рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд╖рдорддрд╛ рдкреЗрдорд╛рд▓реЛрдХ рдХрд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП Vec рдЕрдиреБрдорддрд┐ рд╣реЛрдЧреАред рдЬрдм рдпрд╣ рдЖрд╡рдВрдЯрди рдХрд░рддрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ рджреЗрддрд╛ рд╣реИред (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдХрд░рдирд╛ рднреА рдЗрд╕ рдирд┐рд░реНрдгрдп рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣рдж рддрдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╣реИ, рд╣рдо рд╕рд┐рд░реНрдл Vec рд╕рд╢рдХреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ)ред рдЕрдм рддрдХ @Gankro рдиреЗ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд┐рдЪрд╛рд░ @alexcrichton рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ "рдлрд┐рдЯ" рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдХрд╛рд░рдг https://github.com/rust-lang/rust/pull/42313 рдореЗрдВ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)
  • [] рдкрд┐рдЫрд▓реЗ рдкреНрд░рд╢реНрди рдХреЗ рд╕рдорд╛рди: рдХреНрдпрд╛ рдЖрдкрдХреЗ рд╕рд╛рде рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЧрдП рд╕рдЯреАрдХ рд╕рдВрд░реЗрдЦрдг рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ? ( 5 рдЬреВрди 2017 рд╕реЗ рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ)
  • [x] OSX / alloc_system рднрд╛рд░реА рд╕рдВрд░реЗрдЦрдг рдкрд░ рдЫреЛрдЯреА рдЧрд╛рдбрд╝реА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 1 << 32 рдХрд╛ рдПрдХ рд╕рдВрд░реЗрдЦрдг) https://github.com/rust-lang/rust/issues/30170 # 43217
  • [] Layout fn stride(&self) рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП? (рдпрд╣ рднреА рджреЗрдЦреЗрдВ https://github.com/rust-lang/rfcs/issues/1397, https://github.com/rust-lang/rust/issues/17027)
  • [x] Allocator::owns рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ? https://github.com/rust-lang/rust/issues/44302

Https://github.com/rust-lang/rust/pull/42313 рдХреЗ рдмрд╛рдж std::heap рдХрд╛ рд░рд╛рдЬреНрдп:

pub struct Layout { /* ... */ }

impl Layout {
    pub fn new<T>() -> Self;
    pub fn for_value<T: ?Sized>(t: &T) -> Self;
    pub fn array<T>(n: usize) -> Option<Self>;
    pub fn from_size_align(size: usize, align: usize) -> Option<Layout>;
    pub unsafe fn from_size_align_unchecked(size: usize, align: usize) -> Layout;

    pub fn size(&self) -> usize;
    pub fn align(&self) -> usize;
    pub fn align_to(&self, align: usize) -> Self;
    pub fn padding_needed_for(&self, align: usize) -> usize;
    pub fn repeat(&self, n: usize) -> Option<(Self, usize)>;
    pub fn extend(&self, next: Self) -> Option<(Self, usize)>;
    pub fn repeat_packed(&self, n: usize) -> Option<Self>;
    pub fn extend_packed(&self, next: Self) -> Option<(Self, usize)>;
}

pub enum AllocErr {
    Exhausted { request: Layout },
    Unsupported { details: &'static str },
}

impl AllocErr {
    pub fn invalid_input(details: &'static str) -> Self;
    pub fn is_memory_exhausted(&self) -> bool;
    pub fn is_request_unsupported(&self) -> bool;
    pub fn description(&self) -> &str;
}

pub struct CannotReallocInPlace;

pub struct Excess(pub *mut u8, pub usize);

pub unsafe trait Alloc {
    // required
    unsafe fn alloc(&mut self, layout: Layout) -> Result<*mut u8, AllocErr>;
    unsafe fn dealloc(&mut self, ptr: *mut u8, layout: Layout);

    // provided
    fn oom(&mut self, _: AllocErr) -> !;
    fn usable_size(&self, layout: &Layout) -> (usize, usize);
    unsafe fn realloc(&mut self,
                      ptr: *mut u8,
                      layout: Layout,
                      new_layout: Layout) -> Result<*mut u8, AllocErr>;
    unsafe fn alloc_zeroed(&mut self, layout: Layout) -> Result<*mut u8, AllocErr>;
    unsafe fn alloc_excess(&mut self, layout: Layout) -> Result<Excess, AllocErr>;
    unsafe fn realloc_excess(&mut self,
                             ptr: *mut u8,
                             layout: Layout,
                             new_layout: Layout) -> Result<Excess, AllocErr>;
    unsafe fn grow_in_place(&mut self,
                            ptr: *mut u8,
                            layout: Layout,
                            new_layout: Layout) -> Result<(), CannotReallocInPlace>;
    unsafe fn shrink_in_place(&mut self,
                              ptr: *mut u8,
                              layout: Layout,
                              new_layout: Layout) -> Result<(), CannotReallocInPlace>;

    // convenience
    fn alloc_one<T>(&mut self) -> Result<Unique<T>, AllocErr>
        where Self: Sized;
    unsafe fn dealloc_one<T>(&mut self, ptr: Unique<T>)
        where Self: Sized;
    fn alloc_array<T>(&mut self, n: usize) -> Result<Unique<T>, AllocErr>
        where Self: Sized;
    unsafe fn realloc_array<T>(&mut self,
                               ptr: Unique<T>,
                               n_old: usize,
                               n_new: usize) -> Result<Unique<T>, AllocErr>
        where Self: Sized;
    unsafe fn dealloc_array<T>(&mut self, ptr: Unique<T>, n: usize) -> Result<(), AllocErr>
        where Self: Sized;
}

/// The global default allocator
pub struct Heap;

impl Alloc for Heap {
    // ...
}

impl<'a> Alloc for &'a Heap {
    // ...
}

/// The "system" allocator
pub struct System;

impl Alloc for System {
    // ...
}

impl<'a> Alloc for &'a System {
    // ...
}
B-RFC-approved B-unstable C-tracking-issue Libs-Tracked T-lang T-libs disposition-merge finished-final-comment-period

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@alexcrichton -> Result<*mut u8, AllocErr> рд╕реЗ -> *mut void рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЖрд╢реНрдЪрд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЖ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ RFC рдХреЗ рдореВрд▓ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ред

рдореИрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдмрд┐рдВрджреБрдУрдВ рд╕реЗ рдЕрд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреА рдПрдХ рдЙрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ Result рдХреЗ "рднрд╛рд░реА-рд╡рдЬрди" рдХреЗ рд╕рд╛рде рдЬреАрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рдПрдХ рдЕрд╢рдХреНрдд рд▓рд╛рдкрддрд╛ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрдврд╝ рдЧрдИ рд╣реИред рд▓реМрдЯреЗ рдореВрд▓реНрдп рдкрд░ рдЬрд╛рдБрдЪ рдХрд░реЗрдВред

  • рдореИрдВ рдПрдмреАрдЖрдИ рджреНрд╡рд╛рд░рд╛ рд▓рдЧрд╛рдП рдЧрдП рд░рдирдЯрд╛рдЗрдо рджрдХреНрд╖рддрд╛ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ @alexcrichton рдХреА рддрд░рд╣

рдХреНрдпрд╛ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╣рдо рдЕрдкрдиреЗ рдЖрдк рд╣реА рдЙрд╕ рджреЗрд░ рд╕реЗ рдмрджрд▓рд╛рд╡ рдкрд░ рджреГрд╢реНрдпрддрд╛ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдПрдХ рддрд░рд╣ рд╕реЗ (рдореЗрд░реЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╕реЗ): рдкрд░рд┐рд╡рд░реНрддрди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЕрдм, рдЕрдкрдиреЗ рдЖрдк рд╣реА рдПрдХ рдкреАрдЖрд░, рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдкрд░ рдореЗрдВ рд╣реИ, рдЬрдмрдХрд┐ Allocator рдЕрднреА рднреА рдЕрд╕реНрдерд┐рд░ рд╣реИред рдФрд░ рдлрд┐рд░ рджреЗрдЦреЗрдВ рдХрд┐ рдкреАрдЖрд░ рдкрд░ рд╢рд┐рдХрд╛рдпрдд рдХреМрди рдХрд░рддрд╛ рд╣реИ (рдФрд░ рдХреМрди рдордирд╛рддрд╛ рд╣реИ!)ред

  • рдХреНрдпрд╛ рдпрд╣ рдмрд╣реБрдд рднрд╛рд░реА-рднрд░рдХрдо рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рднрд╛рд░реА рд╣реИ-рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрджрд▓рд╛рд╡ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рднрд╛рд░реА-рднрд░рдХрдо ...

рд╕рднреА 412 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЖрд░рдПрдлрд╕реА рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ realloc_in_place рдХреЛ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, grow_in_place рдФрд░ shrink_in_place , рджреЛ рдХреЗ рд▓рд┐рдП рдХрд╛рд░рдг рд╣реИрдВ:

  • рдореИрдВ рдПрдХ рднреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ (рдЬрд╣рд╛рдВ realloc рдпрд╛ realloc_in_place рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХрдореА рд╣реИ) рдпрд╣ рдЕрдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рдЖрд╡рдВрдЯрди рдХрд╛ рдЖрдХрд╛рд░ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдШрдЯ рд░рд╣рд╛ рд╣реИред рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рдереЛрдбрд╝рд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИред
  • рдмрдврд╝рддреЗ рдФрд░ рд╕рд┐рдХреБрдбрд╝рддреЗ рдЖрд╡рдВрдЯрди рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкрде рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ - рдмрдврд╝рддреЗ рдореЗрдВ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореЗрдореЛрд░реА рдХреЗ рдЖрд╕-рдкрд╛рд╕ рдХреЗ рдмреНрд▓реЙрдХ рдореБрдХреНрдд рд╣реИрдВ рдФрд░ рдЙрди рдкрд░ рджрд╛рд╡рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рд╕рд┐рдХреБрдбрд╝рдиреЗ рдореЗрдВ рдареАрдХ рд╕реЗ рд╕рдмрдмреНрд▓реЙрдХ рдХреЛ рдЖрдХрд╛рд░ рджреЗрдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдореБрдХреНрдд рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЬрдмрдХрд┐ realloc_in_place рдЕрдВрджрд░ рдПрдХ рд╢рд╛рдЦрд╛ рдХреА рд▓рд╛рдЧрдд grow рдФрд░ shrink рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХрд╛рдлреА рдмреЗрд╣рддрд░ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдПрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рддреА рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпреЗ realloc_in_place рдХреЗ рдЖрдЧреЗ рдкреАрдЫреЗ рдХреА рдУрд░-рдЕрдиреБрдХреВрд▓ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рдмрд╛рдд рдХреЛ рд╡рд┐рд╡рд╢ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреМрди рд╕реЗ рдХрд╛рд░реНрдп рдЕрдиреНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╣реЛрдВрдЧреЗред

рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП, realloc рд╢рд╛рдпрдж grow рдФрд░ split рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрдзрд┐рднрд╛рд░ realloc рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд▓рд╛рдн рдЬреЛ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ mmap рдХреЗ рд░реАрдореИрдк рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ realloc рдФрд░ realloc_in_place рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдереЛрдбрд╝рд╛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - usable_size , realloc рд╡рд┐рд░реБрджреНрдз рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдмрд╕ рдкрд╣рд▓реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП realloc_in_place ред рдмрджрд▓реЗ рдореЗрдВ, realloc_in_place рдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЖрдХрд╛рд░ рдХреЗ рдЦрд┐рд▓рд╛рдл рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕реА рдХреА рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдлрд▓рддрд╛ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рд╕реЗ realloc рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ: рдЬреЛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ рд╡рд╣ realloc_in_place рд╕реБрдзрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, realloc рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рднреБрдЧрддрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ usable_size рдЦрд┐рд▓рд╛рдл рдЪреЗрдХ рдЕрднреА рднреА рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ рдФрд░ рдореБрджреНрджрд╛: fn realloc_in_place рд▓рд┐рдП рдбреЙрдХреНрдЯрд░ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдареАрдХ рд╣реИ, рддреЛ рдХрд┐рд╕реА рдХреЛ рдЖрд╢реНрд╡рд╛рд╕рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ ptr рдЕрдм " new_layout рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рдБрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рджрд┐рдП рдЧрдП рдкрддреЗ рдХреЗ рд╕рдВрд░реЗрдЦрдг рдореЗрдВ new_layout рджреНрд╡рд╛рд░рд╛ рдирд┐рд╣рд┐рдд рдХрд┐рд╕реА рднреА рдмрд╛рдзрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд fn reallocate_inplace рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХрд▓реНрдкрдирд╛ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ _it_ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд┐рд╕реА рднреА рдЪреЗрдХ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдЧрд╛ред

  • рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЙрдЪрд┐рдд рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ fn realloc_in_place рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рдВрд░реЗрдЦрдг рдХрд╛рд░реНрдп (рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рджрд┐рдП рдЧрдП рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рд╕рдорд╛рди рд╕рдВрд░реЗрдЦрдг рдЖрд╡рд╢реНрдпрдХ рд╣реИ ...)

рддреЛ, рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЪрд╛рд╣рд┐рдП fn realloc_in_place рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рджрд┐рдпрд╛ рдХреЗ рд╕рдВрд░реЗрдЦрдг рд╕рд╛рде рдмреЛрдЭ рд╕реЗ рджрдмрд╛ ptr рдХреЗ рдЙрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИ new_layout ? рдпрд╣ рд╢рд╛рдпрдж рдмреЗрд╣рддрд░ рд╣реИ _ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ (рдЗрд╕ рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛) рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдЙрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╡рд╛рдкрд╕ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП ...

@gereeter рдЖрдк рдЕрдЪреНрдЫреЗ рдЕрдВрдХ рдмрдирд╛рддреЗ рд╣реИрдВ; рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝ рджреВрдВрдЧрд╛ рдЬреЛ рдореИрдВ рдореБрджреНрджреЗ рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЬрдорд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

(рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдореИрдВ #[may_dangle] рд╕рдорд░реНрдерди рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддрд╛рдХрд┐ beta рдЪреИрдирд▓ рдореЗрдВ рдЯреНрд░реЗрди рдХреА рд╕рд╡рд╛рд░реА рдХрд░ рд╕рдХреВрдВ рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрд╡рдВрдЯрди рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХреВрдВ)

рдореИрдВ рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реВрдБ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдорд╛рдл рдХрд░ рджреЛ рдЕрдЧрд░ рдпрд╣ рдХрд╣реАрдВ рдФрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИред

рдХреНрдпрд╛ рд╡рд╕реНрддреБ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ? рдХреБрдЫ рдЖрдмрдВрдЯрдХ рдЬреИрд╕реЗ рдХрд┐ рд╕реНрд▓реИрдм рдПрд▓рд╛рдЯреЗрдЯрд░ рдФрд░ рдореИрдЧрдЬрд╝реАрди рдПрд▓реЛрдХреЗрдЯрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдмрдВрдзреЗ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ, рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХреИрд╢рд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ "рдореБрдХреНрдд" (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп) рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдХреИрд╢реНрдб рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрдм рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореЗрдореЛрд░реА рдХреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЖрд╡рдВрдЯрди рд╕реЗ рдореБрдХреНрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЫреЛрдбрд╝рдирд╛ред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ ObjectAllocator<T> рдХреА рддрд░реНрдЬ рдкрд░ рдХреБрдЫ рднреА рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореИрдВ рдПрдХ рдкрддреНрд░рд┐рдХрд╛ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ-рдХреИрд╢рд┐рдВрдЧ рдкрд░рдд (рдКрдкрд░ рд▓рд┐рдВрдХ) рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдЬрдм рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ Allocator рдФрд░ рдХреИрд╢рд┐рдВрдЧ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдкрд░рдд рд╣реА, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдореИрдВ рднреА рдЗрд╕ рд▓рдкреЗрдЯ рдХреЛ рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдПрд▓реЛрдХреЗрдЯрд░ (рдПрдХ рд╕реНрд▓реИрдм рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреА рддрд░рд╣) рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХреИрд╢рд┐рдВрдЧ рдкрд░рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рдЖрдмрдВрдЯрдХ рдкреНрд░рдХрд╛рд░ рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╣рд╛рдБ рдлрд┐рдЯ рд╣реЛрдЧреА? рдХреНрдпрд╛ рдЗрд╕реЗ рднрд╡рд┐рд╖реНрдп рдХреЗ RFC рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛? рдХреБрдЫ рдФрд░?

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕ рдкрд░ рдЕрднреА рдЪрд░реНрдЪрд╛ рд╣реБрдИ рд╣реИред

рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ ObjectAllocator<T> рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ impl<T: Allocator, U> ObjectAllocator<U> for T { .. } рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рд╣рд░ рдирд┐рдпрдорд┐рдд рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╕реНрддреБ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрд╡рд╛ рдХрд░ рд╕рдХреЗред

рднрд╡рд┐рд╖реНрдп рдХреЗ рдХрд╛рдо рд╕реАрдзреЗ рд╕рд╛рджреЗ рдУрд▓реЗ '(рдЬреЗрдиреЗрд░рд┐рдХ) рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдиреЗ рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

@pnkfelix

(рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдореИрдВ рдмреАрдЯрд╛ рдЪреИрдирд▓ рдореЗрдВ рдЯреНрд░реЗрди рдХреА рд╕рд╡рд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП # [may_dangle] рд╕рдорд░реНрдерди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рддрд╛рдХрд┐ рдореИрдВ рдлрд┐рд░ рд╕реЗ рдЖрд╡рдВрдЯрди рдПрдХреАрдХрд░рдг рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ std рд╕рдВрдЧреНрд░рд╣реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреВрдВ)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣реБрдЖ рд╣реИ?

@Emon2314 рд╣рд╛рдБ, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓реЗрдЦрди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдСрдкрд░реЗрдмрд┐рд▓рд┐рдЯреА рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрд╕реЗ рдорд╛рдирдХреАрдХреГрдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓рд╛рдн рд╣реЛрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рд╕реНрд▓реИрдм рдЖрд╡рдВрдЯрди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рднреА рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореЗрд░реЗ рдХреЛрдб рдХрд╛ рдХреЛрдИ рддреГрддреАрдп-рдкрдХреНрд╖ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рдФрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдореЗрд░реА рдкрддреНрд░рд┐рдХрд╛ рдХреИрд╢рд┐рдВрдЧ рдкрд░рдд рдХреЗ рд╕рд╛рде _else's_ slab рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛)ред рдореЗрд░рд╛ рд╕рд╡рд╛рд▓ рдмрд╕ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдПрдХ ObjectAllocator<T> рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рдЬреЛ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрд▓рдЧ RFC рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдореИрдВ рдПрдХ RFC рдореЗрдВ рдХрд┐рддрдирд╛ рд╣реИ рдФрд░ рдХрдм рдЕрд▓рдЧ RFC рдореЗрдВ рдЪреАрдЬреЗрдВ рд╣реИрдВ, рдЗрд╕рдХреЗ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢реЛрдВ рд╕реЗ рдореИрдВ рдмрд╣реБрдд рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ ...

@joshlf

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рдЖрдмрдВрдЯрдХ рдкреНрд░рдХрд╛рд░ рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╣рд╛рдБ рдлрд┐рдЯ рд╣реЛрдЧреА? рдХреНрдпрд╛ рдЗрд╕реЗ рднрд╡рд┐рд╖реНрдп рдХреЗ RFC рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛? рдХреБрдЫ рдФрд░?

рд╣рд╛рдВ, рдпрд╣ рдПрдХ рдФрд░ RFC рд╣реЛрдЧрд╛ред

рдореИрдВ рдПрдХ RFC рдореЗрдВ рдХрд┐рддрдирд╛ рд╣реИ рдФрд░ рдХрдм рдЕрд▓рдЧ RFC рдореЗрдВ рдЪреАрдЬреЗрдВ рд╣реИрдВ, рдЗрд╕рдХреЗ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢реЛрдВ рд╕реЗ рдореИрдВ рдмрд╣реБрдд рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ ...

рд╡рд╣ рд╕реНрд╡рдпрдВ RFC рдХреЗ рджрд╛рдпрд░реЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЙрд╕ рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕рднреА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреА рдЬрд╛рддреА рд╣реИред

рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╕реНрд╡реАрдХреГрдд рдЖрд░рдПрдлрд╕реА рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджрд╛ рд╣реИ, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдФрд░ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ; рдЖрдкрдХреЛ RFCs рд░реЗрдкреЛ рдкрд░ рдПрдХ рдирдпрд╛ рдУрд╡рд░ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

@ рдЬреЛрд╢рдлреЗрд▓ рдЖрд╣, рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ ObjectAllocator<T> рдХрд╛ рдЧреБрдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдореИрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рди рдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрднрд╛рдЬрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рдорддрд▓рдм рд╣реИред рд╣рд╛рдВ, рдпрд╣ рдЧреБрдг рдЕрдкрдиреЗ RFC рдХреЛ рдореЗрд░рд┐рдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрд░рд┐рдЯреЗрдХрд▓реНрдмрдирд┐рдХ рдХрд╣рддреЗ рд╣реИрдВред


@steveklabnik рд╣рд╛рдБ рдЕрдм рдЪрд░реНрдЪрд╛ рдХрд╣реАрдВ рдФрд░ рдмреЗрд╣рддрд░ рд╣реЛрдЧреАред рд▓реЗрдХрд┐рди @ рдЬреЛрд╢рдлреЗрд▓ рднреА рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЙрдард╛ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдПрдкреАрдЖрдИ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдпрд╣ рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдкрд╣рд▓реЗ рдХреЗ рдкрджреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

@Emon2314 рд╣рд╛рдБ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рдерд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рд╣реИрдВ :)

@steveklabnik рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ; рдореИрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЪрд╛рд░реЛрдВ рдУрд░ рдкреНрд░рд╣рд╛рд░ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЕрдЧрд░ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдХреА рддрд░рд╣ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЖрд░рдПрдлрд╕реА рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдЧрд╛ред

@joshlf рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд╕реНрдЯрдо

@alexreg рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╕реНрдЯрдо Allocator ) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рднреА рдирд┐рдореНрди-рд╕реНрддрд░ рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдореИрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ ( ObjectAllocator<T> ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рднреА рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ T рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд / рдШрдЯрд╛рдПрдБ рдФрд░ рдирд┐рд░реНрдорд╛рдг / рдЧрд┐рд░рд╛ рд╕рдХрддреЗ рд╣реИрдВред

@alexreg рдХрд╕реНрдЯрдо рдСрдмреНрдЬреЗрдХреНрдЯ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрд▓реЛрдХреЗрдЯрд░ рдХреЗ рд╕рд╛рде рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░рд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рджреЗрдЦреЗрдВред

рдЬрд╝рд░реВрд░, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╣реЛрдЧрд╛ред рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдпрд╛ рдкреНрд░рдпреЛрдЬреНрдп рдХреЗ рдХреЛрдИ рдиреБрдХрд╕рд╛рди рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рджреВрд╕рд░реЗ рдЯреЛрдХрд░реЗ рдореЗрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

4 рдЬрдирд╡рд░реА 2017 рдХреЛ, 21:59 рдкрд░, рдпрд╣реЛрд╢реВ рд▓реЗрдмреЛ-рдлрд╝реЗрд╕рд░ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

@alexreg https://github.com/alexreg рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╕реНрдЯрдо рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреЛ рд╕рднреА рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдкрд░ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рд╣реИрдВред рддреЛ рдЬреИрд╕реЗ RFC 1398 рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ (рдПрд▓реЛрдХреЗрдЯрд░) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рднреА рдирд┐рдореНрди рд╕реНрддрд░ рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдореИрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ (ObjectAllocator) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдБ) рдХрд┐ рдХрд┐рд╕реА рднреА рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ / рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЯрд╛рдЗрдк / рдЯреА рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЧрд┐рд░рд╛ рд╕рдХрддрд╛ рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub https://github.com/rust-lang/rust/issues/32838#issuecomment-270499064 рдкрд░ https://github.com/notifications/unsubscribe-auth/ рдкрд░ рджреЗрдЦреЗрдВред AAEF3IhyyhhFgu1EGHr_GM_Evsr0SRzIks5rPBZGgaJpZM4IDYUN

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдордирдорд╛рдирд╛ рдХрд╕реНрдЯрдо рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдорд╛рдирдХ-рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдВрдЧреНрд░рд╣ (рдХреЛрдИ рдвреЗрд░-рдЖрд╡рдВрдЯрд┐рдд рдореВрд▓реНрдп) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ; рдЕрд░реНрдерд╛рдд рд╡рд╕реНрддреБ-рд╡рд┐рд╢реЗрд╖ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВред

4 рдЬрдирд╡рд░реА 2017 рдХреЛ, 22:01 рдкрд░, рдЬреЙрдиреАрди рд╕реВрдЪрдирд╛рдПрдБ @ithub.com рдиреЗ рд▓рд┐рдЦрд╛:

@alexreg https://github.com/alexreg рдХрд╕реНрдЯрдо рдСрдмреНрдЬреЗрдХреНрдЯ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░рд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рджреЗрдЦреЗрдВред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub https://github.com/rust-lang/rust/issues/32838#issuecomment-270499628 рдкрд░ https://github.com/notifications-unsubscribe-auth/ рдкрд░ рдореНрдпреВрдЯ

рдЬрд╝рд░реВрд░, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╣реЛрдЧрд╛ред рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдпрд╛ рдкреНрд░рдпреЛрдЬреНрдп рдХреЗ рдХреЛрдИ рдиреБрдХрд╕рд╛рди рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рджреВрд╕рд░реЗ рдЯреЛрдХрд░реЗ рдореЗрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╣рд╛рдВ, рд▓реЗрдХрд┐рди рдЖрдк рд╢рд╛рдпрдж рдЗрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ @SON2314 рдиреЗ рдХреНрдпрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ)ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдордирдорд╛рдирд╛ рдХрд╕реНрдЯрдо рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдорд╛рдирдХ-рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдВрдЧреНрд░рд╣ (рдХреЛрдИ рдвреЗрд░-рдЖрд╡рдВрдЯрд┐рдд рдореВрд▓реНрдп) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ; рдЕрд░реНрдерд╛рдд рд╡рд╕реНрддреБ-рд╡рд┐рд╢реЗрд╖ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВред

рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рджреЛрдиреЛрдВ - рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВред рдСрдмреНрдЬреЗрдХреНрдЯ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреИрд╢рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рд╣реИрдВ; рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрд▓реИрдм рдЖрд╡рдВрдЯрди рдФрд░ рдкрддреНрд░рд┐рдХрд╛ рдХреИрд╢рд┐рдВрдЧ рджреЛрдиреЛрдВ рд╣реА рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рджреЗрддреЗ рд╣реИрдВ - рдпрджрд┐ рдЖрдк рдЙрддреНрд╕реБрдХ рд╣реИрдВ рддреЛ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХрд╛рдЧрдЬрд╛рдд рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред

рд▓реЗрдХрд┐рди рд╡рд╕реНрддреБ рдЖрдмрдВрдЯрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рдЖрдмрдВрдЯрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдПрдХ рдЙрдк-рд╕рдореВрд╣ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╣ рдЙрддрдирд╛ рд╣реА рд╕рд░рд▓ рд╣реИ, рдЬрд┐рддрдирд╛ рдХрд┐ рдореИрдВ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рди рддреЛ рд╕рдВрдХрд▓рдХ рдХреЛ рдФрд░ рди рд╣реА рдорд╛рдирдХ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ (рдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рд┐рдП) рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

4 рдЬрдирд╡рд░реА 2017 рдХреЛ, 22:13 рдкрд░, рдпрд╣реЛрд╢реВ рд▓реЗрдмреЛ-рдлрд╝реЗрд╕рд░ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдЬрд╝рд░реВрд░, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╣реЛрдЧрд╛ред рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдпрд╛ рдкреНрд░рдпреЛрдЬреНрдп рдХреЗ рдХреЛрдИ рдиреБрдХрд╕рд╛рди рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рджреВрд╕рд░реЗ рдЯреЛрдХрд░реЗ рдореЗрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╣рд╛рдВ, рд▓реЗрдХрд┐рди рдЖрдк рд╢рд╛рдпрдж рдЗрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рдХрд┐ @SON2314 https://github.com/Ericson233 рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ)ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдордирдорд╛рдирд╛ рдХрд╕реНрдЯрдо рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдорд╛рдирдХ-рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдВрдЧреНрд░рд╣ (рдХреЛрдИ рдвреЗрд░-рдЖрд╡рдВрдЯрд┐рдд рдореВрд▓реНрдп) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ; рдЕрд░реНрдерд╛рдд рд╡рд╕реНрддреБ-рд╡рд┐рд╢реЗрд╖ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВред

рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рджреЛрдиреЛрдВ - рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВред рдСрдмреНрдЬреЗрдХреНрдЯ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреИрд╢рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рд╣реИрдВ; рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрд▓реИрдм рдЖрд╡рдВрдЯрди рдФрд░ рдкрддреНрд░рд┐рдХрд╛ рдХреИрд╢рд┐рдВрдЧ рджреЛрдиреЛрдВ рд╣реА рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рджреЗрддреЗ рд╣реИрдВ - рдпрджрд┐ рдЖрдк рдЙрддреНрд╕реБрдХ рд╣реИрдВ рддреЛ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХрд╛рдЧрдЬрд╛рдд рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub https://github.com/rust-lang/rust/issues/32838#issuecomment-270502231 рдкрд░ https://github.com/notifications/unsubscribe-auth/ рдкрд░ рджреЗрдЦреЗрдВред AAEF3L9F9r_0T5evOtt7Es92vw6gBxR9ks5rPBl9gaJpZM4IDYUN

рд▓реЗрдХрд┐рди рд╡рд╕реНрддреБ рдЖрдмрдВрдЯрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рдЖрдмрдВрдЯрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдПрдХ рдЙрдк-рд╕рдореВрд╣ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╣ рдЙрддрдирд╛ рд╣реА рд╕рд░рд▓ рд╣реИ, рдЬрд┐рддрдирд╛ рдХрд┐ рдореИрдВ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рди рддреЛ рд╕рдВрдХрд▓рдХ рдХреЛ рдФрд░ рди рд╣реА рдорд╛рдирдХ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ (рдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рд┐рдП) рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЖрд╣, рддреЛ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╢рдмреНрджрд╛рд░реНрде рдЕрд▓рдЧ рд╣реИрдВред Allocator рдЖрд╡рдВрдЯрд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдХрдЪреНрдЪреА рдмрд╛рдЗрдЯ рдХреЛ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, ObjectAllocator<T> , рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ (рдЗрд╕рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ рдЬреЛ рдмрд╛рдж рдореЗрдВ рдПрдХ рдирд╡-рдЖрд╡рдВрдЯрд┐рдд рд╡рд╕реНрддреБ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрджрд▓реЗ рдореЗрдВ рд╕реМрдВрдкреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред , рдЬреЛ рдорд╣рдВрдЧрд╛ рд╣реИ)ред рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

trait ObjectAllocator<T> {
    fn alloc() -> T;
    fn free(t T);
}

рдпрд╣ Allocator рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ, рдЬрд┐рдирдХреЗ рддрд░реАрдХреЗ рдХрдЪреНрдЪреЗ рд╕рдВрдХреЗрдд рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдХреЛрдИ рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, Allocator s рдХреЗ рд╕рд╛рде, рдпрд╣ рдХреЙрд▓рд░ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИ рдХрд┐ drop рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╣рд▓реЗ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ - T ObjectAllocator<T> T drop рдкрджреНрдзрддрд┐ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ free(t) рдмрд╛рдж рд╕реЗ t free , рдХреЙрд▓рд░ _cannot_ t рдкрд╣рд▓реЗ рдЧрд┐рд░рддрд╛ рд╣реИ - рдпрд╣ ObjectAllocator<T> рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИред рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ, рдпреЗ рджреЛ рд▓рдХреНрд╖рдг рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИрдВред

рдЖрд╣ рдареАрдХ рд╣реИ, рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдпрд╛рдиреА рдмрд╛рдЗрдЯ рд╕реНрддрд░ рдкрд░ "рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп" рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ред рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡!

4 рдЬрдирд╡рд░реА 2017 рдХреЛ, 22:29 рдкрд░, рдпрд╣реЛрд╢реВ рд▓реЗрдмреЛ-рдлрд╝реЗрд╕рд░ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рд▓реЗрдХрд┐рди рд╡рд╕реНрддреБ рдЖрдмрдВрдЯрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рдЖрдмрдВрдЯрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдПрдХ рдЙрдк-рд╕рдореВрд╣ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╣ рдЙрддрдирд╛ рд╣реА рд╕рд░рд▓ рд╣реИ, рдЬрд┐рддрдирд╛ рдХрд┐ рдореИрдВ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рди рддреЛ рд╕рдВрдХрд▓рдХ рдХреЛ рдФрд░ рди рд╣реА рдорд╛рдирдХ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ (рдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рд┐рдП) рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЖрд╣, рддреЛ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╢рдмреНрджрд╛рд░реНрде рдЕрд▓рдЧ рд╣реИрдВред рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрдЪреНрдЪреЗ рдмрд╛рдЗрдЯ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИред ObjectAllocatorрджреВрд╕рд░реА рдУрд░, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЧрд┐рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ (рдЗрд╕рдореЗрдВ рдХреИрд╢-рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдмрд╛рдж рдореЗрдВ рдПрдХ рдирдИ рдЖрд╡рдВрдЯрд┐рдд рд╡рд╕реНрддреБ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрджрд▓реЗ рдореЗрдВ рд╕реМрдВрдкреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬреЛ рдорд╣рдВрдЧреА рд╣реИ)ред рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╕реНрддреБ{
рдПрдлрдПрди рдЖрд╡рдВрдЯрди () -> рдЯреА;
fn рдореБрдХреНрдд (рдЯреА рдЯреА);
}
рдпрд╣ рдПрд▓реЛрдХреЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ, рдЬрд┐рдирдХреЗ рддрд░реАрдХреЗ рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреА рдХреЛрдИ рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, Allocators рдХреЗ рд╕рд╛рде, рдпрд╣ рдХреЙрд▓рд░ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ - рдЯреА рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдВрдХреЛрд▓реЗрдЯрд░ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИрдХреЙрд▓ рдЯреА рдХреА рдбреНрд░реЙрдк рд╡рд┐рдзрд┐ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЪреВрдВрдХрд┐ рдлреНрд░реА (рдЯреА) рдЯреА рдореЗрдВ рдореБрдХреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓реЗ рдЯреА рдбреНрд░реЙрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдпрд╣ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣реИрдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИред рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ, рдпреЗ рджреЛ рд▓рдХреНрд╖рдг рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИрдВред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub https://github.com/rust-lang/rust/issues/32838#issuecomment-270505704 рдкрд░ https://github.com/notifications-unsubscribe-auth/ рдкрд░ рдореНрдпреВрдЯ

@alexreg рдЖрд╣ рд╣рд╛рдБ, рдореИрдВ рднреА рдпрд╣реА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ :) рдУрд╣ рдареАрдХ рд╣реИ - рдЗрд╕реЗ рджреВрд╕рд░реЗ RFC рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рд╣реЛрдЧреАред

рд╣рд╛рдВ, рдЖрд░рд╕реАрд╕реА рдХреЛ рд╢реБрд░реВ рдХрд░реЗрдВ, рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЗрд╕реЗ рднрд░рдкреВрд░ рд╕рдорд░реНрдерди рдорд┐рд▓реЗрдЧрд╛! рдФрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж (рдореИрдВрдиреЗ рдЗрд╕ рдЖрд░рдПрдлрд╕реА рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд░рдЦрд╛ рдерд╛)ред

5 рдЬрдирд╡рд░реА 2017 рдХреЛ, 00:53 рдкрд░, рдпрд╣реЛрд╢реВ рд▓реЗрдмреЛ-рдлрд╝реЗрд╕рд░ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

@alexreg https://github.com/alexreg рдЖрд╣ рд╣рд╛рдБ, рдореИрдВ рднреА рдпрд╣реА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ :) рдУрд╣ рдареАрдХ рд╣реИ - рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп IFC рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub https://github.com/rust-lang/rust/issues/32838#issuecomment-270531535 рдкрд░ https://github.com/notifications/unsubscribe-auth/ рдкрд░ рджреЗрдЦреЗрдВ AAEF3MQQeXhTliU5CBsoheBFL26Ee9WUks5rPD8RgaJpZM4IDYUN

рдХрд╕реНрдЯрдо рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЛрдХрд░рд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдорд╛рдл рдХрд░ рджреЛ рдЕрдЧрд░ рдореИрдВ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдпрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ RFC рдореЗрдВ Layout рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ Copy рд╕рд╛рде-рд╕рд╛рде Clone , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рд╣реИ рдкреЙрдб?

рдореИрдВ рдХрд┐рд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рднреА рдирд╣реАрдВ рд╕рдХрддрд╛ред

рдЦреЗрдж рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЗрддрдиреА рджреЗрд░ рд╣реЛ рд░рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди ...

рдпрд╣ dealloc -рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ? рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╕рдВрд░реЗрдЦрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдВ рдЗрд╕рдХреА рдореВрд▓ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреА рд╕реНрдореГрддрд┐ рдореЗрдВ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╕рдВрджрд░реНрдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдореБрдХреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред

рдпрд╣ рдХрд╕реНрдЯрдо рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реА рдЬреАрдд рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рд╕реНрд╡рдпрдВ рдПрдХ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдмрд▓реНрдХрд┐ рдХреЗрд╡рд▓ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ _type_ рдкрд░ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ dealloc рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ Box рдХреЛ рдЕрдВрддрддрдГ рдХрд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░реНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рд╕рдВрджрд░реНрдн рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рд╢рдмреНрджреЛрдВ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреЗрд╡рд▓ рдПрдХ рд╢рдмреНрдж (рд╕рд┐рд░реНрдл рд╕реВрдЪрдХ) рд░рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рднреАред

рд╕рдВрдмрдВрдзрд┐рдд рдиреЛрдЯ рдкрд░, рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рд╡рд┐рдзрд┐ alloc рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЧреИрд░-рд╡рд┐рдзрд┐ dealloc рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд░рдЪрдирд╛ рдХрд░реЗрдЧрд╛ - рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреЙрдЗрдВрдЯрд░-рдЯреВ-рдПрд▓реЛрдХреЗрдЯрд░ рдЗрдВрдЯреНрд░реИрдХреНрд╢рди рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕реНрдерд┐рд░ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧрд╛ рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ред

@joshlf рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╝рд╛рдЗрди рдЖрдкрдХреЛ рдпрд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдПрдХ (рд╢реВрдиреНрдп-рдЖрдХрд╛рд░) рдЗрдХрд╛рдИ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдпрд╛рдиреА struct MyAlloc; рдЬрд┐рд╕ рдкрд░ рдЖрдк Allocator рд╡рд┐рд╢реЗрд╖рддрд╛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рд╕рдВрдЪрдп рдХрд░рдирд╛ рдпрд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ, рдХрдо рд╕рд╛рдорд╛рдиреНрдп рд╣реИред

рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛ рдХрд┐ рдПрдХ рд╕реАрдзреЗ-рдПрдореНрдмреЗрдбреЗрдб рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдЪ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рдВрджрд░реНрдн рд░рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддреА рд╣реИ? рдХреНрдпрд╛ рдПрдХ рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрджрд░реНрдн рд╢реВрдиреНрдп рд╕реНрдерд╛рди рд▓реЗрддрд╛ рд╣реИ? рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИ:

struct Foo()

struct Blah{
    foo: &Foo,
}

рдХреНрдпрд╛ Blah рдХрд╛ рдЖрдХрд╛рд░ рд╢реВрдиреНрдп рд╣реИ?

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ, рдЖрдк рдЕрдкрдиреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рд╢реВрдиреНрдп рдЖрдХрд╛рд░ рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрдмрдВрдЯрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк _from_ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдореВрд▓ рдЖрдмрдВрдЯрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдпрд╣ рдЕрднреА рднреА Box рдХреЗрд╡рд▓ рдПрдХ рд╢рдмреНрдж рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдЖрдкрдХреЗ рдкрд╛рд╕ Box::new_from_allocator рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛрдЧрд╛ рдЬреЛ рдПрдХ рдЖрдмрдВрдЯрдХ рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ - рдФрд░ рдпрд╣ рдПрдХ рдЧреИрд░-рдЖрдХрд╛рд░ рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдореВрд▓ рдЖрд╡рдВрдЯрди рд╕рдВрджрд░реНрдн рдХреЗ рдмрд┐рдирд╛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рддреЛ Box<T> рдореВрд▓ Box::new_from_allocator рдХреЙрд▓ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪ рд╕рдХрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрдмрдВрдЯрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд╕реЗ рдЖрдмрдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдореВрд▓ рдЖрдмрдВрдЯрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдХреНрд╖рдорддрд╛ w / o рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рд▓рдВрдмреЗ, рд▓рдВрдмреЗ, рдкрд╣рд▓реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдФрд░ рдбреАрд▓рд▓реЙрдХрд░ рд▓рдХреНрд╖рдг (рджреЛрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рд╕рд╣рдпреЛрдЧреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде) рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдерд╛ред

рдХреНрдпрд╛ рд╕рдВрдХрд▓рдХ рдХреЛ рдЗрди рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЖрд╡рдВрдЯрди рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП?

рдХреНрдпрд╛ рд╕рдВрдХрд▓рдХ рдХреЛ рдЗрди рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЖрд╡рдВрдЯрди рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП?

@Zoxc рддреБрдореНрд╣рд╛рд░рд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?

рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рд▓рдВрдмреЗ, рд▓рдВрдмреЗ, рдкрд╣рд▓реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдФрд░ рдбреАрд▓рд▓реЙрдХрд░ рд▓рдХреНрд╖рдг (рджреЛрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рд╕рд╣рдпреЛрдЧреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде) рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдерд╛ред

рдкреЛрд╕реНрдЯрд░рд┐рдЯреА рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рдХрдерди рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░ рджреВрдВ (рдореИрдВрдиреЗ @2323 рд╕реЗ рдмрд╛рдд рдХреА): рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ Box рдПрдХ рдбреАрд▓реЙрдХрд░ рдкрд░ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рддреЛ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

trait Allocator {
    type D: Deallocator;

    fn get_deallocator(&self) -> Self::D;
}

trait Deallocator {}

struct Box<T, D: Deallocator> {
    ptr: *mut T,
    d: D,
}

impl<T, D: Deallocator> Box<T, D> {
    fn new_from_allocator<A: Allocator>(x: T, a: A) -> Box<T, A::D> {
        ...
        Box {
            ptr: ptr,
            d: a.get_deallocator()
        }
    }
}

рдЗрд╕ рддрд░рд╣, рдЬрдм new_from_allocator рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ A::D рдПрдХ рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рддреЛ d рдлрд╝реАрд▓реНрдб рдХрд╛ Box<T, A::D> рд╢реВрдиреНрдп рдЖрдХрд╛рд░ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдореА Box<T, A::D> рдХрд╛ рдЖрдХрд╛рд░ рдПрдХ рд╢рдмреНрдж рд╣реИред

рд╡рд╣рд╛рдБ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдордп рд╣реИ рдЬрдм рдпрд╣ рдЙрддрд░ рдЬрд╛рдПрдЧрд╛? рдореИрдВ рдХреБрдЫ рдПрд▓реЛрдХреЗрдЯрд░ рд╕рд╛рдорд╛рди рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдпрд╣ рд╕рд╛рдорд╛рди рдореЗрд░реЗ рд▓рд┐рдП рдмрдВрдж рд╣реЛред

рдпрджрд┐ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЪрдХреНрд░реЛрдВ рдХреЛ рдЙрдзрд╛рд░ рджреЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд░реВрдк рд╕реЗ рд░рд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реВрдВ, рддрд╛рдХрд┐ рдПрдХ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдХреЛрдб рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд░рдЦрдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЗрд╡рд▓ рдЕрдиреБрдЪрд░ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдХрд╛рдо рдкреИрджрд╛ рд╣реЛред рдореИрдВ рдХрд┐рд╕реА рдХреЗ рдкреИрд░ рдХреА рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░ рдХрджрдо рдирд╣реАрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛, рдФрд░ рдореИрдВ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред

рдареАрдХ рд╣реИ, рд╣рдо рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рд▓реЗ рд╣реИрдВ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдЪреНрдЫреА рдЦрдмрд░реЗрдВ рднреА рд╣реИрдВ! рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд░реНрдерди рдЕрднреА рддрдХ рдЗрди APIs рдХреЗ рд▓рд┐рдП libstd рдореЗрдВ рдирд╣реАрдВ рдЙрддрд░рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд░ рдХреЛрдИ рдЕрднреА рднреА рдЙрдирдХреЗ рд╕рд╛рде рдЙрддрд░рдиреЗ рд╕реЗ рдЦреБрд╢ рд╣реИ!

рдПрдХ рдмрд╛рдд рдЬрд┐рд╕ рдкрд░ рд╣рдордиреЗ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд рдЗрдВрдЯреНрд░реЗрдВрд╕ рдореБрджреНрджреЛрдВ рдХреЗ рдХрд╛рд░рдг рд╕рднреА рд▓реАрдмрд╕реНрдЯреИрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдереЛрдбрд╝рд╛ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рдд рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐ рдпрд╣ Allocator рд╡рд┐рд╢реЗрд╖рддрд╛ рдФрд░ Layout рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд std::heap рдореЙрдбреНрдпреВрд▓ рдореЗрдВ Layout рдкреНрд░рдХрд╛рд░!

@joshlf рдЕрдЧрд░ рдЖрдк рдпрд╣рд╛рдБ рдорджрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛! рдкрд╣рд▓рд╛ рдЯреБрдХрдбрд╝рд╛ рд╕рдВрднрд╡рддрдГ рдЗрд╕ RFC рд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдХрд╛рд░ / рдЧреБрдг рдХреЛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЙрддрд╛рд░рдиреЗ рдХрд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рд╡рд╣рд╛рдБ рд╕реЗ рд╣рдо libstd рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдЦреЗрд▓рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@alexcrichton рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд▓рд┐рдВрдХ рдЯреВрдЯ рдЧрдпрд╛ рд╣реИ? рдпрд╣ рдпрд╣рд╛рдБ рд╡рд╛рдкрд╕ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдмрд╛рдд рдЬрд┐рд╕ рдкрд░ рд╣рдордиреЗ рдЪрд░реНрдЪрд╛ рдХреА, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд рдмрдЪрд╛рд╡ рдореБрджреНрджреЛрдВ рдХреЗ рдХрд╛рд░рдг рд╕рднреА рд▓реАрдмрд╕реНрдЯреИрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрд╣рд▓рд╛ рдХрджрдо рд╣реИ, рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛ APIs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд┐рдирд╛ рд╡реЗ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗред Https://github.com/rust-lang/rust/issues/27336#issuecomment -30072151558 рдореЗрдВ рд╣рдо рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдореЛрд╣рд░реЗ рдХреЗ рдкреАрдЫреЗ рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рддреБрд░рдВрдд рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди std рдореЗрдВ newtype рд░реИрдкрд░ рдЬреЛрдбрд╝реЗрдВред рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╖реНрдЯрдкреНрд░рдж, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдкреНрд░рдЧрддрд┐ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

@alexcrichton рдСрдмреНрдЬреЗрдХреНрдЯ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдиреЗ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рджрд┐рд▓рд╛рдпрд╛ рд╣реИ рдХрд┐ рдЖрд╡рдВрдЯрди рдЧреБрдг рдФрд░ рд╡рд╕реНрддреБ рдХреЗ рдмреАрдЪ рдПрдХ рдкреВрд░реНрдг-рд╕рдорд░реВрдкрддрд╛ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реА рд╣реИред рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд▓рдХреНрд╖рдг рдЬреИрд╕реЗ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рд╣реЛрдЧрд╛ (рдореИрдВрдиреЗ Address *mut u8 рд╕рдорд░реВрдкрддрд╛ рдХреЗ рд╕рд╛рде *mut T ObjectAllocator<T> ; рд╣рдо рд╢рд╛рдпрдж Address<T> рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ

unsafe trait Allocator {
    unsafe fn alloc(&mut self, layout: Layout) -> Result<*mut u8, AllocErr>;
    unsafe fn dealloc(&mut self, ptr: *mut u8, layout: Layout);
}
unsafe trait ObjectAllocator<T> {
    unsafe fn alloc(&mut self) -> Result<*mut T, AllocErr>;
    unsafe fn dealloc(&mut self, ptr: *mut T);
}

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЙрд╕рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЬрдЧрд╣ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╛ рдЪрд╛рд╣реЗ рдПрдХ рдФрд░ рдЖрд░рдПрдлрд╕реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛, рдмрд╣реБрдд рдХрдо рд╕реЗ рдХрдо, рдПрдХ рдЕрд▓рдЧ рдкреАрдЖрд░ред

рдУрд╣, рдореЗрд░рд╛ рдорддрд▓рдм рдпрд╣рд╛рдВ рд▓рд┐рдВрдХ рдХрд░рдирд╛ @ рдЬреЛрд╢рдлреЛрд▓ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ?

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @alexcrichton рдПрдХ рдРрд╕рд╛ рдкреАрдЖрд░ рдЪрд╛рд╣рддрд╛ рд╣реИ рдЬреЛ Allocator рд╡рд┐рд╢реЗрд╖рддрд╛ рдФрд░ Layout рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░реЗ, рднрд▓реЗ рд╣реА рд╡рд╣ libstd рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдПрдХреАрдХреГрдд рди рд╣реЛред

рдЕрдЧрд░ рдореБрдЭреЗ рд╡рд╣ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рд░рдЦ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ RawVec рдФрд░ Vec рд╕рд╛рде рдХрдо рд╕реЗ рдХрдо рдПрдХреАрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред (рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдореЗрд░реЗ рдкрд╛рд╕ RawVec рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди Vec рдХрдИ рдЕрдиреНрдп рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдЕрдзрд┐рдХ рдЪреБрдиреМрддреАрдкреВрд░реНрдг рд╣реИ, рдЬреЛ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╣реИрдВ, рдЬреИрд╕реЗ Drain рдФрд░ IntoIter рдЖрджрд┐ ...)

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореЗрд░реА рд╡рд░реНрддрдорд╛рди рд╢рд╛рдЦрд╛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреА рд╣реИ (рдФрд░ RawVec рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг), рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЖрдЧреЗ рдмрдврд╝рдХрд░ рдЗрд╕реЗ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛: # 42313

@hawkw рдиреЗ рдкреВрдЫрд╛:

рдореБрдЭреЗ рдорд╛рдл рдХрд░ рджреЛ рдЕрдЧрд░ рдореБрдЭреЗ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЗрд╕ рдЖрд░рдПрдлрд╕реА рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд▓реЗрдЖрдЙрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдХреЙрдкреА рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдХреНрд▓реЛрди рдХреЛ рднреА рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдкреАрдУрдбреА рд╣реИ?

рдЬрд┐рд╕ рдХрд╛рд░рдг рд╕реЗ рдореИрдВрдиреЗ Layout рдХреЗрд╡рд▓ Clone рдФрд░ Copy рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ Layout рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореИрдВ рдЕрднреА рднреА рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Layout рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реВрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, struct { x: u8, y: [char; 215] } 16-

рдпрд╣ рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реБрд╡рд┐рдзрд╛ рд╣реЛрдЧреА, рдЕрд░реНрдерд╛рдд рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреНрд╡рд╛рд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реИ рдкреНрд░рдХрд╛рд░ Layout рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдлреЙрд░реНрдо рдХреЗ рдХрд┐рд╕реА рднреА рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рдХреЛ рдЖрд╡рдВрдЯрди рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП "рдЕрдЬреНрдЮрд╛рдд рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ" рд╢реНрд░реЗрдгреА рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬрд┐рд╕рдореЗрдВ рдЯрд╛рдЗрдк рдЬрд╛рдирдХрд╛рд░реА рди рд╣реЛред

рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдореБрдЦреНрдп рдХрд╛рд░рдг рдереЗ рдХрд┐ рдореИрдВрдиреЗ Layout Copy рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдЪреБрдирд╛; рдореИрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реЛрдЪрд╛ рд╣реИ рдХрд┐ рдХреЗ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди Copy рдкрд░ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рдмрд╛рдзрд╛ рд╣реЛрдЧрд╛ Layout рд╣реАред

@alexcrichton @pnkfelix

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @pnkfelix рдореЗрдВ рдпрд╣ рдХрд╡рд░ рд╣реИ, рдФрд░ рдкреАрдЖрд░ рдореЗрдВ рдХрд░реНрд╖рдг рд╣реЛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЪрд▓реЛ рдмрд╕ рдЙрд╕реА рдХреЗ рд╕рд╛рде рдЪрд▓рддреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕реЗ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЕрднреА рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ!

рд╡рд░реНрддрдорд╛рди рдореЗрдВ Allocator::oom рд▓рд┐рдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИ:

    fn oom(&mut self, _: AllocErr) -> ! {
        unsafe { ::core::intrinsics::abort() }
    }

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдореЗрд░реЗ рдзреНрдпрд╛рди рдореЗрдВ рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП Option<Layout> рдЬреИрд╕реЗ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@alexcrichton
рдпрд╣ рдХрдИ oom_xxx рд╡реЗрд░рд┐рдПрдВрдЯ рдпрд╛ рд╡рд┐рднрд┐рдиреНрди рддрд░реНрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рдПрдирд╛рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдРрд╕реЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИрдВ рдЬреЛ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ, alloc рдПрдХ рд▓реЗрдЖрдЙрдЯ рд▓реЗрддрд╛ рд╣реИ, realloc рдПрдХ рдкреЙрдЗрдВрдЯрд░, рдПрдХ рдореВрд▓ рд▓реЗрдЖрдЙрдЯ рдФрд░ рдПрдХ рдирдпрд╛ рд▓реЗрдЖрдЙрдЯ, рдЖрджрд┐) рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реЛрдВ рдЬрд┐рдирдореЗрдВ oom -рд╕рдорд╛рди рд╡рд┐рдзрд┐ рдЙрди рд╕рднреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣реЗрдВред

@ рдЬреЛрд╢рдлреЗрд▓ рдпрд╣ рд╕рдЪ рд╣реИ, рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИред рдореИрдВ рдХреЗрд╡рд▓ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЬреЛрдбрд╝рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдпрд╣рд╛рдВ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд┐рдВрджреБ " fn dealloc " рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдВрд░реЗрдЦрдг рдкрд░ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рд╣реИрдВ, рдпрд╣ рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ, рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ dealloc рдХрд╛ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди align рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдореБрдлреНрддред @ruuda рдЖрдкрдХреЛ рдЗрд╕ рддрдереНрдп рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛ рд╕рдХрддреА рд╣реИред

рдпрд╣рд╛рдВ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд┐рдВрджреБ " fn dealloc " рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдВрд░реЗрдЦрдг рдкрд░ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рд╣реИрдВ, рдпрд╣ рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ, рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ dealloc рдХрд╛ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди align рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдореБрдлреНрддред

рд╣рд╛рдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдореИрдВ рд╢реБрд░реВ рдореЗрдВ рдЗрд╕ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛; рдореЗрд░рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдХреНрд░реИрд╢ рд╣реЛ рдЧрдпрд╛ред рдЬреИрд╕рд╛ рдХрд┐ HeapAlloc рдХреЛрдИ рд╕рдВрд░реЗрдЦрдг рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, allocate рдПрдХ рдмрдбрд╝реЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╣реЗрдбрд░ рдореЗрдВ рдореВрд▓ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдЯрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рд╕рдВрд░реЗрдЦрдг рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд╡реИрд╕реЗ рднреА рд╕рдВрддреБрд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЕрдЧрд░ HeapAlloc рдХреЛ рдПрдХ рд╕рдВрд░реЗрдЦрдг-рдЬрд╛рдЧрд░реВрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдЦреЛрдП рдмрд┐рдирд╛, рдореБрдлреНрдд рдореЗрдВ рд╕рдВрд░реЗрдЦрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

@ruuda

рдХреЗ рд░реВрдк рдореЗрдВ HeapAlloc рдХреЛрдИ рд╕рдВрд░реЗрдЦрдг рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ

рдпрд╣ 32 рдмрд┐рдЯ рдХреЗ рд▓рд┐рдП 8 рдмрд╛рдЗрдЯреНрд╕ рдХреА рдиреНрдпреВрдирддрдо рд╕рдВрд░реЗрдЦрдг рдЧрд╛рд░рдВрдЯреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдпрд╛ 64 рдмрд┐рдЯ рдХреЗ рд▓рд┐рдП 16 рдмрд╛рдЗрдЯреНрд╕, рдпрд╣ рд╕рд┐рд░реНрдл рд╕рдВрд░реЗрдЦрдг рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╡рд┐рдВрдбреЛрдЬ рдкрд░ CRT рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ _aligned_malloc рдЙрдЪреНрдЪ рд╕рдВрд░реЗрдЦрдг рдХрд╛ рдЖрд╡рдВрдЯрди рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕реЗ _aligned_free рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, free рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╡реИрдз рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ malloc рдпрд╛ _aligned_malloc рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдЖрд╡рдВрдЯрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдпрд╛ рдирд╣реАрдВ, рддреЛ рдЖрдк рдПрдХ рд╣реА рдирддреАрдЬреЗ рдореЗрдВ рдлрдВрд╕ рдЧрдП рд╣реИрдВ рдХрд┐ alloc_system Windows рдкрд░ рд╣реИ рдпрджрд┐ рдЖрдк рдбреЙрди ' t deallocate рд▓рд┐рдП рд╕рдВрд░реЗрдЦрдг рдкрддрд╛ рд╣реИред CRT рдорд╛рдирдХ aligned_alloc рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ free рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП Microsoft рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ C11 рд╕рдорд╛рд░реЛрд╣ рд╣реИ рдФрд░ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рд╕реА 11 рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рддреЛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдХрдордЬреЛрд░ рддрд░реНрдХ рд╣реИред)

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ deallocate рдХреЗрд╡рд▓ рд╕рдВрд░реЗрдЦрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд╡рд╛рд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЕрддрд┐рд╡реНрдпрд╛рдкреА рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рд╕реНрд╡рдпрдВ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ deallocate рдЪрд╛рд╣рддреЗ рдереЗ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрд╡рддрдВрддреНрд░ рд╕рдВрд░реЗрдЦрдг рдерд╛, рддреЛ рдЖрдк рдмрд╕ рдЖрд╡рдВрдЯрди рдХреЗ рд░реВрдк рдореЗрдВ рд╕рднреА рдЖрд╡рдВрдЯрди рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░ рд╕рдХрддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдЖрдк рдЫреЛрдЯреЗ рдЖрд╡рдВрдЯрди рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдмрд░реНрдмрд╛рдж рдХрд░реЗрдВрдЧреЗред

@alexcrichton рдиреЗ рд▓рд┐рдЦрд╛ :

рд╡рд░реНрддрдорд╛рди рдореЗрдВ Allocator::oom рд▓рд┐рдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИ:

    fn oom(&mut self, _: AllocErr) -> ! {
        unsafe { ::core::intrinsics::abort() }
    }

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдореЗрд░реЗ рдзреНрдпрд╛рди рдореЗрдВ рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП Option<Layout> рдЬреИрд╕реЗ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

AllocErr рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Layout AllocErr::Exhausted рд╡реЗрд░рд┐рдПрдВрдЯ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рд╣рдо рд╕рд┐рд░реНрдл Layout рдХреЛ AllocErr::Unsupported рд╡реИрд░рд┐рдПрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╣реЛрдЧрд╛ред (рдЗрд╕рдореЗрдВ AllocErr рдПрдиреБрдо рдХреА рдУрд░ рд╕реЗ рдЪреБрдкрдЪрд╛рдк рдмрдврд╝рдиреЗ рдХрд╛ рджреЛрд╖ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рд╣рдореЗрдВ рдЙрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП ...)

рдУрд╣ рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд╕реБрдзрд╛рд░ @pnkfelix рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ std::heap рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ https://github.com/rust-lang/rust/pull/42727 рднреВрдорд┐ рдХреЗ рдмрд╛рдж рд╣реЛрдЧрд╛ред рдореИрдВ рдЗрд╕рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдХреБрдЫ рдЕрдиреНрдп рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ рдХреЛ рдмрдВрдж рдХрд░реВрдВрдЧрд╛ред

рдХреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджрд╛ рд╣реИ? рдЕрдм рдЬрдм рдкреАрдЖрд░ рдХрд╛ рд╡рд┐рд▓рдп рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛

  • рд╕рдВрдмрдВрдзрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ
  • рдХрд┐рд╕реА рднреА рд╕реНрдерд╛рдиреАрдп рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ (рд╡рд┐рд╢реЗрд╖рдХрд░ рд╕рдВрдмрдВрдзрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ

рдореИрдВрдиреЗ https://github.com/rust-lang/rust/issues/42774 рдХреЛ рд╕реНрдЯреИрдб рдХрд▓реЗрдХреНрд╢рди рдореЗрдВ Alloc рдПрдХреАрдХрд░рдг рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЛрд▓рд╛ рд╣реИред Libs рдЯреАрдо рдореЗрдВ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдЪрд░реНрдЪрд╛ рдХреЗ рд╕рд╛рде std::heap рдореЙрдбреНрдпреВрд▓ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд╛рд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рдПрдХ рдЕрд▓рдЧ рдЯреНрд░реИрдХ рдкрд░ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред

рдЖрд╡рдВрдЯрди-рд╕рдВрдмрдВрдзреА рдореБрджреНрджреЛрдВ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп рдореИрдВ рднреА https://github.com/rust-lang/rust/issues/30170 рдкрд░ рдЖрдпрд╛ рдерд╛, рдЬреЛ @pnkfelix рдереЛрдбрд╝реА рджреЗрд░ рдкрд╣рд▓реЗ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рдерд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ OSX рд╕рд┐рд╕реНрдЯрдо рдЖрдмрдВрдЯрдХ рдЙрдЪреНрдЪ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде рдЫреЛрдЯреА рдЧрд╛рдбрд╝реА рд╣реИ рдФрд░ рдЬрдм рдЙрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ jemalloc рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрдо рд╕реЗ рдХрдо рд▓рд┐рдирдХреНрд╕ рдкрд░ рд╕реМрджреЗ рдХреЗ рджреМрд░рд╛рди segfaulting рд╣реИред рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд▓рд╛рдпрдХ!

рдореИрдВрдиреЗ # 42794 рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╢реНрди рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдЧрд╣ рдХреЗ рд░реВрдк рдореЗрдВ рдЦреЛрд▓рд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдХреЗ рдЖрд╡рдВрдЯрди рдХреЛ рдЙрдирдХреЗ рдЕрдиреБрд░реЛрдзрд┐рдд рд╕рдВрд░реЗрдЦрдг рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

(рдУрд╣ рд░реБрдХреЛ, рд╢реВрдиреНрдп рдЖрдХрд╛рд░ рдХреЗ рдЖрд╡рдВрдЯрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рдЕрд╡реИрдз рд╣реИрдВ!)

рдЪреВрдВрдХрд┐ alloc::heap::allocate рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдорд┐рддреНрд░ рдЕрдм рд░рд╛рдд рдореЗрдВ рдЪрд▓реЗ рдЧрдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рдирдП API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡реЛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдЕрдВрддрд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ:

-use alloc::heap;
+use alloc::allocator::{Alloc, Layout};
+use alloc::heap::Heap;
-        let ptr = heap::allocate(req_size as usize, FT_ALIGNMENT) as *mut c_void;
+        let layout = Layout::from_size_align(req_size as usize, FT_ALIGNMENT).unwrap();
+        let ptr = Heap.alloc(layout).unwrap() as *mut c_void;

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдорд╣рд╛рди рдирд╣реАрдВ рд╣реИрдВред рд╣рдо рдПрдХ рдЖрдЗрдЯрдо рдХреЛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рд╕реЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рддреАрди рдЖрдпрд╛рдд рдХрд░рдиреЗ рдЧрдПред

  • рдХреНрдпрд╛ allocator.alloc(Layout::from_size_align(тАж)) рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рд╡рд┐рдзрд┐ рд░рдЦрдирд╛ рд╕рдордЭрджрд╛рд░реА рд╣реЛрдЧреА?
  • рдХреНрдпрд╛ рдпрд╣ <Heap as Alloc>::_ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ рдирд┐рд╣рд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрдПрдЧрд╛? (рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдо рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП, Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ред)

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, Alloc рдЧреБрдг рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ?

@SimonSapin IMO рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдПрдкреАрдЖрдИ рдХреЗ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд╣реИред

@SimonSapin

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдорд╣рд╛рди рдирд╣реАрдВ рд╣реИрдВред рд╣рдо рдПрдХ рдЖрдЗрдЯрдо рдХреЛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рд╕реЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рддреАрди рдЖрдпрд╛рдд рдХрд░рдиреЗ рдЧрдПред

рдореБрдЭреЗ рдЕрдкрдиреЗ рдХреЛрдбрдмреЗрд╕ рдХреЗ рд╕рд╛рде рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рдЕрд╣рд╕рд╛рд╕ рдерд╛ - рдЕрдм рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ allocator.alloc(Layout::from_size_align(тАж))? рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рд╡рд┐рдзрд┐ рдХрд╛ рдЕрд░реНрде рд╣реЛрдЧрд╛

рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд╣реИ, рдпрд╛ рдХреЗрд╡рд▓ Heap ? рдпрд╣рд╛рдБ рдПрдХ рдмрд╛рдд рдкрд░ рдЧреМрд░ рдХрд░реЗрдВ рдХрд┐ рдЕрдм рдПрдХ рддреАрд╕рд░реА рддреНрд░реБрдЯрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИ: Layout::from_size_align Option , рдЗрд╕рд▓рд┐рдП рд╡рд╣ None рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЖрдкрдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╕рдордп рдорд┐рд▓ рд╕рдХрддреА рд╣реИрдВ ред

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, Alloc рдЧреБрдг рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ?

IMO рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп API рдХреЗ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдВрднрд╡рддрдГ рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдХрдо-рд╕реНрддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ (рд╕реНрд╡рд╛рд░реНрдереА рд░реВрдк рд╕реЗ, рдХрдо рд╕реЗ рдХрдо - рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╖реНрдЯрдкреНрд░рдж рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ред) рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдореВрд▓реНрдп рд╣реИред

@SimonSapin рдХреНрдпрд╛ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ OOM рдХреЛ рд╣реИрдВрдбрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛? рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ std рд╕рднреА рддреАрди рдкреНрд░рдХрд╛рд░ std::heap рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ (рд╡реЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдЖрдХрд╛рд░ рдХреЗ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдирд╣реАрдВ рд╕рдВрднрд╛рд▓рд╛? рдпрд╛ рд╢реВрдиреНрдп рдЖрдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░?

рдХреНрдпрд╛ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ OOM рдХреЛ рд╣реИрдВрдбрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛?

рдЬрдм рдпрд╣ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ alloc::heap::allocate рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдПрдХ рд╕реВрдЪрдХ рд▓реМрдЯреЗ Result рдФрд░ OOM рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдЫреЛрдбрд╝рд╛ рдерд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдиреЗ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд┐рд░рд╕реНрдд рдХрд░ рджрд┐рдпрд╛ред рдЕрдм рдореИрдВрдиреЗ рдзрд╛рдЧреЗ рдХреЛ рдШрдмрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП .unwrap() рдЬреЛрдбрд╝рд╛ рд╣реИред

рд╡реЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рдореИрдВ рдЕрдм рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ heap.rs рдореЗрдВ pub use allocator::*; ред рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ Alloc рдХреЗ рд▓рд┐рдП rustdoc рдкреГрд╖реНрда рдкрд░ рд╕реВрдЪреАрдмрджреНрдз impl рдореЗрдВ Heap рдореИрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛ alloc::allocator::Alloc ред

рдмрд╛рдХреА рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрд╛ред рдореИрдВ рдПрдХ рдирдП рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдХреЛрдбрд┐рдВрдЧ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдвреЗрд░ рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рд╡рд░реНрд╖реЛрдВ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЗ FreeType, рдПрдХ C рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рд╣реИрдВред

рдЬрдм рдпрд╣ рдЖрдмрдВрдЯрд┐рдд рд╣реЛрддрд╛ рд╣реИ :: heap :: рдЖрдмрдВрдЯрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдмрд┐рдирд╛ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ OOM рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдЫреЛрдбрд╝рддрд╛ рд╣реИред

рдЗрд╕рдиреЗ рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рджрд┐рдпрд╛ред рдкреЙрдЗрдВрдЯрд░ рдЬреЛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╡рд╣ рдПрдХ рд╢реВрдиреНрдп рдкреЙрдЗрдВрдЯрд░ рд╣реЛ рд╕рдХрддрд╛ рдерд╛ рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдвреЗрд░ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рд╛ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореБрдЭреЗ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реИ рдХрд┐ рдпрд╣ Result рдмрджрд▓ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рд▓реЛрдЧ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рди рднреВрд▓реЗрдВред

рдУрд╣ рдареАрдХ рд╣реИ, рд╢рд╛рдпрдж рдлреНрд░реА рдЯрд╛рдЗрдк рдПрдХ рд╢реВрдиреНрдп рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рдерд╛, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред рд╡реИрд╕реЗ рднреА, рд╣рд╛рдВ, рд░рд┐рдЬрд▓реНрдЯ рд▓реМрдЯрд╛рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред

# 30170 рдФрд░ # 43097 рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдУрдПрд╕ рдПрдХреНрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд░реВрдк рд╕реЗ рдмрдбрд╝реЗ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЛрднрд┐рдд рд╣реВрдВ, рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрд░реЗрдЦрдг рдХрд╛ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ = = 1 << 32 ред

рдЗрд╕ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдЖрд╕рд╛рди рддрд░реАрдХреЗ: рдмрджрд▓реЗрдВ Layout рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрд╛рдХрд┐ align рдПрдХ рд╕реЗ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ u32 рдПрдХ рдХреЗ рдмрдЬрд╛рдп usize ред

@alexcrichton рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ? рдХреНрдпрд╛ рдореБрдЭреЗ рд╕рд┐рд░реНрдл рдПрдХ рдкреАрдЖрд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ?

@pnkfelix Layout::from_size_align рдЕрднреА рднреА usize рд▓рдЧреЗрдЧрд╛ рдФрд░ u32 рдУрд╡рд░рдлрд╝реНрд▓реЛ рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдПрдЧрд╛, рд╣реИ рдирд╛?

@SimonSapin рдпрд╣ usize рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реИ, рдЕрдЧрд░ рдПрдХ рд╕реНрдереИрддрд┐рдХ рдкреВрд░реНрд╡ рд╢рд░реНрдд рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдореВрд▓реНрдп> = 1 << 32 рдкрд╛рд╕ рдХрд░рдирд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ?

рдФрд░ рдЕрдЧрд░ рдЬрд╡рд╛рдм "рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдЖрдмрдВрдЯрдХ рдПрдХ рд╕рдВрд░реЗрдЦрдг> = 1 << 32 " рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдпрдерд╛рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рдореЗрд░реЗ рд╕реБрдЭрд╛рд╡ рдХреА рдЕрд╡рд╣реЗрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░реЗ рд╕реБрдЭрд╛рд╡ рдХреА рдмрд╛рдд рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ "+1" рд╣реИ

рдХреНрдпреЛрдВрдХрд┐ std::mem::align_of usize рд▓реМрдЯрддреЗ рд╣реИрдВ

@SimonSapin рдЖрд╣, рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рд╕реНрдерд┐рд░ рдПрдкреАрдЖрдИ рдХреА ... рдЖрд╣ред

@pnkfelix 1 << 32 рд╕реАрдорд┐рдд рд╣реЛрдирд╛ рдореБрдЭреЗ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ!

@rfcbot fcp рдорд░реНрдЬ

рдареАрдХ рд╣реИ, рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЕрднреА рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рд╕реЗрдВрдХрдирд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдмрд╛рдж рд╕реЗ рдорд╛рдирдХ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреА рд╣реИред рдореИрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд░реВрдврд╝рд┐рд╡рд╛рджреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреЗрд╢рдХрд╢ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░реВрдБрдЧрд╛, рдЕрд░реНрдерд╛рддреН рдХреЗрд╡рд▓ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдирд╛:

pub struct Layout { /* ... */ }

extern {
    pub type void;
}

impl Layout {
    pub fn from_size_align(size: usize, align: usize) -> Option<Layout>;
    pub unsafe fn from_size_align_unchecked(size: usize, align: usize) -> Layout;

    pub fn size(&self) -> usize;
    pub fn align(&self) -> usize;
}

pub unsafe trait Alloc {
    unsafe fn alloc(&mut self, layout: Layout) -> *mut void;
    unsafe fn alloc_zeroed(&mut self, layout: Layout) -> *mut void;
    unsafe fn dealloc(&mut self, ptr: *mut void, layout: Layout);

    // all other methods are default and unstable
}

/// The global default allocator
pub struct Heap;

impl Alloc for Heap {
    // ...
}

impl<'a> Alloc for &'a Heap {
    // ...
}

/// The "system" allocator
pub struct System;

impl Alloc for System {
    // ...
}

impl<'a> Alloc for &'a System {
    // ...
}

рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡

pub struct Layout { /* ... */ }

impl Layout {
    pub fn from_size_align(size: usize, align: usize) -> Option<Layout>;
    pub unsafe fn from_size_align_unchecked(size: usize, align: usize) -> Layout;

    pub fn size(&self) -> usize;
    pub fn align(&self) -> usize;
}

// renamed from AllocErr today
pub struct Error {
    // ...
}

impl Error {
    pub fn oom() -> Self;
}

pub unsafe trait Alloc {
    unsafe fn alloc(&mut self, layout: Layout) -> Result<*mut u8, Error>;
    unsafe fn dealloc(&mut self, ptr: *mut u8, layout: Layout);

    // all other methods are default and unstable
}

/// The global default allocator
pub struct Heap;

impl Alloc for Heap {
    // ...
}

impl<'a> Alloc for &'a Heap {
    // ...
}

/// The "system" allocator
pub struct System;

impl Alloc for System {
    // ...
}

impl<'a> Alloc for &'a System {
    // ...
}

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ:

  • рдХреЗрд╡рд▓ alloc , alloc_zeroed , рдФрд░ dealloc рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рдЕрднреА рдХреЗ рд▓рд┐рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдЬ рдХреЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рджрдмрд╛рд╡ рд╡рд╛рд▓реЗ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдХрд╕реНрдЯрдо рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
  • рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ Error рдкреНрд░рдХрд╛рд░ рдирд┐рдХрд╛рд▓реЗрдВред
  • рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ u8 рдкреНрд░рдХрд╛рд░ рдХреЛ void рдмрджрд▓реЗрдВ
  • Layout рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЫреАрди рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╕рдВрд╕реНрдХрд░рдгред

рдЕрднреА рднреА рдЦреБрд▓реЗ рдкреНрд░рд╢реНрди рд╣реИрдВ рдЬреИрд╕реЗ dealloc рдФрд░ рд╕рдВрд░реЗрдЦрдг (рд╕рдЯреАрдХ рд╕рдВрд░реЗрдЦрдг? рддрдирд╛рд╡? рдЕрдирд┐рд╢реНрдЪрд┐рдд?) рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ FCP рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдПрдХ рдПрдкреАрдЖрдИ- рдмреНрд░реЗрдХрд┐рдВрдЧ рдЪреЗрдВрдЬред

+1 рдХреБрдЫ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП!

AllocErr рд╕реЗ Error рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рдмрдирд╛рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ Unsupported рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ? рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдкрд░ рдЕрдзрд┐рдХ рдЪреЛрдЯ рдкрд╣реБрдБрдЪрд╛рдиреЗ рдХреЗ рдЬреЛрдЦрд┐рдо рдкрд░ рдореИрдВ рдмрд╣реБрдд рдХреБрдЫ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ # 44557 рдЕрднреА рднреА рдПрдХ рдореБрджреНрджрд╛ рд╣реИред

Layout

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ Layout рд╕реЗ рдХреБрдЫ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдЯрд╛рдП рдЧрдП, рдпрд╛ рдЕрд╕реНрдерд┐рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджрд┐рдП рдЧрдП рд▓реЛрдЧреЛрдВ рдХрд╛ рдорддрд▓рдм рд╣реИ?

impl Error {
    pub fn oom() -> Self;
}

рдХреНрдпрд╛ рдпрд╣ рдЖрдЬ AllocErr::Exhausted рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП Layout рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп @alexcrichton рдиреЗ рдЗрд╕реЗ рдорд░реНрдЬ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ рд╣реИред рдЕрдЧрд▓реЗ рдЪрд░рдг рдХреА рд╕рдореАрдХреНрд╖рд╛ рдмрд╛рдХреА рдЯреИрдЧ рдЯреАрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рдХреА рдЧрдИ рд╣реИ:

  • [x] @ рдмрд░реНрдЯрд╕реБрд╢реА
  • [x] @ рдХрд┐рдореБрдВрдбреА
  • [x] @alexcrichton
  • [x] @ рдиреНрдпреВрдЯрди
  • [x] @cramertj
  • [x] @dtolnay
  • [x] @ рд╣реЗрдбреНрдбреА
  • [x] @ рдореБрдиреЛрдордХреЛрддреНрд╕рдХрд┐рд╕
  • [x] @nrc
  • [x] @pnkfelix
  • [x] @sfackler
  • [x] @withoutboats

рдЪрд┐рдВрддрд╛рдУрдВ:

рдПрдХ рдмрд╛рд░ рдЬрдм рдпреЗ рд╕рдореАрдХреНрд╖рдХ рдЖрдо рд╕рд╣рдорддрд┐ рдкрд░ рдкрд╣реБрдВрдЪ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрдкрдиреА рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдЕрд╡рдзрд┐ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рдореБрджреНрджреЗ рдкрд░ рдирд╣реАрдВ рдЙрдард╛рдП рдЧрдП рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдПрдХ рдмрдбрд╝рд╛ рдореБрджреНрджрд╛ рдЙрдард╛рдПрдВ!

рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп рдореБрдЭреЗ рдХреНрдпрд╛ рдЯреИрдЧ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдХрд╛рдо рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрддреНрд╕рд╛рд╣рд┐рдд рд╣реВрдВ!

рдПрдХ рдкреНрд░рд╢реНрди: рдЙрдкрд░реЛрдХреНрдд рд╕реВрддреНрд░ рдореЗрдВ, @joshlf рдФрд░ @emon2314 рдиреЗ Alloc рдФрд░ Dealloc рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдЙрдард╛рдИ , рдЬрд┐рд╕рдореЗрдВ alloc рдХреБрдЫ рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди dealloc рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП Dealloc рдкреНрд░рдХрд╛рд░ рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреНрд░рд╢реНрди рдХрднреА рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛? рджреЛ рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рдХреНрдпрд╛ рдиреБрдХрд╕рд╛рди рд╣реИрдВ?

@joshlf

рдХреНрдпрд╛ рдпрд╣ рдЕрд╕рдорд░реНрдерд┐рдд рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ?

рд╣рд╛рдВ рдФрд░ рдирд╣реАрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдСрдкрд░реЗрд╢рди рдХреЛ рддреБрд░рдВрдд рд╕реНрдерд┐рд░ рдЬрдВрдЧ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛

рдХреНрдпрд╛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдЯрд╛рдП рдЧрдП, рдпрд╛ рдЕрд╕реНрдерд┐рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджрд┐рдП рдЧрдП рд▓реЛрдЧреЛрдВ рдХрд╛ рдорддрд▓рдм рд╣реИ?

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ! рдлрд┐рд░ рднреА рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рд╕реНрдерд┐рд░ рдПрдкреАрдЖрдИ рд╕рддрд╣ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╣рдо рдЕрдиреНрдп рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рдЕрд╕реНрдерд┐рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдордп рдХреЗ рд╕рд╛рде рд╣рдо рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░реВрдврд╝рд┐рд╡рд╛рджреА рдХреЗ рд░реВрдк рдореЗрдВ рд╢реБрд░реВ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред


@SimonSapin

рдХреНрдпрд╛ рдпрд╣ рдЖрдЬ рдХреЗ AllocErr :: рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИ? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рд▓реЗрдЖрдЙрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдЕрд╣рд╛ рдЕрдЪреНрдЫреА рдмрд╛рдд! рдЕрдЧрд░ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЬрд░реВрд░рдд рд╣реИ, рддреЛ рдореИрдВ Error рдПрдХ рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд▓реЗрдЖрдЙрдЯ-рд▓реЗрдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЕрд╕реНрдерд┐рд░ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд┐рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛ рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЗрдЖрдЙрдЯ-рд╕рдВрд░рдХреНрд╖рдг Error рдкрд╣рд▓реЗ рдкрд╛рд╕ рдореЗрдВ рд╕реНрдерд┐рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?


@cramertj

рдореИрдВрдиреЗ рдЕрднреА рддрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╢реНрди / рдЪрд┐рдВрддрд╛ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрд╛ рдерд╛ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕рд╕реЗ рдЪреВрдХ рдЧрдпрд╛ рдерд╛!), рд▓реЗрдХрд┐рди рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦреВрдВрдЧрд╛ред рджреЛ рд▓рдХреНрд╖рдг рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╕реЗ рджреЛрдЧреБрдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Alloc + Dealloc рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдпреЛрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрдиреНрдп рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕реВрдЪрдирд╛ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

@cramertj @alexcrichton

рдореИрдВрдиреЗ рдЕрднреА рддрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╢реНрди / рдЪрд┐рдВрддрд╛ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрд╛ рдерд╛ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕рд╕реЗ рдЪреВрдХ рдЧрдпрд╛ рдерд╛!), рд▓реЗрдХрд┐рди рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦреВрдВрдЧрд╛ред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рдЭрд▓рдХ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ: Box ред Box<T, A: Alloc> , Alloc рдХреА рдореМрдЬреВрджрд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдХрдо рд╕реЗ рдХрдо рджреЛ рд╢рдмреНрдж рдмрдбрд╝реЗ (рд╕реВрдЪрдХ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ рдФрд░ Alloc рдмрд╣реБрдд рдХрдо рд╕реЗ рдХрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) ) рд╡реИрд╢реНрд╡рд┐рдХ рд╕рд┐рдВрдЧрд▓реЗрдЯреНрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдЫреЛрдбрд╝рдХрд░ (рдЬрд┐рд╕реЗ ZST рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдореМрд▓рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реНрдерд╛рди рдореЗрдВ рдПрдХ 2x (рдпрд╛ рдЕрдзрд┐рдХ) рдмреНрд▓реВрдк рдореЗрд░реЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

@alexcrichton

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдм рд╕рднреА рдХреЛ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ Alloc + Dealloc рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛

рд╣рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

trait Allocator: Alloc + Dealloc {}
impl<T> Allocator for T where T: Alloc + Dealloc {}

рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЖрдо рдФрд░ рдореМрд▓рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реНрдерд╛рди рдореЗрдВ рдПрдХ 2x (рдпрд╛ рдЕрдзрд┐рдХ) рдмреНрд▓реВрдкрдЕрдк

рдХреЗрд╡рд▓ рдЬрдм рдЖрдк рдПрдХ рдХрд╕реНрдЯрдо рдЖрд╡рдВрдЯрдирдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛-рд╡реИрд╢реНрд╡рд┐рдХ рдирд╣реАрдВ рд╣реИред std::heap::Heap (рдбрд┐рдлрд╝реЙрд▓реНрдЯ) рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рд╣реИред

рдпрд╛ рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЗрдЖрдЙрдЯ-рдкреНрд░реЛрдЯреЗрдХреНрд╢рди рдПрд░рд░ рдХреЛ рдкрд╣рд▓реЗ рдкрд╛рд╕ рдореЗрдВ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

@alexcrichton рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкреНрд░рдердо рдкрд╛рд╕ рдЖрдЦрд┐рд░ рдХреНрдпреЛрдВ рд╣реИред Vec рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдЕрдзрд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП https://crates.io/crates/jemallocator рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ

рдкреВрд░реА рдЪреАрдЬрд╝ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдХреНрдпрд╛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдХреЗрд╡рд▓ рдЬрдм рдЖрдк рдПрдХ рдХрд╕реНрдЯрдо рдЖрд╡рдВрдЯрдирдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛-рд╡реИрд╢реНрд╡рд┐рдХ рдирд╣реАрдВ рд╣реИред std :: heap :: рдвреЗрд░ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ) рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдПрд▓реЛрдХреЗрдЯрд░ рд╣реЛрдиреЗ рдХреЗ рдкреНрд░рд╛рдердорд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд╣реАрдВ? рдПрдХ рдкреЗрдбрд╝ рдХреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд░рд▓ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ:

struct Node<T, A: Alloc> {
    t: T,
    left: Option<Box<Node<T, A>>>,
    right: Option<Box<Node<T, A>>>,
}

1-рд╢рдмреНрдж Alloc рд▓реЛрдЧреЛрдВ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдПрдХ рдкреЗрдбрд╝ рдореЗрдВ ZST Alloc рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрдХрд╛рд░ рдореЗрдВ ~ 1.7x рдмреНрд▓реВрдкрдЕрдк рд╣реЛрдЧрд╛ред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдмреБрд░рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди Alloc рд╣реЛрдиреЗ рдХрд╛ рд╕рдВрдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╣реИрдВред

@cramertj

рд╣рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

рд╣рдо рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЙрдкрдирд╛рдо рд░рдЦрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ :) https://github.com/rust-lang/rust/issues/41517

@glaebhoerl рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рд╕реНрдерд┐рд░реАрдХрд░рдг рдЕрднреА рднреА рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрднреА рддрдХ рдХреЛрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо Allocator рдореИрдиреНрдпреБрдЕрд▓ рдЗрдореНрдкреНрд▓реЙрдИрдЬрд╝ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЖрдиреЗ-рдЬрд╛рдиреЗ рдкрд░ рдкреАрдЫреЗ-рдкреАрдЫреЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдПрд▓рд┐рдпрдЯреЗрд╕ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;)

@joshlf

рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдореМрд▓рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реНрдерд╛рди рдореЗрдВ рдПрдХ 2x (рдпрд╛ рдЕрдзрд┐рдХ) рдмреНрд▓реВрдк рдореЗрд░реЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрдЬ рдХреЗрд╡рд▓ рдПрдХ рд╢реВрдиреНрдп-рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдпрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рдмрдбрд╝реЗ, рд╕рд╣реА рд╣реИрдВ? рдХреНрдпрд╛ рд╕рдВрднрд╡ рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреБрдЫ рдкреЙрдЗрдВрдЯрд░-рдЖрдХрд╛рд░-рдкреНрд░рдХрд╛рд░ рд╢реВрдиреНрдп рдЖрдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ? (рдпрд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛?)


@cramertj

рд╣рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ! рд╣рдордиреЗ рдлрд┐рд░ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рддреАрди рддрдХ рд▓реЗ рд▓рд┐рдпрд╛ рд╣реИред рдЕрддреАрдд рдореЗрдВ рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╣рд╛рди рдЕрдиреБрднрд╡ рдирд╣реАрдВ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Box<Both> Box<OnlyOneTrait> рдХреЛ рдХрд╛рд╕реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕реБрдЪрд╛рд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред


@SimonSapin

рдкреВрд░реА рдЪреАрдЬрд╝ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдХреНрдпрд╛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред рдореИрдВ рдкреВрд░реА рдЫреЛрдЯреА рд╕реЗ рдЫреЛрдЯреА рдмрд╛рдд рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рддрд╛рдХрд┐ рдХрдо рдмрд╣рд╕ рд╣реЛред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрдЬ рдХреЗрд╡рд▓ рдПрдХ рд╢реВрдиреНрдп-рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдпрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рдмрдбрд╝реЗ, рд╕рд╣реА рд╣реИрдВ? рдХреНрдпрд╛ рд╕рдВрднрд╡ рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреБрдЫ рдкреЙрдЗрдВрдЯрд░-рдЖрдХрд╛рд░-рдкреНрд░рдХрд╛рд░ рд╢реВрдиреНрдп рдЖрдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ? (рдпрд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛?)

рд╣рд╛рдБ, рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╕реЗ рдЖрдмрдВрдЯрд┐рдд рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЖрдпрд╛ рд╣реИ (рдЬреИрд╕реЗ, рдЗрдирд▓рд╛рдЗрди рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЯрд╛рдЗрдк рдЬрд╛рдирдХрд╛рд░реА, рд░рдирдЯрд╛рдЗрдо рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВред

рдбреАрд▓рдХреНрд▓реЛрдХреЗрдЯ рдкрд░ рд╕рдВрд░реЗрдЦрдг рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдЖрдЧреЗ рджреЛ рддрд░реАрдХреЗ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ:

  • рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд┐рд░ (рдбреАрд▓рд▓реЙрдХреЗрдЯ рдкрд░ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде)ред рдЬрдм рддрдХ Layout рд╢рд╛рдорд┐рд▓ рди рд╣реЛ, рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдХрд╛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рджреЗрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдХрдареЛрд░ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде Vec рдпрд╛ Box рдпрд╛ String рдпрд╛ рдЕрдиреНрдп std рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдбреЙрди) 'рдмреЙрдХреНрд╕рд┐рдВрдЧ рдПрд▓реАрдореЗрдВрдЯ рдХреЛ рдХреИрд╢реЗ рд▓рд╛рдЗрди рдХреЛ рд╕реНрдЯреНрд░реИрдбрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ), рдмрд┐рдирд╛ рдбрд┐рдХреЙрдиреНрд╕реНрдЯреНрд░рдХреНрдЯ рдХрд┐рдП рдФрд░ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдбреАрд▓ рдХрд┐рдпрд╛ (рдЬреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реЛрддрд╛)ред рдХреБрдЫ рдФрд░ рдЬреЛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдПрдХ Vec simd рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднрд░рдирд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рджреВрд░ рдХрд░рдирд╛ рд╣реИред

  • рдбреАрд▓рд▓реЙрдХреЗрдЯ рдкрд░ рд╕рдВрд░реЗрдЦрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ HeapAlloc -рдмреЗрдб alloc_system рд╕реЗ рдЫреЛрдЯреЗ-рдЖрд╡рдВрдЯрди рдЕрдиреБрдХреВрд▓рди рдХреЛ рд╣рдЯрд╛ рджреЗрдВред рд╣рдореЗрд╢рд╛ рд╕рдВрд░реЗрдЦрдг рдХреА рджреБрдХрд╛рдиред @alexcrichton , рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЙрд╕ рдХреЛрдб рдХреЛ рдХрд┐рдпрд╛ рд╣реИ, рдХреНрдпрд╛ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдХреНрдпреЛрдВ рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛? рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╕рдмреВрдд рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рддреНрд░рд╛ рдореЗрдВ рдореЗрдореЛрд░реА рдмрдЪрд╛рддрд╛ рд╣реИ? (рдорд╛рдЗрдХреНрд░реЛрдмреИрдирдЪрд░реНрдЪ рдХреЗ рд╕рд╛рде рдЖрд╡рдВрдЯрди рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд░рд┐рдгрд╛рдо рдпрд╛ рддреЛ рдмрд╛рд╣рд░ рдЖрдирд╛ рд╕рдВрднрд╡ рд╣реИ - рдЬрдм рддрдХ рдХрд┐ HeapAlloc рд╡реИрд╕реЗ рднреА рдЖрдХрд╛рд░ рдХреЛ рдЧреЛрд▓ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред)

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╡реНрдпрд╛рдкрд╛рд░ рд╣реИ; рдореЗрдореЛрд░реА рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рднрд╛рд╡ рдЖрд╡реЗрджрди рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдЕрддреНрдпрдзрд┐рдХ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛, рдФрд░ рдЬреЛ рдПрдХ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╕реНрдЯ рдлрд╛рдЗрди (рдЯреАрдПрдо) рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред Alloc рдбреЙрдХреНрд╕ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддреЗ рд╣реБрдП:

рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд▓реЗрдЖрдЙрдЯ рдПрдХ рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред
рдПрдХ рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ рдХреЛ "рдлрд┐рдЯ" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ (рдпрд╛
рд╕рдорд╛рди рд░реВрдк рд╕реЗ, рдПрдХ рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ рдХреЛ рдПрдХ рд▓реЗрдЖрдЙрдЯ "рдлрд┐рдЯ" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╣реИ рдХрд┐
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рд╢рд░реНрддреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

  1. рдмреНрд▓реЙрдХ рдХрд╛ рд╢реБрд░реБрдЖрддреА рдкрддрд╛ layout.align() рд▓рд┐рдП рд╕рдВрд░реЗрдЦрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

  2. рдмреНрд▓реЙрдХ рдХрд╛ рдЖрдХрд╛рд░ [use_min, use_max] рдХреА рд╕реАрдорд╛ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд╣рд╛рдВ:

    • use_min self.usable_size(layout).0 , рдФрд░

    • use_max рд╡рд╣ рдХреНрд╖рдорддрд╛ рд╣реИ рдЬреЛ рдереА (рдпрд╛ рд░рд╣реА рд╣реЛрдЧреА)
      рдЬрдм (рдЕрдЧрд░) рдмреНрд▓реЙрдХ рдХреЛ рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
      alloc_excess рдпрд╛ realloc_excess ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐:

  • рд▓реЗрдЖрдЙрдЯ рдХрд╛ рдЖрдХрд╛рд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдмреНрд▓реЙрдХ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
    [use_min, use_max] рдХреА рд╕реАрдорд╛ рдореЗрдВ рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ, рдФрд░

  • use_max рдкрд░ рдХрдо-рдмрд╛рдЙрдВрдб рдХреЛ рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреБрдорд╛рдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
    usable_size ред

  • рдЕрдЧрд░ рдПрдХ рд▓реЗрдЖрдЙрдЯ k рдПрдХ рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ ( ptr рджреНрд╡рд╛рд░рд╛ рдЪрд┐рд╣реНрдирд┐рдд)
    рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ a рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрд╛рдиреВрдиреА рд╣реИ
    рдЙрд╕ рд▓реЗрдЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрдВ, рдЕрд░реНрдерд╛рдд a.dealloc(ptr, k); ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдЦрд┐рд░реА рдЧреЛрд▓реАред рдЕрдЧрд░ рдореИрдВ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде рдПрдХ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдЖрд╡рдВрдЯрд┐рдд a , рддреЛ рдпрд╣ рдореБрдЭреЗ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде рдкреБрдирдГрдЖрд╡рдВрдЯрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдиреВрдиреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП b < a рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╡рд╕реНрддреБ рдЬреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдардмрдВрдзрди рдХрд┐рдпрд╛ рд╣реИ a рднреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдардмрдВрдзрди рдХрд┐рдпрд╛ рд╣реИ b , рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рдВрд░реЗрдЦрдг b рд╕рд╛рде рдПрдХ рд▓реЗрдЖрдЙрдЯ рд╕рдВрд░реЗрдЦрд┐рдд a (рдФрд░ рдПрдХ рд╣реА рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде) рдХреЗ рд╕рд╛рде рдПрдХ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдЖрд╡рдВрдЯрд┐рдд рд╡рд╕реНрддреБ рдХреЛ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рд╕рдВрд░реЗрдЦрдг рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ рдФрд░ рдлрд┐рд░ рдХреБрдЫ рдЕрдиреНрдп рдХреЛрдб рдХреЛ рдиреНрдпреВрдирддрдо рд╕рдВрд░реЗрдЦрдг рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рд╕рдВрднрд╡ рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреБрдЫ рдкреЙрдЗрдВрдЯрд░-рдЖрдХрд╛рд░-рдкреНрд░рдХрд╛рд░ рд╢реВрдиреНрдп рдЖрдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ? (рдпрд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛?)

рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ RFC рдерд╛ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдЧрддрддрд╛ рдХреА рдЪрд┐рдВрддрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: https://github.com/rust-lang/rfcs/pull/2040

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Box<Both> Box<OnlyOneTrait> рдХреЛ рдХрд╛рд╕реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕реБрдЪрд╛рд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред

рджреВрд╕рд░реА рдУрд░ рдЙрдкрд╣рд╛рд╕ рдХреА рд╡рд╕реНрддреБ рд╡рд╕реНрддреБ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд░реВрдк рд╕реЗ рд╡рд╛рдВрдЫрдиреАрдп рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ, рдФрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрд░ рдкреНрд░рдпрд╛рд╕ / рдмреИрдВрдбрд╡рд┐рдбреНрде / рдЗрдЪреНрдЫрд╛рд╢рдХреНрддрд┐ рдХрд╛ рдкреНрд░рд╢реНрди рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрдХ рдзрд╛рдЧрд╛ рдерд╛: https://internals.rust-lang.org/t/trait-upcasting/5970

@ рдЗрд░реБрдбрд╛ рдореИрдВ рд╡рд╣ рдерд╛ рдЬрд┐рд╕рдиреЗ рдореВрд▓ рд░реВрдк рд╕реЗ alloc_system рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрд╛ рдерд╛ред alexcrichton рдиреЗ рдХреЗрд╡рд▓ <time period> рдХреЗ рдорд╣рд╛рди рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд░рд┐рдлреИрдХреНрдЯрд░реНрд╕ рдХреЗ рджреМрд░рд╛рди рдЗрд╕реЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреБрдорд╛рдпрд╛ред

рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЖрдк рдЙрд╕реА рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде рдбреАрд▓ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдиреЗ рджрд┐рдП рдЧрдП рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рд╣реЛред рднрд▓реЗ рд╣реА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХрд╛ рджрд╛рд╡рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рд╡рд░реНрддрдорд╛рди рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рддрдм рддрдХ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ alloc_system рдмрджрд▓ рди рдЬрд╛рдПред

рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдЖрд╡рдВрдЯрди рд╣рдореЗрд╢рд╛ MEMORY_ALLOCATION_ALIGNMENT рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдЙрд╕ рдЖрдХрд╛рд░ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдиреЗ рдЙрдиреНрд╣реЗрдВ рдмрд╛рдЗрдЯ рдХреЗ рд╕рд╛рде рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдерд╛)ред MEMORY_ALLOCATION_ALIGNMENT 32 рдкрд░ 8 рд╣реИ рдФрд░ 16 рдкрд░ 64 рдмрд┐рдЯ рд╣реИред Overaligned рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрд░реЗрдЦрдг рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ MEMORY_ALLOCATION_ALIGNMENT , рднреВрдорд┐ рдХреЗ рдКрдкрд░ рдХреА рд╡рдЬрд╣ рд╕реЗ alloc_system рд▓рдЧрд╛рддрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрд░реЗрдЦрдг рдХреА рд░рд╛рд╢рд┐ рд╣реИ, рддреЛ рдПрдХ 64byte рдЧрдардмрдВрдзрди рдЖрд╡рдВрдЯрди рднреВрдорд┐ рдХреЗ рдКрдкрд░ рдХреЗ 64 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрдЧрд╛ред

рдпрджрд┐ рд╣рдордиреЗ рдЙрд╕ рдЖрд╡рдВрдЯрди рдХреЛ рд╕рднреА рдЖрдмрдВрдЯрди рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИ (рдЬреЛ рдЙрд╕реА рдЖрд╡рдВрдЯрди рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓реЗрдЧрд╛ рдЬрд┐рд╕реЗ рдЖрдк рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╕рдордп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ), рддреЛ рдЕрдзрд┐рдХ рдЖрд╡рдВрдЯрди рдУрд╡рд░рд╣реЗрдб рд╣реЛрдВрдЧреЗред рдЖрд╡рдВрдЯрди рдЬрд┐рдирдХреЗ рд╕рдВрд░реЗрдЦрдг MEMORY_ALLOCATION_ALIGNMENT рд╕рдорд╛рди рд╣реИрдВ, MEMORY_ALLOCATION_ALIGNMENT рдмрд╛рдЗрдЯреНрд╕ рдХреА рдирд┐рд░рдВрддрд░ рдУрд╡рд░рд╣реЗрдб рднреБрдЧрддрдирд╛ рд╣реЛрдЧрд╛ред рдЖрд╡рдВрдЯрди рдЬрд┐рдирдХрд╛ рд╕рдВрд░реЗрдЦрдг MEMORY_ALLOCATION_ALIGNMENT рд╕реЗ рдХрдо рд╣реИ, MEMORY_ALLOCATION_ALIGNMENT рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдПрдХ рдУрд╡рд░рд╣реЗрдб рд▓рдЧрднрдЧ рдЖрдзрд╛ рд╕рдордп рднреБрдЧрддрдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдмрдВрдЯрди рдХрд╛ рдЖрдХрд╛рд░ MEMORY_ALLOCATION_ALIGNMENT рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ рдпрд╛ рдЖрдмрдВрдЯрди рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рдпрд╛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рдХреЛрдИ рдЙрдкрд░рд┐ рдирд╣реАрдВ рд╣реИ, рдЕрдиреНрдпрдерд╛ рд╣реИред 99.99% рдЖрд╡рдВрдЯрди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдУрд╡рд░рд▓реИрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпрд╛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреА рдЖрд╡рдВрдЯрди рдкрд░ рдЙрд╕ рддрд░рд╣ рдХрд╛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

@ruuda

рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдЖрдЬ alloc_system рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рдЕрдиреНрдп рдХрдВрдЯреЗрдирд░ рдореЗрдВ Vec рдЬреИрд╕реЗ рдЖрд╡рдВрдЯрди рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХреЛ рддреНрдпрд╛рдЧрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╕реЗ рдмрдбрд╝рд╛ рд▓рд╛рдн рд╣реИред AFAIK рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде рд╣рдореЗрд╢рд╛ рдкреИрдбрд┐рдВрдЧ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдбреАрд▓рдХреНрд▓реЗрд╢рди рдкрд░ рд╕рдВрд░реЗрдЦрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

@joshlf

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд┐рдкреНрдкрдгреА рдЧрд▓рдд рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ alloc_system рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдПрдХ рд╣реА рд╕рдВрд░реЗрдЦрдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрд╡рдВрдЯрди рдкрд░ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

99.99% рдЖрд╡рдВрдЯрди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдУрд╡рд░рд▓реИрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпрд╛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреА рдЖрд╡рдВрдЯрди рдкрд░ рдЙрд╕ рддрд░рд╣ рдХрд╛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдУрд╡рд░рд╣реЗрдб рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдФрд░ рдореЗрдореЛрд░реА рдпрд╛ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдореЗрд░рд╛ рд╕рдВрджреЗрд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╛ рддреЛ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЫреЛрдЯреА рд╕реА рдЕрд▓реНрдкрд╕рдВрдЦреНрдпрдХ рд╕реНрдореГрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдкрд░рд╡рд╛рд╣ рд╣реИ, рдФрд░ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрди рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдмрд░реНрджрд╛рд╢реНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдПрдХ рдЕрдиреНрдп рдЫреЛрдЯреЗ рдЕрд▓реНрдкрд╕рдВрдЦреНрдпрдХ рдХреЛ рд╕рдВрд░реЗрдЦрдг рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

@alexcrichton

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд┐рдкреНрдкрдгреА рдЧрд▓рдд рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ alloc_system рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдЙрд╕реА рд╕рдВрд░реЗрдЦрдг рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ рдЬреЛ рдЖрд╡рдВрдЯрди рдкрд░ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ alloc_system рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╢рд╛рдпрдж рд╣рдореЗрдВ Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП)?


@ retep998

рдЕрдЧрд░ рдореИрдВ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрдврд╝ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рдХреНрдпрд╛ рдпрд╣ рд╕рдВрд░реЗрдЦрдг рдУрд╡рд░рд╣реЗрдб рд╕рднреА рдЖрд╡рдВрдЯрди рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ рдЪрд╛рд╣реЗ рд╣рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рдореИрдВ 64 рдмрд╛рдЗрдЯ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде 64 рдмрд╛рдЗрдЯ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдореИрдВ 64 рдмрд╛рдЗрдЯ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде рднреА рдирд┐рдкрдЯрддрд╛ рд╣реВрдВ, рддреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдУрд╡рд░рд╣реЗрдб рдЕрднреА рднреА рдореМрдЬреВрдж рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрд░реЗрдЦрдг рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрдбрд╝реЗ-рд╕реЗ-рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд░реЗрдЦрдг рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред

@joshlf рд╡рд░реНрддрдорд╛рди рдореЗрдВ alloc_system рдХрд╛рд░рдг рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдУрд╡рд░рд╣реЗрдб рдмрдбрд╝реЗ-рд╕реЗ-рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд░реЗрдЦрдг рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реИред рдпрджрд┐ рдЖрдкрдХрд╛ рд╕рдВрд░реЗрдЦрдг MEMORY_ALLOCATION_ALIGNMENT рд╕реЗ рдХрдо рдпрд╛ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ alloc_system рд╡рдЬрд╣ рд╕реЗ рдХреЛрдИ рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рд╣рдордиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде рдбреАрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛, рддреЛ рдУрд╡рд░рд╣реЗрдб рд╕рдВрд░реЗрдЦрдг рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд▓рдЧрднрдЧ рд╕рднреА рдЖрд╡рдВрдЯрди рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ред

рдУрд╣ рд╕рдордЭрд╛; рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рд╣реАрдк рдФрд░ рд╣реАрдк рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрд▓реЛрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ? рдХрд┐рди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрди рдмрдирд╛рдореЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рдмрдирд╛рдо рджреВрд╕рд░реЗ рдХрд╛?

рдХреНрдпрд╛ рдпрд╣ рдкрд╣рд▓рд╛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдкреАрдЖрдИ рд╣реИ рдЬрд┐рд╕рдореЗрдВ *mut u8 рдХрд╛ рдЕрд░реНрде "рдЬреЛ рдХреБрдЫ рднреА рд╕реВрдЪрдХ" рд╣реЛрдЧрд╛? рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ :: from_raw_parts рд▓реЗрдХрд┐рди рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдореИрдВ *mut u8 рдЕрд░реНрде рдирд╣реАрдВ рд╣реВрдВ, "рдЬреЛ рдХреБрдЫ рднреА" рдХрд╛ рд╕реВрдЪрдХ рд╣реИ - рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реА рднреА рдмреЗрд╣рддрд░ рдХрд░рддрд╛ рд╣реИред рдХреБрдЫ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдХреНрдпрд╛ рд╣реИрдВ? рд╢рд╛рдпрдж рдЕрдкрд╛рд░рджрд░реНрд╢реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рдЕрдзрд┐рдХ рд╕рд╛рд░реНрдердХ рд╣реЛрдЧрд╛ред

@rfcbot рдХреА рдЪрд┐рдВрддрд╛ * mut u8

@dtolnay Alloc for Heap "рдорд╛рдирдХ" рдХреА рддрд░рд╣ рд╣реИ рдФрд░ Alloc for &Heap Write for &T рдЬрд╣рд╛рдБ рдЧреБрдг рдХреЗ рд▓рд┐рдП &mut self рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ Heap рдФрд░ System рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░ рдереНрд░реЗрдбрд╕реЗрдлрд╝ рд╣реИрдВ рдФрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐, #[global_allocator] рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╡рд╣ рдЬрд┐рд╕ рд╕реНрдЯреИрдЯрд┐рдХ рд╕реЗ рдЬреБрдбрд╝реА рд╣реЛ, рдЬрд┐рд╕рдореЗрдВ T , Alloc for &T ред (рдЙрд░реНрдл рд╕рднреА рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдереНрд░реЗрдбрд╕реЗрдлрд╝ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП)

*mut u8 рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ *mut () рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдпрд╣рд╛рдБ "рдпрд╣ рдЕрдзрд┐рдХрд╛рд░" рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВред

*mut u8 рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдмрд╛рдЗрдЯ рдСрдлрд╝рд╕реЗрдЯ рдХреЗ рд╕рд╛рде .offset рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

*mut u8 рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ *mut () рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб "рдпрд╣ рдЕрдзрд┐рдХрд╛рд░" рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВред

рдпрджрд┐ рд╣рдо рдПрдХ рд╕реНрдерд┐рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ *mut u8 рд╕рд╛рде рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рд╣рдо рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд▓реЙрдХ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ "рдпрд╣ рдЕрдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ" рдХрд╛ рдореМрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, *mut () рдореБрдЭреЗ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЦрддрд░рдирд╛рдХ рд▓рдЧрддрд╛ рд╣реИ рдЬрдм рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ RFC 2040 рдЬреИрд╕рд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддреЗ рд╣реИрдВред

*mut u8 рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдмрд╛рдЗрдЯ рдСрдлрд╝рд╕реЗрдЯ рдХреЗ рд╕рд╛рде .offsetред

рд╕рдЪ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ let ptr = (foo as *mut u8) рдФрд░ рдлрд┐рд░ рдЕрдкрдиреЗ рдореАрд░рд╛ рдХреЗ рд░рд╛рд╕реНрддреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдкреАрдЖрдИ рдореЗрдВ *mut u8 рд╕рд╛рде рдЪрд┐рдкрдХреЗ рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЗрд░рдгрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдпрджрд┐ рдХреЛрдИ рд╕рдореНрдореЛрд╣рдХ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ (рдЬреЛ рдХрд┐, рдирд┐рд╖реНрдкрдХреНрд╖ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдБ рд╣реИрдВ)ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрднреА рднреА RFC 2040 рдЬреИрд╕рд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ * mut () рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдЦрддрд░рдирд╛рдХ рд▓рдЧрддрд╛ рд╣реИред

рдЕрдиреБрдХреВрд▓рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢рд╛рдпрдж рдХрднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ред рдпрджрд┐ рдРрд╕рд╛ рд╣реБрдЖ рднреА, рддреЛ рдпрд╣ &() рдФрд░ &mut () , рди рдХрд┐ *mut () ред

рдпрджрд┐ RFC 1861 рд▓рд╛рдЧреВ / рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рдХрд░реАрдм рдерд╛, рддреЛ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛:

extern { pub type void; }

pub unsafe trait Alloc {
    unsafe fn alloc(&mut self, layout: Layout) -> Result<*mut void, Error>;
    unsafe fn dealloc(&mut self, ptr: *mut void, layout: Layout);
    // ...
}

рдпрд╣ рд╢рд╛рдпрдж рдмрд╣реБрдд рджреВрд░ рд╣реИ рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣реИ рдирд╛?

@ рдЬреЛрд╢рдлреЗрд▓ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреАрдЖрд░ рджреЗрдЦрд╛ рд╣реИ, рд╢реЗрд╖ рдЕрдЬреНрдЮрд╛рдд DynSized ред

рдХреНрдпрд╛ рдпрд╣ рд╡рд╕реНрддреБрдУрдВ рдХреА рддрд░рд╣ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд╣реИрдХ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛? рдХрд╣реЛ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ Node<T> рдЬреЛ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

struct Node<T> {
   size: u32,
   data: T,
   // followed by `size` bytes
}

рдФрд░ рдПрдХ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░:

struct V {
  a: u32,
  b: bool,
}

рдЕрдм рдореИрдВ рдПрдХрд▓ рдЖрдмрдВрдЯрди рдореЗрдВ a рдЖрдХрд╛рд░ рдХреЗ рддрд╛рд░ рдХреЗ рд╕рд╛рде Node<V> рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдореИрдВ рдЖрдХрд╛рд░ рдХрд╛ рдПрдХ рд╕рдВрд░реЗрдЦрдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ 16 рд╕рдВрд░реЗрдЦрд┐рдд 4 рдФрд░ рдЗрд╕рдореЗрдВ рд╕рдм рдХреБрдЫ рдлрд┐рдЯ рд╣реИ: 4 u32 , V , рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП 7ред рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ V рдХреЗ рдЕрдВрддрд┐рдо рд╕рджрд╕реНрдп рдореЗрдВ рд╕рдВрд░реЗрдЦрдг 1 рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рд╕рдВрд░реЗрдЦрдг 1 рднреА рд╣реЛрддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ C / C ++ рдореЗрдВ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рдХрд╛рд░ рдХреА рд░рдЪрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкреИрдХреНрдб рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрдирд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реА / рд╕реА ++ рдорд╛рдирдХ рдореЗрдВ рдПрдХ рдЫреЗрдж рд╣реИ рдЬреЛ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдЯреВрдЯрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд░рд╕реНрдЯ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ? :-)

Node<V> рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЖрдк рдмрд╣реБрдд рдЕрдзрд┐рдХ рд░рд╛рдЗрдирд░ рдХрдВрдкрд╛рдЗрд▓рд░ рд╣реИрдВред рдпрд╣ рдпреВрдмреА (рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░) рд╣реИ, рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рднреА рдЖрдХрд╛рд░ рдпрд╛ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЬрдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдореБрдХрд╛рдмрд▓реЗ рдЫреЛрдЯреА рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд░реБрд╕реНрдЯ рдЗрд╕ рдзрд╛рд░рдгрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдиреБрдХреВрд▓рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ Node<V> рдСрдмреНрдЬреЗрдХреНрдЯ - рдвреЗрд░ рдкрд░, рдПрдХ рд╕рдВрджрд░реНрдн рдХреЗ рдкреАрдЫреЗ, рдЖрджрд┐ред - рдПрдХ рдЖрдХрд╛рд░ рдФрд░ рд╕рдВрд░реЗрдЦрдг рдорд┐рд▓рд╛рди рд╣реИ рдЬреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИред

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрддреНрддрд░ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдирд╣реАрдВ рд╣реИ: рдореИрдВрдиреЗ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЪрд▓рд╛рдпрд╛ рдФрд░ рдкрд╛рдпрд╛ рдХрд┐, рдХрдо рд╕реЗ рдХрдо рд░рд╕реНрдЯ рдкреНрд▓реЗрдЧреНрд░рд╛рдЙрдВрдб рдкрд░, Node<V> рдХреЛ 12 рдХрд╛ рдЖрдХрд╛рд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ 4 рдХрд╛ рд╕рдВрд░реЗрдЦрдг рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреЗ рдмрд╛рдж Node<V> рдХреЛ рдХрдо рд╕реЗ рдХрдо 12 рдмрд╛рдЗрдЯ рджреНрд╡рд╛рд░рд╛ рдСрдлрд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ data.b рдлрд╝реАрд▓реНрдб рдХреА Node<V> 8 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рднреАрддрд░ рдСрдлрд╕реЗрдЯ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдмрд╛рдЗрдЯреНрд╕ 9-11 рдкреИрдбрд┐рдВрдЧ рдкреАрдЫреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рднрд▓реЗ рд╣реА рдЙрди рдкреИрдбрд┐рдВрдЧ рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ "рдХреБрдЫ рдЕрд░реНрдереЛрдВ рдореЗрдВ" рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдХрдВрдкрд╛рдЗрд▓рд░ рдЙрдиреНрд╣реЗрдВ Node<V> рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдкрд╕рдВрдж рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦрддреЗ рд╣реИрдВ (рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рд▓реЗрдЦрди рд╕рд╣рд┐рдд рдЬрдм рдЖрдк Node<V> рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рд╡рд╣рд╛рдБ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдУрд╡рд░рд░рд╛рдЗрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред

(рдзреНрдпрд╛рди рджреЗрдВ, btw: рдЖрдк рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд░рд╕реНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдкреИрдХ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк _can_ рд░рд╕реНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЯрд╛рдЗрдк рдХреЗ рд▓реЗрдЖрдЙрдЯ рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ (рдкреИрдбрд┐рдВрдЧ рд╣рдЯрд╛рдХрд░) repr(packed) )

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рд░рдЦрдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЙрди рджреЛрдиреЛрдВ рдХреЛ рд╕рдорд╛рди рдЬрдВрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореБрдЭреЗ рд▓рдЧрднрдЧ 100% рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рд╡реИрдз рд╣реИ - рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ Vec рд╣реИред рдЖрдк рдХреБрд▓ рдЖрд╡рдВрдЯрди рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреА рдЬрдЧрд╣ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Layout рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

let node_layout = Layout::new::<Node<V>>();
// NOTE: This is only valid if the node_layout.align() is at least as large as mem::align_of_val("a")!
// NOTE: I'm assuming that the alignment of all strings is the same (since str is unsized, you can't do mem::align_of::<str>())
let padding = node_layout.padding_needed_for(mem::align_of_val("a"));
let total_size = node_layout.size() + padding + 7;
let total_layout = Layout::from_size_align(total_size, node_layout.align()).unwrap();

рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдкрд╕рдВрдж рдЖрдПрдЧрд╛?

#[repr(C)]
struct Node<T> {
   size: u32,
   data: T,
   bytes: [u8; 0],
}

... рддреЛ рдПрдХ рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВ, рдФрд░ slice::from_raw_parts_mut(node.bytes.as_mut_ptr(), size) ?

рд╡рд┐рд╕реНрддреГрдд рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП @joshlf рдзрдиреНрдпрд╡рд╛рдж! рдореЗрд░реЗ usecase рдХреЗ рд▓рд┐рдП TLDR рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ Node<V> 16 repr(packed) ред рдЕрдиреНрдпрдерд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЖрдХрд╛рд░ 19 (12 + 7)ред

@SimonSapin рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ; рдореИ рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдкрдХрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рддрдХ рдХреБрдЫ рднреА рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл

  1. рдЕрд▓реЛрдХреЗрдЯрд░-рдмрд╣реБрд░реВрдкреА рд╕рдВрдЧреНрд░рд╣

    • рдиреЙрди-рдмреНрд▓реЙрдЯреЗрдб рдмреЙрдХреНрд╕ рднреА рдирд╣реАрдВ!

  2. рдкрддрдирд╢реАрд▓ рд╕рдВрдЧреНрд░рд╣

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореМрд▓рд┐рдХ рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдЙрди рдХреЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛: рдореЗрд░реЗ рдкрд╛рд╕ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рдорд╣реАрдиреЛрдВ рд╕реЗ рд░рд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдо рд╕рдордп рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдмрд╛рд░ рдпрд╣ рддрд░реНрдХ рджрд┐рдпрд╛ рд╣реИред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдкрдирд╛ рдорд╛рдорд▓рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрд╣рд╛рдВ рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдХрдо рд╕реЗ рдХрдо рдЙрди рд╕рднреА рдХрд╛ рдкреВрд░рд╛ рд╕рдорд╛рдзрд╛рди рд▓рд┐рдЦреЗрдВ: рдХреЛрдИ рдореБрдЭреЗ рдЧрд▓рдд рд╕рд╛рдмрд┐рдд рдХрд░ рджреЗ рдХрд┐ рдпрд╣ рдХрдареЛрд░ рд╣реЛрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ (рдмрд▓ рдкреНрд░рдпреЛрдЧ рд╕рд╣реА), рд▓рдЪреАрд▓рд╛ , рдФрд░ рд╡рд░реНрддрдорд╛рди рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХред рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╢реАрд░реНрд╖ рдкрд░ рдмрдХреНрд╕реЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рднреА рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВред

рдкреБрди: @SON2314 рдХреА рдЯрд┐рдкреНрдкрдгреА

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдФрд░ @alexcrichton рдХреЗ рдмреАрдЪ рд╕рдВрдШрд░реНрд╖ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕рд╡рд╛рд▓ рдХреБрдЫ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реИ: рдиреНрдпреВрдирддрдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ рдХрд┐рддрдирд╛ рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИ? рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдмрд╣реБрдд рдХрдо рдЙрдкрднреЛрдХреНрддрд╛ Alloc рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдВрдЧреНрд░рд╣ рд╢рд╛рдпрдж Box рдпрд╛ рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ), рдЗрд╕рд▓рд┐рдП рдЕрд╕рд▓реА рд╕рд╡рд╛рд▓ рдпрд╣ рдмрди рдЬрд╛рддрд╛ рд╣реИ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рдЦрд░реАрдж рдХреНрдпрд╛ рдХрд░рддреА рд╣реИ Alloc рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдПрдХрдорд╛рддреНрд░ рдЧрдВрднреАрд░ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдЬреЛ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЖрд╡рдВрдЯрди-рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдХ рд╕рдВрдЧреНрд░рд╣ (рдЬреЛ рд╕рдВрднрд╡рддрдГ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдПрдХ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛) рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рд░реНрдЧ рдкреНрд░рд╢рд╕реНрдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ # 27336 рдкрд░ рдЕрд╡рд░реБрджреНрдз рд╣реИ, рдЬреЛ рдЗрд╕рд╕реЗ рджреВрд░ рд╣реИ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рд╢рд╛рдпрдж рдЕрдиреНрдп рдмрдбрд╝реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рдпрд╛рдж рдЖ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрд╕ рддреНрд╡рд░рд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рд╕реНрдерд┐рд░реАрдХрд░рдг рд╕реЗ рджреВрд░ рд░рд╣рдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рд▓реЙрдХ рдХрд░рдиреЗ рдХреА рдХреАрдордд рдкрд░ рд╕реАрдорд╛рдВрдд рд▓рд╛рдн рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдЙрдк-рд░реВрдк рдореЗрдВ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ ред

@ рдЬреЛрд╢рдлрд╛рдЗрд▓ рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рд╣рдореНрдордо рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рдХреНрдпрд╛ Alloc рдХреЛ рд╕реНрдерд┐рд░ рдХрд┐рдП рдмрд┐рдирд╛ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛? рдпрд╛рдиреА, Alloc рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рдЕрд╕реНрдерд┐рд░ рд╣реЛрдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╡рд╣ рд╕рдВрднрд╡рддрдГ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЯреЛрдХрд░реЗ рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЙрд╕ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рд╕реНрд╡рдпрдВ рд╕реНрдерд┐рд░ рд╣реЛрдЧрд╛ред рдпрд╛ рдореИрдВ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╕реНрдерд┐рд░ / рдЕрд╕реНрдерд┐рд░ рдФрд░ рд╕реНрдерд┐рд░ рд╕рдВрдХрд▓рдХ / рд░рд╛рддреНрд░рд┐рдХрд╛рд▓реАрди рд╕рдВрдХрд▓рдХ рдмрд╛рддрдЪреАрдд рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ?

рдЕрд╣ @ рдЬрд╢рдлреВрд▓ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ # 27336 рдПрдХ рд╡реНрдпрд╛рдХреБрд▓рддрд╛ рд╣реИ, https://github.com/rust-lang/rust/issues/42774#issuecomment -317279035 рдХреЗ рдЕрдиреБрд╕рд╛рд░ред рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рд╣рдо рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдВрдЧреЗ --- рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдБ рдЬреИрд╕реЗ рд╡реЗ рдореМрдЬреВрдж рд╣реИрдВ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдм рдЙрд╕ рдкрд░ рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдПрдХ рдмрд╛рд░ рдЙрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╡реЗ рдмрд╣рд╕ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреА рдЧрдИ рд╡рд╛рдпрджрд╛ рдкреЛрд╕реНрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рднреА рдХреЗ рд▓рд┐рдП рджреЗрдЦрддреЗ рд╣реИрдВ- # 27336ред

@ рдЬреЛрд╢рдлреЗрд▓ рд▓реЗрдХрд┐рди рдЖрдк рдПрдХ рд╕реНрдерд┐рд░ рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рд╛рде рд╡реИрд╢реНрд╡рд┐рдХ

@sfackler рдЖрд╣ рд╣рд╛рдБ, рд╡рд╣рд╛рдБ рдЧрд▓рддрдлрд╣рдореА рд╣реИ рдХрд┐ рдореБрдЭреЗ рдбрд░ рдерд╛: рдкреА

рдореБрдЭреЗ рдирд╛рдо Excess(ptr, usize) рдереЛрдбрд╝рд╛ рднреНрд░рд╛рдордХ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ usize рдЕрдиреБрд░реЛрдзрд┐рдд рдЖрд╡рдВрдЯрди рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ excess рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрдХрд╛рд░ рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рд▓реЗрдХрд┐рди total рдЖрд╡рдВрдЯрди рдХрд╛

IMO Total , Real , Usable , рдпрд╛ рдХреЛрдИ рднреА рдирд╛рдо рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдХрд╛рд░ рдХреБрд▓ рдЖрдХрд╛рд░ рдпрд╛ рдЖрд╡рдВрдЯрди рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдХрд╛рд░ "рдЕрддрд┐рд░рд┐рдХреНрдд" рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рднреНрд░рд╛рдордХред рд╡рд╣реА _excess рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рдореИрдВ рдКрдкрд░ @gnzlbg рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рд╛рджрд╛ (ptr, usize) рдЯреНрдпреВрдкрд▓ рд╕рд┐рд░реНрдл рдареАрдХ рд╣реЛрдЧрд╛ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ Excess рдХреЛ рдкрд╣рд▓реЗ рдкрд╛рд╕ рдореЗрдВ рд╕реНрдерд┐рд░ рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рд╣реИ

Reddit рдкрд░ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рд▓реЛрдЧ рд╣реИрдВ рдЬрд┐рдирдХреА рдЪрд┐рдВрддрд╛рдПрдБ рд╣реИрдВ: https://www.reddit.com/r/rust/comments/78dabn/custom_allocators_are_on_the_verge_of_being/

рдЖрдЬ @ рдЬрдВрдЧ-рд▓реЗрдВрдЧ / рдкрд░рд┐рд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рдж, рдореИрдВ рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдХреБрдЫ рдореЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬрд┐рд╕реЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  • рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХреЗ рд╕реЗрдЯ рдореЗрдВ alloc_zeroed рдЬреЛрдбрд╝реЗрдВ, рдЕрдиреНрдпрдерд╛ alloc рдХреЗ рд╕рдорд╛рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
  • рдмрджрд▓реЗ *mut u8 рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП *mut void рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдкреАрдЖрдИ рдореЗрдВ extern { type void; } рд╕рдорд░реНрдерди, @dtolnay рдХреА рдЪрд┐рдВрддрд╛ рдХреЛ рд╕реБрд▓рдЭрд╛рдиреЗ рдФрд░ рдПрдХреАрдХреГрдд рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди c_void рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо рдореЗрдВред
  • alloc *mut void рдХрд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдмрджрд▓реЗрдВ, Result рдФрд░ Error рдХреЛ рд╣рдЯрд╛ рджреЗрдВ

рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрд╕ рдкрд░ рднреА рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрд╣ рдЖрдЬ рдХреЗ рд▓рд┐рдмрд╛рд╕ рдЯреАрдо рдХреЗ рд╕рд╛рде рдЪрд░реНрдЪрд╛ рд╕реЗ рдмрд╛рд╣рд░ рдЖрдпрд╛ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдордиреЗ рд▓рдЧрд╛ рдХрд┐ рдХреИрд╕реЗ (a) Result -рдмреЗрдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рд╕рдВрдХреЗрддрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдХреБрд╢рд▓ ABI рд╣реИ рдФрд░ рдПрдХ (b) рд▓рдЧрднрдЧ рдХреЛрдИ "рдЙрддреНрдкрд╛рджрди" рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдЖрдЬ рдирд╣реАрдВ рд╣реИ "рдпрд╣ рд╕рд┐рд░реНрдл OOM'd" рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рднреА рд╕реАрдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╣рдо рдЕрдзрд┐рдХрддрд░ рдЗрдирд▓рд╛рдЗрдирд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЗрд╕ рдкрд░ рдкреЗрдкрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдРрд╕рд╛ рд░рд╣рддрд╛ рд╣реИ рдХрд┐ Error рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреЗрд▓реЛрдб рд╣реИ рдЬреЛ рд╕рдмрд╕реЗ рдХрдо рдкрд░рддреЛрдВ рдкрд░ рдирд┐рдХрд╛рд▓рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдкреЗрд▓реЛрдб рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЛрдЪ рдпрд╣ рд╣реИ рдХрд┐ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрд╡рдВрдЯрди рдХреНрдпреЛрдВ рд╡рд┐рдлрд▓ рд╣реБрдЖ рдФрд░ рдЕрдиреНрдпрдерд╛ рд▓рдЧрднрдЧ рд╕рднреА рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрд╡рдВрдЯрди рд╕рдлрд▓ рд╣реБрдЖ рдпрд╛ рд╡рд┐рдлрд▓ред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдПрдкреАрдЖрдИ рд╣реЛрдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдХреНрд╕рд░ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдмрдЬрд╛рдп, рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдПрдкреАрдЖрдИ рдЬреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЪреАрдЬреЛрдВ рдХреЛ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдпрд╣ рд╕рд░реНрд╡реЛрдкрд░рд┐ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдФрд░ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдПрдкреАрдЖрдИ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рддреНрдпрд╛рдЧ рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

*mut u8 рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдмрд╛рдЗрдЯ рдСрдлрд╝рд╕реЗрдЯ рдХреЗ рд╕рд╛рде .offset рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

рдкрд░рд┐рд╡рд╛рдж рдмреИрдардХ рдореЗрдВ рд╣рдордиреЗ impl *mut void { fn offset } рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ рдЬреЛ рдореМрдЬреВрджрд╛ offset T: Sized рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред byte_offset рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

+1 *mut void рдФрд░ byte_offset ред рдХреНрдпрд╛ рдмрд╛рд╣рд░реА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдпрд╛ рдХреНрдпрд╛ рд╣рдо рдЙрд╕ рдореБрджреНрджреЗ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдкрд░рд┐рднрд╛рд╖рд╛ рдЕрд╕реНрдерд┐рд░ рд╣реИ (рдФрд░ liballoc рдЕрд╕реНрдерд┐рд░ рдЪреАрдЬреЛрдВ рдХреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХрд░ рд╕рдХрддреА рд╣реИ) рдФрд░ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ (рдЬреИрд╕реЗ, let a: *mut void = ... isn 'рдЯреА рдЕрд╕реНрдерд┐рд░)?

рд╣рд╛рдВ, рд╣рдореЗрдВ рдмрд╛рд╣рд░реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдкрд░ рд░реЛрдХ рд▓рдЧрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдмрд╛рд╣рд░реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд void рд╣рдореЗрд╢рд╛ рдПрдХ рдЬрд╛рджреБрдИ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдорд╛рдорд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдХреЛрдИ рдФрд░ рдЕрдзрд┐рдХ рдЪрд░реНрдЪрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ Alloc рдФрд░ Dealloc рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рдХреНрд╖рдг рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП?

рд╣рдо рдЙрд╕ рдкрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реНрдкрд░реНрд╢ рдирд╣реАрдВ рдХрд░рддреЗ рдереЗ, рд▓реЗрдХрд┐рди рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рдереЗ рдХрд┐ рд╣рдореЗрдВ рдкреВрд░реНрд╡ рдХрд▓рд╛ рд╕реЗ рд╡рд┐рдЪрд▓рди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдореНрдореЛрд╣рдХ рдХрд╛рд░рдг рди рд╣реЛред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, C ++ рдХреЗ рдПрд▓реЛрдХреИрдЯрд░ рдЕрд╡рдзрд╛рд░рдгрд╛ рдореЗрдВ рд╕рдорд╛рди рд╡рд┐рднрд╛рдЬрди рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдЙрдкрдпреБрдХреНрдд рддреБрд▓рдирд╛ рд╣реИред C ++ рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдореБрдХреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП Box рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреА рдПрдХ рдкреНрд░рддрд┐ (рдпрд╛ рдПрдХ рд╕рдВрджрд░реНрдн) рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдХрд╛ рдЭрдЯрдХрд╛ рд╣реИред

@ рдЬреЛрд╢рдлреЗрд▓ unique_ptr Box , vector Vec рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, unordered_map HashMap рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ

@cramertj рдЖрд╣, рджрд┐рд▓рдЪрд╕реНрдк, рдореИрдВ рдХреЗрд╡рд▓ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд░ рджреЗрдЦ рд░рд╣рд╛ рдерд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рдд рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣рдо рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдХрдВрдмрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рдпрд╣ рдХреНрд▓реАрдирд░ рд╣реЛрдЧрд╛ред

рдХрдВрдмрд▓ рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреНрд▓реАрдирд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ:

pub trait Dealloc {
    fn dealloc(&self, ptr: *mut void, layout: Layout);
}

impl<T> Dealloc for T
where
    T: Alloc
{
    fn dealloc(&self, ptr: *mut void, layout: Layout) {
        <T as Alloc>::dealloc(self, ptr, layout)
    }
}

рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╣реБрдордд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдо рд╡рд┐рд╢реЗрд╖рддрд╛ред

  • рдЖрдмрдВрдЯрди рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реБрдП, рд░рд┐рдЯрд░реНрди рдСрдлрд╝ * рдореНрдпреВрдЯ рд╢реВрдиреНрдп рдореЗрдВ рдмрджрд▓реЗрдВ

рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрд╕ рдкрд░ рднреА рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрд╣ рдЖрдЬ рдХреЗ рд▓рд┐рдмрд╛рд╕ рдЯреАрдо рдХреЗ рд╕рд╛рде рдЪрд░реНрдЪрд╛ рд╕реЗ рдмрд╛рд╣рд░ рдЖрдпрд╛ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ (рдХ) рдкрд░рд┐рдгрд╛рдо рдЖрдзрд╛рд░рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рд╕рдВрдХреЗрддрдХ-рд╡рд╛рдкрд╕реА рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдХреБрд╢рд▓ ABI рд╣реИ рдФрд░ (b) рд▓рдЧрднрдЧ рдХреЛрдИ "рдЙрддреНрдкрд╛рджрди" рдЖрд╡рдВрдЯрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЖрдЬ рд╕реАрдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ "рдпрд╣ рд╕рд┐рд░реНрдл OOM'd" рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рднреА рдирд╣реАрдВред рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╣рдо рдЬреНрдпрд╛рджрд╛рддрд░ рдЗрдирд▓рд╛рдЗрдирд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЗрд╕ рдкрд░ рдкреЗрдкрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдРрд╕рд╛ рд╣реА рд░рд╣рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреЗрд▓реЛрдб рд╣реИ рдЬреЛ рд╕рдмрд╕реЗ рдХрдо рдкрд░рддреЛрдВ рдкрд░ рдирд┐рдХрд╛рд▓рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдореБрдЭреЗ рдЪрд┐рдВрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╢рдХреНрдд рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд┐рдП рдмрд┐рдирд╛ рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Result<NonZeroPtr<void>, AllocErr> рдХрд░рдХреЗ рдФрд░ AllocErr рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдмрдирд╛рдХрд░ рдЗрд╕ рдЬреЛрдЦрд┐рдо рдХреЛ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдУрд╡рд░рд╣реЗрдб рдХреЛ рднреА рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

( NonZeroPtr рдПрдХ рд╡рд┐рд▓рдп ptr::Shared рдФрд░ ptr::Unique рдЬреИрд╕рд╛ рдХрд┐ https://github.com/rust-lang/rust/issues/27730#issuecomment-31666397 рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИред)

@SimonSapin Result<NonZeroPtr<void>, AllocErr> рдЬреИрд╕реА рдХреБрдЫ рдЪреАрдЬрд╝реЛрдВ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рднреА рдмрд┐рд▓реНрдХреБрд▓ рдирдП рд╣реИрдВ рдФрд░ рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдХрдо рд╣реИрдВред void рддрд░рд╣ рдХреБрдЫ рднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдореЗрд░реА рд░рд╛рдп рдореЗрдВ) рд╣реИред

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ "рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЬрд╛рдВрдЪ рдХреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ", рд▓реЗрдХрд┐рди рдпрд╣ рдлрд┐рд░ рд╕реЗ, рдПрдХ рдмрд╣реБрдд рд╣реА рдХрдо-рд╕реНрддрд░реАрдп рдПрдкреАрдЖрдИ рд╣реИ рдЬрд┐рд╕рдХрд╛ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдХреЙрд▓рд░ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд▓реЛрдЧ рдирд┐рдореНрди рд╕реНрддрд░ alloc рд╢реАрд░реНрд╖ рдкрд░ alloc_one рдЬреИрд╕реЗ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреЗ рд╕рд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ Result<NonZeroPtr<void>, AllocErr> рдЬреИрд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ AllocErr рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл Option<NonZeroPtr<void>> рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ? рдПрдкреАрдЖрдИ рдЬреЛ рдХрд┐ рдЧрд▓рддреА рд╕реЗ, рдмрд┐рдирд╛ рдУрд╡рд░рд╣реЗрдб рдХреЗ рджреБрд░реБрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрднрд╡ рд╣реИ, рдЙрди рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рд╕реА рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЬрдВрдЧ рдХреЛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕реА-рд╢реИрд▓реА рдХреЗ рдЕрд╢рдХреНрдд рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд▓реМрдЯрдиреЗ рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдХрджрдо рдкреАрдЫреЗ рдХреА рддрд░рд╣ рдорд╣рд╕реВрд╕ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХрд╣рдирд╛ "рдПрдХ рдмрд╣реБрдд рд╣реА рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдПрдкреАрдЖрдИ рд╣реИ рдЬрд┐рд╕рдХрд╛ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИ" рдпрд╣ рдХрд╣рдиреЗ рдЬреИрд╕рд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрд╕рд╛рдорд╛рдиреНрдп рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рд╕реНрдореГрддрд┐ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдмрд╣реБрдд рдХрдо-рд╕реНрддрд░ рдХреЗ рд╣реИрдВ рдФрд░ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд╢рд╛рдорд┐рд▓ рд╣реИред рдирд┐рдореНрди рд╕реНрддрд░ рдХреЗ рдЖрд╡рдВрдЯрди API рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ Option<NonZeroPtr<void>> рдпрд╛ *mut void ред

Alloc::alloc рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдкреАрдЖрдИ рд╣реИ рдЬреЛ рдирд┐рдореНрди рд╕реНрддрд░ рдХрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИред Alloc::alloc_one<T> рдпрд╛ Alloc::alloc_array<T> рдЬреИрд╕реА рд╡рд┐рдзрд┐рдпрд╛рдБ рдРрд╕реЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬреЛ рдЕрдзрд┐рдХ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдПрдХ "рдЕрдЪреНрдЫреЗ" рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╣реЛрдВрдЧреЗред

рдПрдХ рд╕реНрдЯреЗрдЯрдлреБрд▓ AllocError рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╢реВрдиреНрдп рдЖрдХрд╛рд░ рдкреНрд░рдХрд╛рд░ рд╣реИ рдХрд┐ рдФрдЬрд╛рд░ рддреНрд░реБрдЯрд┐ рд╣реИ рдФрд░ рдПрдХ рд╣реИ Display рдХреЗ allocation failure рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИред рдпрджрд┐ рд╣рдо NonZeroPtr<void> рдорд╛рд░реНрдЧ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ Result<NonZeroPtr<void>, AllocError> рдХреЛ Option<NonZeroPtr<void>> Result<NonZeroPtr<void>, AllocError> рд░реВрдк рдореЗрдВ рдмреЗрд╣рддрд░ рджреЗрдЦрддрд╛ рд╣реВрдВред

рдХреНрдпреЛрдВ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреАрдбрд╝ :( !! Result<NonZeroPtr<void>, AllocErr> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрд╡рд┐рд╡рд╛рдж рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ "рдмрд╣реБрдд рд╣реА рдирд┐рдореНрди рд╕реНрддрд░ рдХрд╛ рдПрдкреАрдЖрдИ" рд╣реИ, рдЬреЛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдмрд╕ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд░реВрдк рд╕реЗ рдЕрдиреБрдЪрд┐рдд рдирд╣реАрдВ рд╣реИред рд╕рднреА рд╕реНрддрд░реЛрдВ рдкрд░ рдХреЛрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдВрднрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ; рдЕрд╕реНрдкрд╖реНрдЯ рдХреЛрдб рд╣реИ рдХрд┐ рд▓рдЧрд╛рддрд╛рд░ рд╕рдВрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдФрд░ рдЗрд╕ рддрд░рд╣ рд▓реЛрдЧреЛрдВ рдХреА рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рдпрд╛рджреЛрдВ рдореЗрдВ) рд╕рднреА рдЕрдзрд┐рдХ!

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд▓рд┐рдЦрд┐рдд рдЖрдмрдВрдЯрд┐рдд-рдмрд╣реБрд░реВрдкреА рд╕рдВрдЧреНрд░рд╣ рд╣реИрдВ, рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рд╕реАрдзреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рдХреЛрдб рдХреА рдПрдХ рдЦреБрд▓реА рдорд╛рддреНрд░рд╛ рд╣реИред

рдкреБрди: рд╡реНрдпрд╡рд╣рд╛рд░, рд╕рдВрдЪрд╛рд▓рди, рд╣рдо рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдмрд╛рд░ рдкреНрд░рддрд┐-рд╡реГрдХреНрд╖ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрд▓реЛрдХреЗрдЯрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд / рдХреНрд▓реЛрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХрд╕реНрдЯрдо-рдПрд▓реЛрдХреЗрдЯрд░-рдмреЙрдХреНрд╕ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдпрд╣ рдПрдХ рдЦреБрд▓реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХрд┐ рд░рд╕реНрдЯ рдореЗрдВ рд░реИрдЦрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╡рд┐рдкрд░реАрдд, рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреБрдЫ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрджрд░реНрд╢ usecase Box рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ, рди рдХрд┐ рд╡рд┐рднрд╛рдЬрди рдЖрд╡рдВрдЯрди рдФрд░ рдбреАрд▓рд▓реЛрдХреЗрдЯрд░ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдпрд╛рдиреА рд╣рдо рд░реИрдЦрд┐рдХрддрд╛ рдкрд░ рд░реЛрдХ рдХреЗ рдмрд┐рдирд╛ рд╕реНрдерд┐рд░ рдкреНрд░рдЧрддрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@sfackler рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреБрдЫ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐

@Emon2314 рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рднреАрдбрд╝" рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓реЛрдЧ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╡рд┐рдЬреНрдЮрд╛рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИред

рдЙрд╕ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

@sfackler рд▓реЛрдЧ рдЕрднреА рднреА рд░рд╛рддреНрд░рд┐ / рджрд┐рди рдкрд┐рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдЧреНрд░рд┐рдо рд╕реБрд╡рд┐рдзрд╛ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рд╣рдЬ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред [рдЕрдЧрд░ рд╕рдорд╕реНрдпрд╛ рдЕрд╕реНрдерд┐рд░ рдЬрдВрдЧ рдмрдирд╛рдо рдЕрд╕реНрдерд┐рд░ рдЬрдВрдЧ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдиреАрддрд┐ рдирд┐рд░реНрдзрд╛рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред] рд▓реВрд╕реА рдПрдкреАрдЖрдИ рдореЗрдВ рдмреЗрдХрд┐рдВрдЧ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╣рдореЗрдВ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдмрд╛рдзрд┐рдд рдХрд░ рджреЗрддрд╛

рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдбреАрд▓рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдВрдЧреЗред рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдЙрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред [рдЕрднреА рднреА рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧрд▓рдд (рдбреА) рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдореБрджреНрджрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рджреВрд░ рд╕реЗ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред]

рдЕрдЧрд░ рд▓реЛрдЧ рд╕рд┐рд░реНрдл рдПрдХ рд░рд╛рдд рдореЗрдВ рдкрд┐рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдерд┐рд░ рдмрд┐рд▓реНрдб рдХреНрдпреЛрдВ рд╣реИрдВ? рдЬреЛ рд▓реЛрдЧ рд╕реАрдзреЗ рддреМрд░ рдкрд░ рдПрд▓реЛрдХреЗрдЯрд░ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрдирдХрд╛ рд╕реЗрдЯ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ, рдЬреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреА рдЬрдЧрд╣ рдЙрди рдПрдкреАрдЖрдИ рдХрд╛ рд▓рд╛рдн рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдЖрдк рдХреБрдЫ рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдбреАрд▓рд░ рдХреЛ рдЕрдкрдиреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? C ++ рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ API рдХреЛ рдПрдХ рд╕рдорд╛рди рдореИрдкрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ?

рдЕрдЧрд░ рд▓реЛрдЧ рд╕рд┐рд░реНрдл рдПрдХ рд░рд╛рдд рдореЗрдВ рдкрд┐рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдерд┐рд░ рдмрд┐рд▓реНрдб рдХреНрдпреЛрдВ рд╣реИрдВ?

рднрд╛рд╖рд╛ рдХреА рд╕реНрдерд┐рд░рддрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рдХреЛрдб рдХреЛ рд▓рд┐рдЦреА рдЧрдИ рдЪреАрдЬреЛрдВ рдХреЗ рдХреЛрдб рдХрднреА рдирд╣реАрдВ рдЯреВрдЯреЗрдВрдЧреЗред рдПрдХ рдирдП рд╕рдВрдХрд▓рдХ рдкрд░ред рдЖрдк рдПрдХ рд░рд╛рдд рдХреЛ рдкрд┐рди рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рдЖрдкрдХреЛ рдХрд┐рд╕реА рдЪреАрдЬ рдХреА рдЗрддрдиреА рдмреБрд░реА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ рдЙрд╕ рдЧрд╛рд░рдВрдЯреА рдХреЗ рдпреЛрдЧреНрдп рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдордЭреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдЕрдВрддрд┐рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред

рдЬреЛ рд▓реЛрдЧ рд╕реАрдзреЗ рддреМрд░ рдкрд░ рдПрд▓реЛрдХреЗрдЯрд░ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрдирдХрд╛ рд╕реЗрдЯ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ, рдЬреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреА рдЬрдЧрд╣ рдЙрди рдПрдкреАрдЖрдИ рдХрд╛ рд▓рд╛рдн рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдЕрд╣рд╛! рдпрд╣ рдЬрдорд╛рд▓реЙрдХ рдХреЛ рдкреЗрдбрд╝ рд╕реЗ рдмрд╛рд╣рд░ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛, рдЖрджрд┐? рдХрд┐рд╕реА рдиреЗ рднреА рднрдпрд╛рдирдХ рдЖрд╡рдВрдЯрди рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдЪреБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдмрд╕ рдвреЗрд░ рд╕реНрдерд┐рд░ рд╣реИ? рдпрд╛ рдореИрдВрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЧрд▓рдд рдкрдврд╝рд╛ рд╣реИ?

рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдЪреБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╡рд╛рд▓реА рднрдпрд╛рдирдХ рд╣реИрдХ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рдЬреЛ рдХрд┐ рд╣рдореЗрдВ рдкреЗрдбрд╝ рд╕реЗ рдЬрдорд╛рд▓реЙрдХ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЖрдзрд╛ рд╣реИред рдпрд╣ рдореБрджреНрджрд╛ рдЕрдиреНрдп рдЖрдзрд╛ рд╣реИред

#[global_allocator] рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реНрдерд┐рд░реАрдХрд░рдг: https://github.com/rust-lang/rust/issues/27389#issuecomment -336955367

рдУрд╣

@Emon2314 рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ

(Https://github.com/rust-lang/rust/issues/27389#issuecomment-342285805 рдкрд░ рдЬрд╡рд╛рдм рджрд┐рдпрд╛ рдЧрдпрд╛)

рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ * рдЙрддреНрдкрд░рд┐рд╡рд░реНрддреА рд╢реВрдиреНрдпред

@rfcbot рдиреЗ * mut u8 рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛

@rfcbot рдиреЗ рд╕рдореАрдХреНрд╖рд╛ рдХреА

IRC рдкрд░ рдХреБрдЫ рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЗрд╕реЗ рдЗрд╕ рд╕рдордЭ рдХреЗ рд╕рд╛рде рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╣рдо _do not_ Box рдкрд░ Alloc Box рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреБрдЫ Dealloc рд╕рд╛рде рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЗ рд╕рд╛рде рдпрд╣рд╛рдБ @sfackler рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рдЙрдкрдпреБрдХреНрдд рдХрдВрдмрд▓ рд╣реИ ред рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдореИрдВрдиреЗ рдЗрд╕ рдЗрд░рд╛рджреЗ рдХреЛ рдЧрд▓рдд рд╕рдордЭрд╛ рд╣реИред

@cramertj рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рдж рдЙрд╕ рдХрдВрдмрд▓ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдФрд░ Alloc рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рддреЛрдбрд╝рдирд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдпрд╣рд╛рдВ рд╕реНрдерд┐рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

@ рдЬреЛрд╢рдлреЗрд▓ рд╣рд╛рдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛: https://github.com/rust-lang/rust/issues/32838#issuecomment -340959804

рд╣рдо рдХрд┐рд╕реА рджрд┐рдП рдЧрдП Alloc рд▓рд┐рдП Dealloc рдХреИрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВрдЧреЗ? рдореИрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВрдЧреЗ?

pub unsafe trait Alloc {
    type Dealloc: Dealloc = Self;
    ...
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд╛рдВрдЯреЗрджрд╛рд░ рдХреНрд╖реЗрддреНрд░ WRT https://github.com/rust-lang/rust/issues/29661 рдкрд░ рд░рдЦрддрд╛ рд╣реИ

рд╣рд╛рдБ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Dealloc рдХреЗ рдЬреЛрдбрд╝ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмрд┐рдирд╛ Alloc (рдЬреЛ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╣реАрдВ рд╣реИ) рдХреА рдореМрдЬреВрджрд╛ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкреАрдЫреЗ-рд╕рдВрдЧрдд рд╣реЛред

рдпрджрд┐ рдЖрдк рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдПрд▓реЛрдХреЗрдЯрд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдбреАрд▓рд░ рдХреЛ рд╣рдбрд╝рдкрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдПрдХ рдбреАрд▓рд░ рд╕реЗ рдорд╛рди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рдиред

рд▓реЗрдХрд┐рди, рдЗрд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрд╕ рд╕рд╛рдорд╛рди рдХреЗ рд╕рд╛рде Alloc рдПрдХ рдЕрд▓рдЧ рдЙрдк-рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред

@sfackler рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВред рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рддрд╣рдд Box::new рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ?

рдпрд╣ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рдЙрд╕ рд╕рднреА рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

pub struct Box<T, D>(NonZeroPtr<T>, D);

impl<T, D> Box<T, D>
where
    D: Dealloc
{
    fn new<A>(alloc: A, value: T) -> Box<T, D>
    where
        A: Alloc<Dealloc = D>
    {
        let ptr = alloc.alloc_one().unwrap_or_else(|_| alloc.oom());
        ptr::write(&value, ptr);
        let deallocator = alloc.deallocator();
        Box(ptr, deallocator)
    }
}

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбреАрд▓рдХреНрд▓реЙрдХрд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬрд╛рдирдирд╛ред рддреБрдо рднреА parameterize рд╕рдХрддрд╛ рд╣реИ Box рд╕реЗ рдЕрдзрд┐рдХ Alloc рдФрд░ рд╕реНрдЯреЛрд░ A::Dealloc рдмрдЬрд╛рдп, рдкреНрд░рдХрд╛рд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рд╕рд╛рде рдЬреЛ рдЖ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рдмрд╛рдж рд╣рдо Dealloc рдФрд░ deallocator рдПрдХ рдЕрд▓рдЧ рдирд┐рд╢рд╛рди рдореЗрдВ рд▓реЗ рдЬрд╛рдХрд░ рдпрд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

pub trait SplitAlloc: Alloc {
    type Dealloc;

    fn deallocator(&self) -> Self::Dealloc;
}

рд▓реЗрдХрд┐рди Drop рдХрд╛ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛?

impl<T, D> Drop for Box<T, D>
where
    D: Dealloc
{
    fn drop(&mut self) {
        unsafe {
            ptr::drop_in_place(self.0);
            self.1.dealloc_one(self.0);
        }
    }
}

рд▓реЗрдХрд┐рди рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╣рдо Alloc рдкрд╣рд▓реЗ рд╕реНрдерд┐рд░ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рд╕рднреА Alloc s Dealloc рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд╣реИ рдирд╛? рдФрд░ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдЕрднреА рднреА рдПрдХ рд░рд╛рд╕реНрддрд╛ рдерд╛? рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЕрднреА рддрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

impl<T, D> Drop for Box<T, D> where D: Dealloc { ... }
impl<T, A> Drop for Box<T, A> where A: Alloc { ... }

рдЕрдЧрд░ рдХреБрдЫ рднреА, рд╣рдо рдПрдХ рд╣реЛрдЧрд╛

default impl<T> SplitAlloc for T
where
    T: Alloc { ... }

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред рдХрд╕реНрдЯрдо рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ рдХрд┐ рдореИрдВ рдирд╣реАрдВ рдорд╛рдирддрд╛ рдХрд┐ рдЙрдирдХреЗ рдмреАрдЪ рдУрд╡рд░рд▓реИрдк рдХрд╛ рдПрдХ рдЯрди рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдореБрдЭреЗ рдмрд╣реБрдд рд╕рд╛рдл рд▓рдЧрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдмрд▓реНрд▓реЗ рд╕реЗ Dealloc рд╕рд╣реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд░рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓, рдмрд┐рдирд╛ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореМрдЬреВрджрд╛ рдХреЛрдб рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Alloc :

unsafe trait Dealloc {
    fn dealloc(&mut self, ptr: *mut void, layout: Layout);
}

impl<T> Dealloc for T
where
    T: Alloc
{
    fn dealloc(&self, ptr: *mut void, layout: Layout) {
        <T as Alloc>::dealloc(self, ptr, layout)
    }
}

unsafe trait Alloc {
    type Dealloc: Dealloc = &mut Self;
    fn deallocator(&mut self) -> Self::Dealloc { self }
    ...
}

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдЪреВрдХ рд╕реЗ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдерд╛?

рдПрдХ Dealloc рдЬреЛ рдХрд┐ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд╕реНрдкрд░ рд╕рдВрджрд░реНрдн рд╣реИ, рдпрд╣ рд╕рдм рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ - рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдЪреАрдЬ рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реИ рдирд╛?

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдЪреВрдХ рд╕реЗ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдерд╛?

рдУрд╣, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреА рдЪреВрдХ рдмрд╣реБрдд рджреВрд░ рд╣реИрдВ рдЬреЛ рд╣рдо рдЙрди рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдлрд┐рд░ рднреА, рд╣рдо рд╕рд░рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

unsafe trait Dealloc {
    fn dealloc(&mut self, ptr: *mut void, layout: Layout);
}

impl<T> Dealloc for T
where
    T: Alloc
{
    fn dealloc(&self, ptr: *mut void, layout: Layout) {
        <T as Alloc>::dealloc(self, ptr, layout)
    }
}

unsafe trait Alloc {
    type Dealloc: Dealloc;
    fn deallocator(&mut self) -> Self::Dealloc;
    ...
}

рдФрд░ рдмрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдмреЙрдпрд▓рд░ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛред

Dealloc рдЬреЛ рдХрд┐ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд╕реНрдкрд░ рд╕рдВрджрд░реНрдн рд╣реИ, рдпрд╣ рд╕рдм рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ - рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдЪреАрдЬ рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реИ рдирд╛?

рд╣рд╛рдБ, рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рд╢рд╛рдпрдж рдПрдХ рдореВрдЯ рдмрд┐рдВрджреБ рдиреЗ рд╡реИрд╕реЗ рднреА рдЖрдкрдХреА рдЕрдиреНрдп рдЯрд┐рдкреНрдкрдгреА рджреАред

deallocator self , &self , рдпрд╛ &mut self ?

рд╕рдВрднрд╡рддрдГ &mut self рдЕрдиреНрдп рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рдРрд╕реЗ рдХреЛрдИ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╣реИрдВ рдЬреЛ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрд╡рдпрдВ рд▓реЗрдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ, рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреНрд▓реЛрди рд░рд╛рдЬреНрдп рди рдХрд░рдирд╛ рдкрдбрд╝реЗ?

рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ self рд▓реЗрдиреЗ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ Dealloc рдФрд░ рдлрд┐рд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред

рдореИрдВ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ "oneshot" рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХрд┐рддрдиреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЪреАрдЬ рд╣реИред

рдРрд╕рд╛ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди self рдореВрд▓реНрдп рд╕реЗ рд▓реЗрдиреЗ рдкрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ _all_ рдПрд▓реЛрдХреЗрдЯрд░ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ, рдФрд░ deallocator рдмрд╛рдж рдЖрд╡рдВрдЯрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ред

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ, рдореИрдВ рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ https://github.com/rust-lang/rust/issues/27336 рдпрд╛ https://github.com/rust-lang/rust/issues/32838#issuecomment -339066870 рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдмрд┐рдВрджреБ рд╣рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗ рд╕рдВрдЧреНрд░рд╣ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдирд╛?

рдореИрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрдардиреАрдпрддрд╛ рдкрд░ рдЕрдиреНрдп рдЙрдкрдирд╛рдо рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВред рдкреНрд░рдЧрддрд┐ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ (рдмрд╣реБрдд рд╣реА рдХреНрд░рд┐рдпрд╛рддреНрдордХ) рддрд░реАрдХрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛:

pub struct Vec<T>(alloc::Vec<T, Heap>);

impl<T> Vec<T> {
    // forwarding impls for everything
}

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рджрд░реНрдж рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рдЬрд┐рди рдмрджрд▓рд╛рд╡реЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡реЗ рдХрд╛рдлреА рдмрдбрд╝реЗ рд╣реИрдВ рдХрд┐ рдЕрдЧрд░ рд╣рдо рд╡рд┐рднрд╛рдЬрд┐рдд рдЖрд╡рдВрдЯрди / рдбреАрд▓рд▓реЙрдХ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ std рдФрд░ рдлрд┐рд░ re-FCP рдореЗрдВ рдЖрдЬрд╝рдорд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕ рд╕рд╛рдорд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреА рд╕рдордпрд░реЗрдЦрд╛ рдХреНрдпрд╛ рд╣реИ?

grow_in_place рд╡рд┐рдзрд┐ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд╖рдорддрд╛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде usable_size рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЖрд╡рдВрдЯрди рдХреЛ рдЗрд╕ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП _at рдХрдо рд╕реЗ рдХрдо_ рдлрд┐рдЯ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрд╡рдВрдЯрди рдЙрд╕ рд▓реЗрдЖрдЙрдЯ рд╕реЗ рдкрд░реЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкрддрд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ alloc рдФрд░ realloc рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ alloc_excess рдФрд░ realloc_excess рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рд▓рд╛рдн рд╕рдордЭрдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рд╣реЛ рд░рд╣реА рд╣реИред

рдПрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдЖрд╡рдВрдЯрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреБрдХреНрдд рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдЗрд╕рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдЬрд╛рдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдХреНрдпрд╛ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рддрдм рдПрдХ рд╕рдВрдХреЗрддрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдпрд╛ рдЯрдкрд▓ "рдкреЙрдЗрдВрдЯрд░ рдФрд░ рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ рдХрд╛ рдЖрдХрд╛рд░" рдХрд┐рд╕реА рднреА рдФрд╕рдд рджрд░реНрдЬреЗ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдЕрдВрддрд░ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП alloc рдФрд░ realloc рдХреЗрд╡рд▓ API рд╕рддрд╣ рдХреЛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ рдФрд░ рдХрдо рдкреНрд░рджрд░реНрд╢рдирдХрд╛рд░реА рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЙрдиреНрд╣реЗрдВ рдПрдкреАрдЖрдИ рдореЗрдВ рдХреНрдпреЛрдВ рд░рдЦрддреЗ рд╣реИрдВ? рдЙрдирдХрд╛ рдХреНрдпрд╛ рдлрд╛рдпрджрд╛ рд╣реИ?


рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╛ рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ: рдПрдкреАрдЖрдИ рдореЗрдВ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЖрд╡рдВрдЯрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ Excess рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рднреА _excess рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред

рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрд░реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Box рдпрд╛ BTreeMap рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдпрд╛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИред рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдореЗрдВ рдХреБрдЫ рд▓рд╛рдЧрдд рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрдпрд╛ рд╣реИ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдПрдкреАрдЖрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореБрдЭреЗ рдРрд╕рд╛ рдХреЛрдб рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд╖рдорддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдореЗрдВ рдХреБрдЫ рд▓рд╛рдЧрдд рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИ

рдХреНрдпрд╛ рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рдФрд░ рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдПрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдЬреЛ рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рддрдиреА рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЬреЛ рдХрд┐ Excess рд╣реИ: рд╕реНрдореГрддрд┐ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░рд╛рд╢рд┐ рдЖрд╡рдВрдЯрд┐рдд; рд╣рдо; рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓ рджреЗрдВ)ред

рдХреЗрд╡рд▓ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ Alloc ator рдЬрд╣рд╛рдВ рдпрд╣ рдереЛрдбрд╝рд╛ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, POSIX malloc , рдЬреЛ рднрд▓реЗ рд╣реА рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ Excess рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрдкрдиреЗ C рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдЬрд╛рдЧрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдПрдкреАрдЖрдИред рд╣рд╛рд▓рд╛рдВрдХрд┐, Excess рд░реВрдк рдореЗрдВ рдЕрдиреБрд░реЛрдзрд┐рдд рдЖрдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдареАрдХ рд╣реИ, рдкреЛрд░реНрдЯреЗрдмрд▓, рд╕рд░рд▓, рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЦрд░реНрдЪ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╣рд░ рдХреЛрдИ POSIX malloc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡реИрд╕реЗ рднреА рдорд╛рди рд░рд╣рд╛ рд╣реИред

jemalloc рдФрд░ рдореВрд▓ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп Alloc рдмрд╛рд╣рд░ рд╡рд╣рд╛рдБ рдПрдкреАрдЖрдИ рд╣реИ рдХрд┐ Excess рдХрд┐рд╕реА рднреА рд▓рд╛рдЧрдд рдХреЗ рдмрд┐рдирд╛ рд╡рд╛рдкрд╕реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрди рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, Excess рдХрд░рдирд╛ рд╢реВрдиреНрдп рд╣реИ рд╕рд╛рде рд╣реА рд▓рд╛рдЧрддред

рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдореЗрдВ рдХреБрдЫ рд▓рд╛рдЧрдд рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрдпрд╛ рд╣реИ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдПрдкреАрдЖрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореБрдЭреЗ рдРрд╕рд╛ рдХреЛрдб рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд╖рдорддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрднреА рд╣рд░ рдХреЛрдИ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдПрдкреАрдЖрдИ рд╡рд╛рд▓реЗ рдПрд▓реЛрдХреЗрдЯрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдХреАрдордд рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪреБрдХрд╛ рд░рд╣рд╛ рд╣реИред рдФрд░ рдЬрдм рдХреЛрдИ Excess one` рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ Excess -рд░рд╣рд┐рдд API рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд╕рддреНрдп рдирд╣реАрдВ рд╣реИред рддреЛ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  • Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рддрд░реАрдХреЗ рд╣рдореЗрд╢рд╛ Excess
  • рдПрдХ ExcessLessAlloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ Excess рдХреЛ Alloc рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП Alloc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рджреЗрдЦрднрд╛рд▓ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди 2) рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЬрд╛ рд░рд╣реА рд╕реНрдореГрддрд┐ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рддреНрд░рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рд╣реИ (рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЖрд▓рд╛ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ)
  • рдЕрдЧрд░ рдПрдХ рджрд┐рди рдХрд┐рд╕реА рдХреЛ Excess рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╛рд╕реНрдЯ-рдкрде рд╡рд╛рд▓реЗ Alloc ators рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╣рдореЗрд╢рд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП ExcessLessAlloc рдХрд╛ рдХрд╕реНрдЯрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ рдореИрдВ рд╕рд┐рд░реНрдл рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рдлрд┐рд░ рд╕реЗ рдЙрддрд░рд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ Alloc рд╢реАрд░реНрд╖ рдкрд░ рдЬреЛ рднреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЙрд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ grow_in_place_excess рдкрд╣рд▓реЗ рдпрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдмрд╕ рдлрд┐рд░ рд╕реЗ рдЕрдЯрдХ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ alloc_zeroed_excess рднреА рдЧрд╛рдпрдм рд╣реИ (рдФрд░ рдХреМрди рдЬрд╛рдирддрд╛ рд╣реИ)ред

рдореИрдВ рдФрд░ рдЕрдзрд┐рдХ рдЖрд░рд╛рдорджрд╛рдпрдХ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдпрд╣рд╛рдБ рд╕реНрдерд┐рд░реАрдХрд░рдг рдкрд╣рд▓реЗ Excess -API рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдЧрд╛ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЗрд╕рдХрд╛ рдПрдкреАрдЖрдИ рд╕рднреА рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдРрд╕рд╛ рдПрдкреАрдЖрдИ рдХрдо рд╕реЗ рдХрдо рд╕рднреА рдЙрдкрдпреЛрдЧреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬреЛ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХ рд╢рд░реНрдд рд╣реИ рдХрд┐ рдбрд┐рдЬрд╛рдЗрди рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рдФрд░ рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдПрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдЬреЛ рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рддрдиреА рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЬреЛ рдХрд┐ Excess рд╣реИ: рд╕реНрдореГрддрд┐ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░рд╛рд╢рд┐ рдЖрд╡рдВрдЯрд┐рдд; рд╣рдо; рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓ рджреЗрдВ)ред

рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрд▓реЛрдХреЗрдЯрд░ рдЖрдЬ рдЖрдХрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдЖрдХрд╛рд░ рд╡рд░реНрдЧ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЖрд╡рдВрдЯрди рдЕрдиреБрд░реЛрдз рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЖрдХрд╛рд░ рд╡рд░реНрдЧ рдХреЛ рдлрд┐рдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рдЖрдХрд╛рд░ рд╡рд░реНрдЧ рддрдХ рдЧреЛрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╡реЗ рдЕрдВрджрд░ рдлрд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рдпреЛрдЬрдирд╛ рдореЗрдВ, рдЖрдХрд╛рд░ рд╡рд░реНрдЧ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛрдиреЗ рдФрд░ рдлрд┐рд░ classes[size / SIZE_QUANTUM].alloc() рдХрд░рдиреЗ рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдХрд░рдирд╛ рдЖрдо рд╣реИред рдЙрд╕ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдХрд┐ рдХрд┐рд╕ рдЖрдХрд╛рд░ рдХреЗ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрджреЗрд╢ рд▓реЗрддрд╛ рд╣реИ: рдЬреИрд╕реЗ, let excess = classes[size / SIZE_QUANTUM].size ред рдпрд╣ рдПрдХ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рдЖрд╡рдВрдЯрди (рдЬреИрд╕реЗ рдЬреЗрдорд▓реЙрдХ) рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдПрдХрд▓ рдШрдбрд╝реА рдЪрдХреНрд░реЛрдВ рдореЗрдВ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рд╛рд░реНрдердХ рдУрд╡рд░рд╣реЗрдб рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рд╡рд╣ рдЖрдХрд╛рд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рд░рд┐рдЯрд░реНрди рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕реЗ рдЧреБрдЬрд░ рд░рд╣рд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?

рдХрдо рд╕реЗ рдХрдо рдЕрдкрдиреЗ рдкреАрдЖрд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛ рд░рд╣рд╛ рд╣реИ_рдЬрд┐рдорд╛рд▓реЛрдХ, alloc_excess рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ alloc рд╕реЗ рдЕрдзрд┐рдХ рдХреЛрдб рдЪрд▓ рд░рд╣рд╛ рд╣реИ: https://github.com/rust-lang/rust/pull/45514/filesред

рдЗрд╕ рдпреЛрдЬрдирд╛ рдореЗрдВ, рдЖрдХрд╛рд░ рд╡рд░реНрдЧ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛрдиреЗ рдФрд░ рдлрд┐рд░ рдХрдХреНрд╖рд╛рдПрдВ [рдЖрдХрд╛рд░ / SIZE_ANTANTUM] .alloc () рдХрд░рдиреЗ рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдХрд░рдирд╛ рдЖрдо рд╣реИред рдЙрд╕ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдХрд┐ рдХрд┐рд╕ рдЖрдХрд╛рд░ рдХреЗ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрджреЗрд╢ рд▓реЗрддрд╛ рд╣реИ: рдЬреИрд╕реЗ, рдЕрддрд┐рд░рд┐рдХреНрдд = рдХрдХреНрд╖рд╛рдПрдВ [рдЖрдХрд╛рд░ / SIZE_QUANTUM] .size

рддреЛ рдореБрдЭреЗ рджреЗрдЦрдиреЗ рджреЛ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдареАрдХ рд╕реЗ рдкрд╛рд▓рди рдХрд░реВрдВ:

// This happens in both cases:
let size_class = classes[size / SIZE_QUANTUM];
let ptr = size_class.alloc(); 
// This would happen only if you need to return the size:
let size = size_class.size;
return (ptr, size);

рдХреНрдпрд╛ рдпрд╣реА рд╣реИ?


рдХрдо рд╕реЗ рдХрдо рдЕрдкрдиреЗ рдкреАрдЖрд░ рдХреЗ рд▓рд┐рдП рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЖрд╡рдВрдЯрди_рдЬреИрдорд▓реЛрдХ рдХреЛ, рдЖрд╡рдВрдЯрди_рдмрд╣реБрдд рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрди рд╕реЗ рдЕрдзрд┐рдХ рдХреЛрдб рдЪрд▓ рд░рд╣рд╛ рд╣реИ

рдпрд╣ PR рдПрдХ рдмрдЧрдлрд┐рдХреНрд╕ рдерд╛ (рдПрдХ рдкрд░рдлреЗрдХреНрдЯ рдлрд┐рдХреНрд╕ рдирд╣реАрдВ), рд╣рдорд╛рд░реЗ рдЬреЗрдорд▓реЙрдХ рд▓реЗрдпрд░ рдкрд░рдлреЗрдХреНрдЯ-рд╡рд╛рд░ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдХрдИ рдЪреАрдЬреЗрдВ рдЧрд▓рдд рд╣реИрдВ рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдкреАрдЖрд░ рдпрд╣ рдХрдо рд╕реЗ рдХрдо рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ:

  • nallocx GCC рдЕрд░реНрде рдореЗрдВ рдПрдХ const рдХрд╛рд░реНрдп рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдПрдХ рд╕рдЪреНрдЪрд╛ рд╢реБрджреНрдз рдХрд╛рд░реНрдпред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХреЛрдИ рд╕рд╛рдЗрдб-рдЗрдлреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рддрд░реНрдХреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдХрд┐рд╕реА рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рддрд░реНрдХ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рд╣реИрдВ (рдЗрд╕рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИ), рдФрд░ C / C ++ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП LLVM рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдХреЙрд▓ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЬрд╛рдирдХрд╛рд░реАред AFAIK рдЬрдВрдЧ рд╡рд░реНрддрдорд╛рди рдореЗрдВ const fn рдпрд╛ рд╕рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ FFI C рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИред рддреЛ рдпрд╣ рдкрд╣рд▓реА рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ realloc_excess рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп-рд▓рд╛рдЧрдд рдмрдирд╛ рджреЗрдЧрд╛ рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдЗрдирд▓рд╛рдЗрдирд┐рдВрдЧ рдФрд░ рдЕрдиреБрдХреВрд▓рди рдареАрдХ рд╕реЗ рдХрд╛рдо рди рдХрд░реЗрдВред
  • nallocx рдХреЛ рд╣рдореЗрд╢рд╛ mallocx рдЕрдВрджрд░ рд╕рдВрд░реЗрдЦрд┐рдд рдЖрд╡рдВрдЯрди рдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╕рднреА рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди mallocx рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рджреВрд░ рдлреЗрдВрдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛ рдмрд╛рд░ рдЧрдгрдирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ , рдФрд░ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ nallocx рд▓рдЧрднрдЧ mallocx рд░реВрдк рдореЗрдВ рдорд╣рдВрдЧрд╛ рд╣реИ ... рдореЗрд░реЗ рдкрд╛рд╕ рдЬреИрдорд▓реЛрдХреЗрдЯрд░ рдХрд╛ рдПрдХ рдХрд╛рдВрдЯрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреА рд╢рд╛рдЦрд╛рдУрдВ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдКрдкрд░ рд╕реЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП jemalloc рдПрдХ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рджреВрд░ рдирд╣реАрдВ рдлреЗрдВрдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдлрд┐рдХреНрд╕ рдХреЗрд╡рд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ Excess рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
  • рдФрд░ рдлрд┐рд░ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рджреЛ рдмрд╛рд░ рд╕рдВрд░реЗрдЦрд┐рдд рдЭрдВрдбреЗ рдХреА рдЧрдгрдирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдПрд▓рдПрд▓рд╡реАрдПрдо рд╣рдорд╛рд░реА рддрд░рдл рд╕реЗ рдЕрдиреБрдХреВрд▓рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдФрд░ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрдЪреНрдЫ)ред

рддреЛ рд╣рд╛рдБ, рдпрд╣ рдЕрдзрд┐рдХ рдХреЛрдб рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХреЛрдб рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛ рдмрд╛рд░ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓реА рдмрд╛рд░ рдЬрдм рд╣рдордиреЗ рдЗрд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рддреЛ рд╣рдордиреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рджреВрд░ рдлреЗрдВрдХ рджрд┐рдпрд╛ред рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рддрдХ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред


EDIT: @sfackler рдЖрдЬ рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдордп рдореБрдХреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ рдФрд░ alloc_excess alloc рджрд┐рдП, рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдУрд╡рд░рд╣реЗрдб рдореЗрдВ ~ 1ns рдХрд╛ рдУрд╡рд░рд╣реЗрдб рд╣реИ jemallocs рдХрд╛ рддреЗрдЬрд╝ рдкрдеред рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреЗрдЬрд╝ рдкрде рдкрд░ рдмрд╣реБрдд рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЧреЗ рдЗрд╕реЗ рд╕реБрдзрд╛рд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдБ рд╣реИрдВ: https://github.com/jemalloc/jemalloc/issues/1074#issuecomment -345040339

рдХреНрдпрд╛ рдпрд╣реА рд╣реИ?

рд╣рд╛рдБред

рддреЛ рдпрд╣ рдкрд╣рд▓реА рдЪреАрдЬрд╝ рд╣реИ рдЬрд┐рд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ-рд╢реВрдиреНрдп рдЬрд╝реАрд░реЛ-рдХреЙрд╕реНрдЯ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдЗрдирд▓рд╛рдЗрдирд┐рдВрдЧ рдФрд░ рдЕрдиреБрдХреВрд▓рди рдареАрдХ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдЬрдм рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЗрдирд▓реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЗрд╕рдХрд╛ рдПрдкреАрдЖрдИ рд╕рднреА рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдРрд╕рд╛ рдПрдкреАрдЖрдИ рдХрдо рд╕реЗ рдХрдо рд╕рднреА рдЙрдкрдпреЛрдЧреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬреЛ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХ рд╢рд░реНрдд рд╣реИ рдХрд┐ рдбрд┐рдЬрд╛рдЗрди рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред

рдЬреАрдердм рдкрд░ рд╢рд╛рдмреНрджрд┐рдХ рд╢реВрдиреНрдп рдХреЛрдб рд╣реИ рдЬреЛ alloc_excess рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдЗрддрдиреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рддреЛ рдХрд┐рд╕реА рдиреЗ рдХрднреА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ? C ++ рдХрд╛ рдЖрдмрдВрдЯрди API рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд╖рдорддрд╛ рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкреАрдЫреЗ рдХреА рд╕рдВрдЧрдд рддрд░реАрдХреЗ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ / рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд╕реАрдзрд╛ рд▓рдЧрддрд╛ рд╣реИ рдпрджрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдареЛрд╕ рд╕рдмреВрдд рд╣реИрдВ рдХрд┐ рд╡реЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдИ рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИред

рдЬрдм рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЗрдирд▓реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдлрд┐рд░ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдХрдо рд╕реЗ рдХрдо рдПрд▓рдЯреАрдУ рдмрд┐рд▓реНрдб рдХреЗ рд▓рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ jemalloc рдЬреИрд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдЗрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ: nallocx рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдпрд╣ _by design_ рд╣реИ, рдФрд░ рдкрд╣рд▓рд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ jemalloc рдХреЗ рджреЗрд╡реЛрдВ рдиреЗ рд╣рдореЗрдВ alloc_excess рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрдирд╛рдпрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрди рдХреЙрд▓ рдЗрдирдмрд┐рд▓реНрдЯ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╣рдореЗрдВ C рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдареАрдХ рд╕реЗ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЙрд▓-рд╕рд╛рдЗрдЯреНрд╕ рд╕реЗ nallocx рдХреЙрд▓ рд╣рдЯрд╛ рджреЗрдВ рдЬреЛ рдХрд┐ рдирд╣реАрдВ Excess , рдЬреИрд╕реЗ C рдФрд░ C ++ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддрдм рднреА Excess API рдХреЛ jemalloc API рдкреИрдЪ рдХрд░рдХреЗ рд╢реВрдиреНрдп-рд▓рд╛рдЧрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдореЗрд░реЗ рд░рд╕реНрдЯ-рд▓реИрдВрдЧ / рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрдЪ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ / jemalloc рдХрд╛рдВрдЯрд╛)ред рд╣рдо рдпрд╛ рддреЛ рд╕реНрд╡рдпрдВ рдЙрд╕ рдПрдкреАрдЖрдИ рдХреЛ рдмрдирд╛рдП рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЗрд╕реЗ рдКрдкрд░ рдХреА рдУрд░ рдЙрддрд╛рд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рднреВрдорд┐ рдХреЗ рдКрдкрд░ рдХреА рдУрд░ рд╣рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рдорд╛рдорд▓рд╛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпреЛрдВ рдпреЗ рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдВ рдЗрди рдЕрдиреБрдХреВрд▓рди рдХрд░ рд╕рдХрддреА рд╣реИрдВ рдФрд░ рдЬрдВрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреАред рдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдФрд░ рддрд░реНрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдирдпрд╛ рдПрдкреАрдЖрдИ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП mallocx + nallocx рд╕реЗ рдХрд╛рдлреА рддреЗрдЬ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ Excess ред

рдпрджрд┐ рдпрд╣ рдЗрддрдиреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рддреЛ рдХрд┐рд╕реА рдиреЗ рдХрднреА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ?

рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рд╡рд╛рд▓ рд╣реИред std::Vec Excess API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯрд░-рдЪрд╛рдЗрд▓реНрдб рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореЗрд░реА рд╕рднреА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ "рдпрд╣ рдмрддрд╛рддреЗ рд╣реБрдП" рдФрд░ Excess рд╕реЗ рдЧрд╛рдпрдм рд╣реИрдВ рдПрдкреАрдЖрдИ "рдореИрдВ Vec рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ред Excess API:

  • Excess рдХреЛ рдмрд┐рд▓рдХреБрд▓ рдирд╣реАрдВ рд▓реМрдЯрд╛ рд░рд╣рд╛ рдерд╛: https://github.com/rust-lang/rust/pull/45614
  • grow_in_place_excess рдФрд░ alloc_zeroed_excess рдЬреИрд╕реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЦреЛ рд░рд╣реА рд╣реИ
  • FFI рдореЗрдВ C рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдареАрдХ рд╕реЗ рдкреНрд░рдЪрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: https://github.com/rust-lang/rust/issues/46046
  • ... (рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдпрд╣рд╛рдБ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ)

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреЛрдИ рднреА рдЗрд╕ API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ std рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбреЗрдЯрд╛-рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИ, рдпрд╣ ( Vec ) рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдЕрдЧрд░ рдореБрдЭреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдерд╛, рддреЛ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдореБрдЦреНрдп рдХрд╛рд░рдг рдпрд╣ рд╣реИ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣ API рдЯреВрдЯ рдЧрдпрд╛ рд╣реИред

рдЕрдЧрд░ рдореБрдЭреЗ рдЖрдЧреЗ рднреА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдиреЗ рднреА рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА std рд╕рдВрдЧреНрд░рд╣ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛) , рдФрд░ рдЗрд╕рд▓рд┐рдП рднреА рдХреНрдпреЛрдВрдХрд┐ _excess рдФрд░ Excess рд╣рд░ рдЬрдЧрд╣ usable_size / allocation_size рд▓рд┐рдП рдЕрддреНрдпрдВрдд рднреНрд░рд╛рдордХ / рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИред

рдпрд╣ рд╕рдВрднрд╡рддрдГ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдп Excess -рд░рд╣рд┐рдд API рдореЗрдВ рдбрд╛рд▓реЗ рдЧрдП рдереЗ, рдФрд░ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рджреЛ API рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕рд┐рдВрдХ рдореЗрдВ рд░рдЦрдирд╛ рдХрдард┐рди рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдирд╛ рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рдирддреЗ рд╣реИрдВред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛ рдкрд╕рдВрдж рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред

рдпрд╛ рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рджреЛ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдПрдкреАрдЖрдИ рд╣реИрдВ, рдФрд░ рдореИрдВрдиреЗ 100% рдХрд╛рдо рдХреЛ рдПрдХ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрд╛рдпрд╛ рд╣реИ, рдФрд░ 0% рдХрд╛рдо рдореЗрдВ рджреВрд╕рд░реЗ рдХреЛ рд╕реБрдзрд╛рд░рдиреЗ рдореЗрдВ, рддреЛ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪрдирд╛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рджреВрд╕рд░реЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред

рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдБ, рдпреЗ рдХреЗрд╡рд▓ рджреЛ рдХреЙрд▓ nallocx рд╣реИрдВ рдЬреЗрдерд╛рд▓реЙрдХ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рд╣рд░ рдорд┐рдерд┐рд▓рд╛ рдкрд░:

https://github.com/facebook/folly/blob/f2925b23df8d85ebca72d62a69f1282528c086de/folly/detail/ThreadLocalDetail.cpp#L182
https://github.com/louishust/mysql5.6.14_tokudb/blob/4897660dee3e8e340a1e6c8c597f3b2b7420654a/storage/tokudb/ft-index/ftcxx/malloc_utils.hpp#L91

рджреЛрдиреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╡рд░реНрддрдорд╛рди alloc_excess API рд╕реЗ рдорд┐рд▓рддрд╛-рдЬреБрд▓рддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрд╡рдВрдЯрди рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдкрд╛рдЪреЗ рдПрд░реЛ рдиреЗ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ nallocx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдкрд╛рдпрд╛ рдХрд┐ рдЪреАрдЬреЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ:

https://issues.apache.org/jira/browse/ARROW-464

рдпреЗ рдореВрд▓ рд░реВрдк рд╕реЗ nallocx рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕рдВрджрд░реНрдн рд╣реИрдВред рдпрд╣ рдХреНрдпреЛрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдПрдкреАрдЖрдИ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрд╕реНрдкрд╖реНрдЯ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ?

рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдБ, рдпреЗ рдЧрд┐рдереВрдм рдкрд░ рдЬреЗрдорд▓реЙрдХ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рд╣рд░ рдирд╛рд▓реЛрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рджреЛ рдХреЙрд▓ рд╣реИрдВ:

рдореЗрд░реЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╕реЗ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ (рдХрдо рд╕реЗ рдХрдо рдлреЗрд╕рдмреБрдХ рдХреЗ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рдХрд╛рд░ рдкрд░ рдлреЗрд╕рдмреБрдХ рдХреЗ malloc рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ malloc рдФрд░ fbvector рд╡рд┐рдХрд╛рд╕ рдиреАрддрд┐ , рдлреЗрд╕рдмреБрдХ рдЗрд╕ рдкреНрд░рдпреЛрдЧ рдореЗрдВ рд╕реА рдХреЗ ++ рдХреЗ рд╡реИрдХреНрдЯрд░ рдПрдХ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ) рдФрд░ рдпрд╣ рднреА рдХрд┐ рдЪреИрдкрд▓ рдпрд╣ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ String рдкреНрд░рдХрд╛рд░ ( рдпрд╣рд╛рдВ рдФрд░ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ ) рдХрд╛ рдкреНрд░рджрд░реНрд╢рдиред рддреЛ рд╢рд╛рдпрдж рдЖрдЬ рдЧрд┐рддреБрдм рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рджрд┐рди рдирд╣реАрдВ рдерд╛?

рдпрд╣ рдХреНрдпреЛрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдПрдкреАрдЖрдИ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрд╕реНрдкрд╖реНрдЯ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ?

рдПрдХ рдЖрд╡рдВрдЯрди рдПрдкреАрдЖрдИ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд▓реЗрдХрд┐рди рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╕рдорд░реНрдерди рдРрд╕реЗ рдПрдкреАрдЖрдИ рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЛ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕реЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЛ рдХреНрдпреЛрдВ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдЧрд░ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдкреАрдЫреЗ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдЗрд╕реЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЛ рдХреНрдпреЛрдВ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдЧрд░ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдкреАрдЫреЗ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдбрд┐рдЬрд╝рд╛рдЗрди рд╕реНрдкреЗрд╕ рдХрд╛ рдЖрдзрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЦреЛрдЬрд╛ рдЧрдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдкреАрдЖрдИ рдХреЗ рдЧреИрд░-рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдмрдВрдзрд┐рдд рд╣рд┐рд╕реНрд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд-рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрдВрдЧреЗ? рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдЙрд╕ рдЪрд░реНрдЪрд╛ рдХрд╛ рдЖрдзреЗ-рдЕрдзреВрд░реЗ рдорди рд╕реЗ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рдпрджрд┐ рд╣рдо рдпрд╣ рдПрдкреАрдЖрдИ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

fn alloc(...) -> (*mut u8, usize) { 
   // worst case system API:
   let ptr = malloc(...);
   let excess = malloc_excess(...);
   (ptr, excess)
}
let (ptr, _) = alloc(...); // drop the excess

рдЗрд╕ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрд╢рд▓:

fn alloc(...) -> *mut u8 { 
   // worst case system API:
   malloc(...)
}
let ptr = alloc(...);

рддрдм рд╣рдореЗрдВ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред

рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдкреАрдЖрдИ рдХреЗ рдЧреИрд░-рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдмрдВрдзрд┐рдд рд╣рд┐рд╕реНрд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд-рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрдВрдЧреЗ?

рддреЛ рд╣рд╛рдВ, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЕрдЪреНрдЫреЗ рдЕрддрд┐рд░рд┐рдХреНрдд-рдПрдкреАрдЖрдИ рдХрд╛ рдЧреИрд░-рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝реЗрдЧрд╛: рдпрд╣ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджреЗрдЧрд╛ред

рдЗрд╕рд╕реЗ рд╕рд┐рдВрдХ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рджреЛ рдПрдкреАрдЖрдИ рдХреА рдореМрдЬреВрджрд╛ рд╕реНрдерд┐рддрд┐ рдХреЛ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЬрд┐рд╕рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд-рдПрдкреАрдЖрдИ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд-рдХрдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИред рдЬрдмрдХрд┐ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд-рдкреВрд░реНрдг рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд-рдХрдо рдПрдкреАрдЖрдИ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд╕рдЪ рдирд╣реАрдВ рд╣реИред

рдЬреЛ рд▓реЛрдЧ Excess рдЧрд┐рд░рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдмреИрдХрд╡рд░реНрдб-рд╕рдВрдЧрдд рддрд░реАрдХреЗ рд╕реЗ рддрдереНрдп рдХреЗ рдмрд╛рдж alloc_excess рдкрджреНрдзрддрд┐ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдерд╛, рддреЛ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реЛрдВрдЧреЗ? (рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, alloc_excess рдмрд┐рдирд╛ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛; рдореИрдВ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдВ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЗ рддрд░реНрдХ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ)

@ рдЬреЛрд╢рдлреНрд▓реЗ рдРрд╕рд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реАрдзрд╛ рд╣реИред

: рдШрдВрдЯреА: рдпрд╣ рдЕрдм рдКрдкрд░ рдХреА рдЕрдкрдиреА рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдЕрд╡рдзрд┐ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ ред : рдШрдВрдЯреА:

рдЬреЛ рд▓реЛрдЧ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, 0.01% рд▓реЛрдЧ рдЬреЛ рдЕрдзрд┐рдХ рдХреНрд╖рдорддрд╛ рдХреА рджреЗрдЦрднрд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@sfackler рдпрд╣ рдореБрдЭреЗ рдЬрдВрдЧ рд╕реЗ рджреЛ рд╕рдкреНрддрд╛рд╣ рдХрд╛ рдмреНрд░реЗрдХ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рд▓рддрд╛ рд╣реИ - рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрджреНрдзрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рддрд╛ рд╣реВрдВ :)

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, 0.01% рд▓реЛрдЧ рдЬреЛ рдЕрдзрд┐рдХ рдХреНрд╖рдорддрд╛ рдХреА рджреЗрдЦрднрд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдирдВрдмрд░ рдЖрдкрдХреЛ рдХрд╣рд╛рдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ?

рдореЗрд░реА рд╕рднреА рд░рд╕реНрдЯ рдбреЗрдЯрд╛-рд╕рдВрд░рдЪрдирд╛рдПрдВ рдореЗрдореЛрд░реА рдореЗрдВ рдлреНрд▓реИрдЯ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдЬрдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ; рдЕрдЧрд░ рдореИрдВ рд╕рд┐рд░реНрдл рдмреЙрдХреНрд╕ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдПрдХ рдЕрд▓рдЧ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрд╕ рд╕рдордп рдХреЗ Excess 0.01% рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рд╣рд░ рд╕рдордп рдЗрд╕рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реВрдВред

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдбреЛрдореЗрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рдФрд░ рдпрд╣ рдХрд┐ рдЕрдиреНрдп рдбреЛрдореЗрди рдореЗрдВ рд▓реЛрдЧ рдХрднреА рднреА Excess рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ 0.01% Rust рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ (рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЛрдЧ Vec рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ String , рдЬреЛ Excess рд▓рд┐рдП рдкреЛрд╕реНрдЯрд░-рдЪрд╛рдЗрд▓реНрдб рдбреЗрдЯрд╛-рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВ)ред

рдореБрдЭреЗ рдЗрд╕ рддрдереНрдп рд╕реЗ рд╡рд╣ рд╕рдВрдЦреНрдпрд╛ рдорд┐рд▓ рд░рд╣реА рд╣реИ рдХрд┐ рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ 4 рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдирд╛рд▓реЛрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ, рдЙрди рдЪреАрдЬреЛрдВ рдХреЗ рд╕реЗрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЬреЛ рдореЙрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред

@gnzlbg

рдХреНрдпрд╛ рдЖрдк рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рд╣рдордиреЗ рдЗрд╕реЗ рд╢реБрд░реВ рд╕реЗ "рд╕рд╣реА" рдХрд┐рдпрд╛, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╕ fn alloc(layout) -> (ptr, excess) рдФрд░ fn alloc(layout) -> ptr рдмрд┐рд▓рдХреБрд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛? рдпрд╣ рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рд╕реЗ рджреВрд░ рд▓рдЧрддрд╛ рд╣реИред рдпрджрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрд▓рдмреНрдз рд╣реИ, рддреЛ рднреА рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рдж рдХреЗ рдПрдкреАрдЖрдИ рдХрд╛ рд╣реЛрдирд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ, рдЬрд╣рд╛рдВ рдЕрдзрд┐рдХ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ (рдЬреИрд╕реЗ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреЗрдбрд╝ рд╕рдВрд░рдЪрдирд╛рдПрдВ), рднрд▓реЗ рд╣реА рдЗрд╕реЗ alloc_excess(layout).0 рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред

@rkruppe

рдпрд╣ рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рд╕реЗ рджреВрд░ рд▓рдЧрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрд▓рдмреНрдз рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рдж рдХреЗ рдПрдкреАрдЖрдИ рдХрд╛ рд╣реЛрдирд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ, рдЬрд╣рд╛рдВ рдЕрдзрд┐рдХ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреЗрдбрд╝ рд╕рдВрд░рдЪрдирд╛рдПрдВ), рднрд▓реЗ рд╣реА рдЗрд╕реЗ рдЖрд╡рдВрдЯрди_ рд▓реЗрдЖрдЙрдЯ (рд▓реЗрдЖрдЙрдЯ) .0 рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдЕрддрд┐рд░рд┐рдХреНрдд-рдкреВрд░реНрдг API рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд-рдХрдо рдПрдХ рдХреЗ рдКрдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдзрд┐рдХ-рдХрдо рдЖрдмрдВрдЯрдХ рдХреЗ рд▓рд┐рдП Alloc рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ alloc рдФрд░ dealloc рд╡рд┐рдзрд┐рдпрд╛рдБ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдореИрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд-рдкреВрд░реНрдг рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП Alloc рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдФрд░ рдЕрдзрд┐рдХ рддрд░реАрдХреЗ (рдХрдо рд╕реЗ рдХрдо alloc_excess рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрдврд╝рддрд╛ рд╣реИ рдЕрдЧрд░ рд╣рдо realloc_excess ,) alloc_zeroed_excess , grow_in_place_excess , ...)ред

рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдХрд░ рд░рд╣реЗ рдереЗ, рдЕрд░реНрдерд╛рдд, рдЕрдзрд┐рдХ-рдкреВрд░реНрдг рдПрдкреАрдЖрдИ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╢реАрд░реНрд╖ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рддреЛ alloc_excess рдФрд░ dealloc рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ред

рдЬрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░рд┐рдЯрд░реНрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХреНрд╡реЗрд░реА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡реЗ рдХреЗрд╡рд▓ рдЗрдирдкреБрдЯ рдЖрдХрд╛рд░ рдпрд╛ рд▓реЗрдЖрдЙрдЯ (рдЬреЛ рдПрдХ рдЫреЛрдЯреА рдЕрд╕реБрд╡рд┐рдзрд╛ рд╣реИ) рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ рднреА рддрд░реАрдХреЗред


@sfackler

рдореБрдЭреЗ рдЗрд╕ рддрдереНрдп рд╕реЗ рд╡рд╣ рд╕рдВрдЦреНрдпрд╛ рдорд┐рд▓ рд░рд╣реА рд╣реИ рдХрд┐ рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ 4 рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдирд╛рд▓реЛрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ, рдЙрди рдЪреАрдЬреЛрдВ рдХреЗ рд╕реЗрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЬреЛ рдореЙрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред

рд░реБрд╕реНрдЯ рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо рдореЗрдВ _excess рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрди рддрдереНрдпреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП:

  • рдХреБрд▓ рдЪреАрдЬреЗрдВ 0 _excess рдЬрдВрдЧ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ
  • рдХреБрд▓ рдЪреАрдЬреЗрдВ 0 _excess рдЬрдВрдЧ рдПрд╕рдЯреАрдбреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ
  • Vec рдФрд░ String _excess std
  • _excess API рдЕрд╕реНрдерд┐рд░ рд╣реИ, рдЕрддрд┐рд░рд┐рдХреНрдд-рдХрдо API рдХреЗ рд╕рд╛рде рдЖрдЙрдЯ-рд╕рд┐рдВрдХ, рдмрд╣реБрдд рдкрд╣рд▓реЗ рддрдХ рдЫреЛрдЯреА рдЧрд╛рдбрд╝реА (рдЬрдм рддрдХ excess рдмрд┐рд▓рдХреБрд▓ рднреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛), ...

    рдФрд░ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ _excess рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпреЗ рддрдереНрдп рджрд┐рдП рдЧрдП рд╣реИрдВ:

  • jemalloc рдХрд╛ API рдореВрд▓ рд░реВрдк рд╕реЗ рдмреИрдХрд╡рд░реНрдб рд╕рдВрдЧрддрддрд╛ рдХреЗ рдХрд╛рд░рдг C рдпрд╛ C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ

  • рд╕реА рдФрд░ рд╕реА ++ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЬреЛ рдХрд┐ рдЬреЗрдорд▓реЙрдХ рдХреА рдЕрддрд┐рд░рд┐рдХреНрдд рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЗрд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд░рд╛рд╕реНрддреЗ рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛:

    • рд╕рд┐рд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рдФрд░ рдЬреЗрдорд▓реЙрдХ (рдпрд╛ tcmalloc) рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛

    • рдЙрдирдХреА рднрд╛рд╖рд╛ рдХреЗ рдПрд╕рдЯреАрдбреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ (C ++ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрд╕рдВрдЧрдд рдПрд╕рдЯреАрдбреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ)

    • рдЗрд╕ рдЕрд╕рдВрдЧрдд std рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЕрдкрдирд╛ рдкреВрд░рд╛ рд╕реНрдЯреИрдХ рд▓рд┐рдЦреЗрдВ

  • рдХреБрдЫ рд╕рдореБрджрд╛рдп (рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдлреЗрд╕рдмреБрдХ C ++ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ, ...) рдЕрднреА рднреА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рддреЗ рд╣реИрдВред

рдпреЗ рджреЛ рддрд░реНрдХ рдореЗрд░реЗ рд▓рд┐рдП рдкреНрд░рд╢рдВрд╕рдиреАрдп рд╣реИрдВ:

  • excess API std рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП std рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд░реБрд╕реНрдЯ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рдПрдХ рдмрд╛рд░ рднреА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред
  • рднрд▓реЗ рд╣реА C рдФрд░ C ++ рдЗрд╕ API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдмрдирд╛ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдирдкрд╛рд╡рд░ рдХреЗ рд╕рд╛рде рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрдбрд╝реА рд▓рдВрдмрд╛рдИ рддрдХ рдЬрд╛рддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╕рдВрднрд╛рд╡рд┐рдд рдЫреЛрдЯреЗ рд╕рдореБрджрд╛рдп рдХреЗ рд▓реЛрдЧ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ _a lot_ рдХреА рджреЗрдЦрднрд╛рд▓ рдХрд░рддреЗ рд╣реИрдВред

рдЖрдкрдХрд╛ рддрд░реНрдХ:

  • рдХреЛрдИ рднреА _excess API рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ 0.01% рд▓реЛрдЧ рдЗрд╕рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВред

рдирд╣реАрдВ рдХрд░рддрд╛ред

@alexcrichton -> Result<*mut u8, AllocErr> рд╕реЗ -> *mut void рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЖрд╢реНрдЪрд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЖ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ RFC рдХреЗ рдореВрд▓ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ред

рдореИрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдмрд┐рдВрджреБрдУрдВ рд╕реЗ рдЕрд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреА рдПрдХ рдЙрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ Result рдХреЗ "рднрд╛рд░реА-рд╡рдЬрди" рдХреЗ рд╕рд╛рде рдЬреАрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рдПрдХ рдЕрд╢рдХреНрдд рд▓рд╛рдкрддрд╛ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрдврд╝ рдЧрдИ рд╣реИред рд▓реМрдЯреЗ рдореВрд▓реНрдп рдкрд░ рдЬрд╛рдБрдЪ рдХрд░реЗрдВред

  • рдореИрдВ рдПрдмреАрдЖрдИ рджреНрд╡рд╛рд░рд╛ рд▓рдЧрд╛рдП рдЧрдП рд░рдирдЯрд╛рдЗрдо рджрдХреНрд╖рддрд╛ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ @alexcrichton рдХреА рддрд░рд╣

рдХреНрдпрд╛ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╣рдо рдЕрдкрдиреЗ рдЖрдк рд╣реА рдЙрд╕ рджреЗрд░ рд╕реЗ рдмрджрд▓рд╛рд╡ рдкрд░ рджреГрд╢реНрдпрддрд╛ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдПрдХ рддрд░рд╣ рд╕реЗ (рдореЗрд░реЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╕реЗ): рдкрд░рд┐рд╡рд░реНрддрди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЕрдм, рдЕрдкрдиреЗ рдЖрдк рд╣реА рдПрдХ рдкреАрдЖрд░, рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдкрд░ рдореЗрдВ рд╣реИ, рдЬрдмрдХрд┐ Allocator рдЕрднреА рднреА рдЕрд╕реНрдерд┐рд░ рд╣реИред рдФрд░ рдлрд┐рд░ рджреЗрдЦреЗрдВ рдХрд┐ рдкреАрдЖрд░ рдкрд░ рд╢рд┐рдХрд╛рдпрдд рдХреМрди рдХрд░рддрд╛ рд╣реИ (рдФрд░ рдХреМрди рдордирд╛рддрд╛ рд╣реИ!)ред

  • рдХреНрдпрд╛ рдпрд╣ рдмрд╣реБрдд рднрд╛рд░реА-рднрд░рдХрдо рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рднрд╛рд░реА рд╣реИ-рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрджрд▓рд╛рд╡ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рднрд╛рд░реА-рднрд░рдХрдо ...

рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХрд┐ рдХреНрдпрд╛ *mut void рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реИ рдпрд╛ Result<*mut void, AllocErr> : рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ "рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп" рдФрд░ "рдирд┐рдореНрди-рд╕реНрддрд░реАрдп" рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдлрд┐рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ рдПрд▓реЛрдХреЗрдЯрд░ рдЖрд░рдПрдлрд╕реА рдХреЗ рджреНрд╡рд┐рддреАрдп рдореЗрдВ

(рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЕрдЧрд░ рдореБрдЭреЗ *mut void рд╡рд╛рдкрд╕реА рдХреЗ рдореВрд▓реНрдп рдкрд░ рдЧрдВрднреАрд░ рдЖрдкрддреНрддрд┐ рдереА, рддреЛ рдореИрдВ рдЗрд╕реЗ fcpbot рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдЪрд┐рдВрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрдЬ рдХрд░реВрдВрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдордп рдореИрдВ рд╢рд╛рдпрдж рдмрд╣реБрдд рдЬрд░реВрд░реА рд▓рд┐рдмрд╛рд╕ рдЯреАрдо рдХреЗ рдлреИрд╕рд▓реЗ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЗрд╕ рдЖрд╡рдВрдЯрди рдЧрд╛рдерд╛ рдкрд░ рдердХрд╛рди рдХреЗ рдХрд╛рд░рдг рдХреБрдЫ рд╣рд┐рд╕реНрд╕рд╛ред)

@pnkfelix

-> Result<*mut u8, AllocErr> -> *mut void рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЖрд╢реНрдЪрд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЖ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдПрд▓рдПрдлрд╕реА рдХреЗ рдореВрд▓ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ред

рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рддреНрд░реБрдЯрд┐ рдЬрд┐рд╕реЗ рд╣рдо рд╡реНрдпрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ OOM рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдереЛрдбрд╝рд╛ рд╣рд▓реНрдХрд╛ рд╡рдЬрди рдХреЗ рдмреАрдЪ рдореЗрдВ рдЕрднреА рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдХрд╕реНрдорд┐рдХ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рд▓рд╛рдн -> Option<*mut void> ред

@gnzlbg

рдПрд╕рдЯреАрдбреА рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдПрдкреАрдЖрдИ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрд╕рдЯреАрдбреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд░реБрд╕реНрдЯ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рдПрдХ рдмрд╛рд░ рднреА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдлрд┐рд░ рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВред

@pnkfelix

рдЙрддреНрдкрд░рд┐рд╡рд░реНрддреА рд╢реВрдиреНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рдкрд░рд┐рдгрд╛рдо < рдЙрддреНрдкрд░рд┐рд╡рд░реНрддреА рд╢реВрдиреНрдп, AllocErr> рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд╖рдп рдкрд░: рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрд▓рдЧ "рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп" рдФрд░ "рдирд┐рдореНрди-рд╕реНрддрд░реАрдп" рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдлрд┐рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ II рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИред рдПрд▓реЛрдХреЗрдЯрд░ рдЖрд░рдПрдлрд╕реА рдХреЗред

рд╡реЗ рдореВрд▓ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рд╡рд┐рдЪрд╛рд░ рдереЗ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рдПрдкреАрдЖрдИ Alloc рд╣реА alloc_one , alloc_array рдЖрджрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдЧрд╛ред рд╣рдо рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рднреА рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХ рддрдВрддреНрд░ рдореЗрдВ рдкрд╣рд▓реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд▓реЛрдЧ рдХрд┐рди APIs рдкрд░ рдПрдХрд╛рдЧреНрд░ рд╣реЛрддреЗ рд╣реИрдВред

@pnkfelix

рдореИрдВрдиреЗ рд▓реЗрдЖрдЙрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдХреЗрд╡рд▓ рдХреНрд▓реЛрди рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдХреЙрдкреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рд▓реЗрдЖрдЙрдЯ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореИрдВ рдЕрднреА рднреА рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдЖрдЙрдЯ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд░рдЦрддрд╛ рд╣реВрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 16-рд╕рд░рдгреА рдХреА рд╕рдВрд░рдЪрдирд╛ {x: u8, y: [char; 215]}), рддрд╛рдХрд┐ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ рд╣реЛ; рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рд░реВрдЯреАрди рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЬреЛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреА рд╡рд░реНрддрдорд╛рди рд╕рд╛рдордЧреНрд░реА рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХреА рдЧрдИ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдХрд╣реАрдВ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?

@ рд╕реИрдлрдХрд▓рд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдм рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдПрдкреАрдЖрдИ (рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд + _excess рд╡рд┐рдзрд┐рдпреЛрдВ) рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рджреЛ API рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реЛ рдЬрд╛рдКрдВрдЧрд╛ рдФрд░ рдЕрднреА рдкреВрд░рд╛ _excess API рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдЕрднреА рднреА рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдкрд░реЗрд╢рд╛рди рдХрд░рддреА рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЕрднреА рдПрдХ рдПрд▓реЛрдХреЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП alloc + dealloc рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди alloc_excess + dealloc рдХреЛ рднреА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ alloc рдХреЛ alloc_excess рдмрд╛рдж рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдХреЛрдИ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реИ? рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╡реИрд╕реЗ рднреА рдЕрдзрд┐рдХрд╛рдВрд╢ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдмрдбрд╝реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдПрдХ рдЗрдЪреНрдЫрд╛ рдХреА рддрд░рд╣ред


jemallocator Alloc рджреЛ рдмрд╛рд░ ( Jemalloc рдФрд░ &Jemalloc ), рдЬрд╣рд╛рдБ Jemalloc рдХреБрдЫ method рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд┐рд░реНрдл (&*self).method(...) рдХрд┐ рд╡рд┐рдзрд┐ &Jemalloc рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдЖрддреА рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ Alloc Jemalloc рд╕рд┐рдВрдХ рдХреЗ рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред &/_ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рджреБрдЦрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред


рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рд▓реЛрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдПрдХрдорд╛рддреНрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЬреЛ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд░рд╛рдд рдХреЗ рд░рд╛рд╕реНрддреЗ (рдЗрдорджрд╛рджреА, рд░реЗрдбреЙрдХреНрд╕) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдореБрдЭреЗ рдмрд╣реБрдд рдЪрд┐рдВрддрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдРрд╕рд╛ рдХреЛрдИ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдорд┐рд▓рд╛ рдЬреЛ рдЗрд╕реЗ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реЛ (рд╢рд╛рдпрдж рдореИрдВ рд╕рд┐рд░реНрдл рдЕрд╢реБрдн рдерд╛ рдФрд░ рдХреБрдЫ рд╣реИрдВ?)ред рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ SmallVec рдФрд░ ArrayVec Vec -рдЙрдЪреНрдЪ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдерд╛ ( std::Vec Alloc рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрднреА рддрдХ), рдФрд░ рдпрд╣ рднреА рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдХреНрд▓реЛрдирд┐рдВрдЧ рдХреИрд╕реЗ рд╣реЛрдЧреА ( Vec s рдПрдХ рдЕрд▓рдЧ Alloc ator рдХреЗ рд╕рд╛рде) рдХрд╛рдо рдХрд░реЗрдЧрд╛ (рдпрд╣реА рд╢рд╛рдпрдж рдХреНрд▓реЛрдирд┐рдВрдЧ Box рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ) рдЕрд▓рдЧ Alloc s рдХреЗ рд╕рд╛рде Box es)ред рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдХрд┐ рдпреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╣реАрдВ-рдХрд╣реАрдВ рдХреИрд╕реЗ рджрд┐рдЦреЗрдВрдЧреЗ?

рдХреЗрд╡рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдЬреЛ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд░рд╛рддреНрд░рд┐рдХрд╛рд▓реАрди рд░рд╛рд╕реНрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ (рд╕рд░реНрд╡реЛ, рд░рд┐рдбреЙрдХреНрд╕)

рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдХреНрдпрд╛ рд╣реИ, рд╕рд░реНрд╡реЛ рдЬрд╣рд╛рдВ рд╕рдВрднрд╡ рд╣реЛ, рдЕрд╕реНрдерд┐рд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рд╕реЗ рджреВрд░ рдЬрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ: https://github.com/servo/servo/issues/5286

рдпрд╣ рдЪрд┐рдХрди рдФрд░ рдЕрдВрдбреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рднреА рд╣реИред рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ Alloc рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрднреА рднреА рдЕрд╕реНрдерд┐рд░ рд╣реИред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ _excess API рдХрд╛ рдкреВрд░реНрдг рдкреВрд░рдХ рдХреНрдпреЛрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡реЗ рдореВрд▓ рд░реВрдк рд╕реЗ jemalloc рдХреЗ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ * рдПрд▓реЙрдЯрдо рдПрдкреАрдЖрдИ рдХреЛ рдорд┐рд░рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдереЗ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдкреВрд░реЗ рдПрдкреАрдЖрдИ рд╕рддрд╣ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдХрдИ рд╕рд╛рд▓реЛрдВ рдкрд╣рд▓реЗ 4.0 рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЙрдирдХреЗ рдиреЗрддреГрддреНрд╡ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдХреНрдпрд╛ рдмрд╛рдж рдореЗрдВ рдПрд▓реЛрдХреЗрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЖрд╡рдВрдЯрди рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реИ?

рд╣рдо рдХреА рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ alloc рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ alloc_excess , рд▓реЗрдХрд┐рди alloc_excess рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА alloc ред рдпрджрд┐ рдЖрдк рдПрдХ рдпрд╛ рджреЛрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд░рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдпрд╛ рддреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХрд╛ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрд╕реАрдо рд░реВрдк рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдкрд╣рд▓реЗ рдЖрдпрд╛ рд╣реИ (рд╢рд╛рдпрдж Rand ?), рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдХрд╣рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХрдо рд╕реЗ рдХрдо рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╣рдо рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред

рдпрд╣ рдореБрдЭреЗ рдмрд╣реБрдд рдЪрд┐рдВрддрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдРрд╕рд╛ рдХреЛрдИ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдорд┐рд▓рд╛ рдЬреЛ рдЗрд╕реЗ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реЛ (рд╢рд╛рдпрдж рдореИрдВ рд╕рд┐рд░реНрдл рдЕрд╢реБрдн рдерд╛ рдФрд░ рдХреБрдЫ рд╣реИрдВ?)ред

рдореИрдВ рдХрд┐рд╕реА рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдХреЗрд╡рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдЬреЛ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд░рд╛рддреНрд░рд┐рдХрд╛рд▓реАрди рд░рд╛рд╕реНрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ (рд╕рд░реНрд╡реЛ, рд░рд┐рдбреЙрдХреНрд╕)

рдЗрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рд╡рд╛рд▓реА рдПрдХ рдмрдбрд╝реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ stdlib рд╕рдВрдЧреНрд░рд╣ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдиреНрдп рд╕рднреА рдЯреЛрдХрд░рд╛рдУрдВ рдХреЛ рднреА рд░реЛрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдмрд╛рд╣рд░реА рд╕рдВрдЧреНрд░рд╣ рд╣реБрдб рдХреЗ рддрд╣рдд рдЖрдВрддрд░рд┐рдХ рд▓реЛрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ( Box , Vec , рдЖрджрд┐)ред

рдХреЗрд╡рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдЬреЛ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд░рд╛рддреНрд░рд┐рдХрд╛рд▓реАрди рд░рд╛рд╕реНрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ (рд╕рд░реНрд╡реЛ, рд░рд┐рдбреЙрдХреНрд╕)

рдЗрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рд╡рд╛рд▓реА рдПрдХ рдмрдбрд╝реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ stdlib рд╕рдВрдЧреНрд░рд╣ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдмрд╕реЗ рдЕрдиреНрдп рдмрдХреНрд╕реЗ precludes, рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдмрд╛рд╣рд░реА рд╕рдВрдЧреНрд░рд╣ рд╣реБрдб (рдмреЙрдХреНрд╕, рд╡реАрдИрд╕реА, рдЖрджрд┐) рдХреЗ рддрд╣рдд рдЖрдВрддрд░рд┐рдХ рд▓реЛрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ - рдореБрдЭреЗ рдПрдХ рдЦрд┐рд▓реМрдирд╛ рдХрд░реНрдиреЗрд▓ рдорд┐рд▓рд╛ рд╣реИ, рдФрд░ рдЕрдЧрд░ рдореИрдВ Vec<T, A> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореБрдЭреЗ рдПрдХ рдЖрдВрддрд░рд┐рдХ-рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдореБрдЦреМрдЯрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рд╕рдХрд▓ рд╣реИред

@remexre рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдХреЗ рд╕рд╛рде рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ

рдЕрднреА рднреА рдЖрдВрддрд░рд┐рдХ-рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рд╣реЛрдЧреА рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕реЗрдЯрдЕрдк рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдЕрдиреБрдкрдпреЛрдЧреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╕реНрдореГрддрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ set_allocator рдлрд╝рдВрдХреНрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдореИрдк рди рд╣реЛред


рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ : рдмрд╕ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореИрдВрдиреЗ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджрд┐рдпрд╛ред рдЕрднреА, рдореБрдЭреЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдорд┐рд▓рд╛ рд╣реИ:

struct BumpAllocator{ ... }
struct RealAllocator{ ... }
struct LinkedAllocator<A: 'static + AreaAllocator> {
    head: Mutex<Option<Cons<A>>>,
}
#[global_allocator]
static KERNEL_ALLOCATOR: LinkedAllocator<&'static mut (AreaAllocator + Send + Sync)> =
    LinkedAllocator::new();

рдЬрд╣рд╛рдВ AreaAllocator рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ (рд░рдирдЯрд╛рдЗрдо рдкрд░) рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рджреЗрддреА рд╣реИ рдХрд┐ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдЧрд▓рддреА рд╕реЗ "рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ" рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдкрддреЗ рдХреА рд╕реАрдорд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╡реЗ рдЬрд┐рд╕ рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ)ред BumpAllocator рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рд╕реНтАНрдХреНрд░реИрдЪ рд╕реНтАНрдкреЗрд╕ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЬрд▓реНтАНрджреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм RealAllocator s рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЗрд╖ рдореЗрдореЛрд░реА рдХреА рдореИрдкрд┐рдВрдЧ рдХреА рдЬрд╛рддреА рд╣реИред

рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдореИрдВ рдПрдХ Mutex<Option<RealAllocator>> (рдпрд╛ рдПрдХ рдЖрд╡рд░рдг рдЬреЛ рдЗрд╕реЗ "рдЗрдиреНрд╕рд░реНрдЯ-рдУрдирд▓реА" рдмрдирд╛рддрд╛ рд╣реИ) рдПрдХрдорд╛рддреНрд░ рдЖрдмрдВрдЯрдирдХрд░реНрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдФрд░ рдЖрд░рдВрднрд┐рдХ рдмреВрдЯ BumpAllocator рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рдЪрд╛рд▓рд┐рдд рд╣реЛрдиреЗ рдкрд░ рд╕рдм рдХреБрдЫ рдЖрдмрдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

@sfackler

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ _excess API рдХрд╛ рдкреВрд░реНрдг рдкреВрд░рдХ рдХреНрдпреЛрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡реЗ рдореВрд▓ рд░реВрдк рд╕реЗ jemalloc рдХреЗ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ * рдПрд▓реЙрдЯрдо рдПрдкреАрдЖрдИ рдХреЛ рдорд┐рд░рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдереЗ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдкреВрд░реЗ рдПрдкреАрдЖрдИ рд╕рддрд╣ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдХрдИ рд╕рд╛рд▓реЛрдВ рдкрд╣рд▓реЗ 4.0 рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЙрдирдХреЗ рдиреЗрддреГрддреНрд╡ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд╡рд░реНрддрдорд╛рди рдореЗрдВ shrink_in_place рдХреЙрд▓ xallocx рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрд╡рдВрдЯрди рдЖрдХрд╛рд░ рджреЗрддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ shrink_in_place_excess рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЗрд╕ рдЖрдХрд╛рд░ рдХреЛ рджреВрд░ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрд╕реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП nallocx рдХрд╛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреА рд▓рд╛рдЧрдд рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ рдХрд┐ рдЖрд╡рдВрдЯрди рдХрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдЬреЗрдорд▓реЙрдХ рдЖрд╡рдВрдЯрди рдХрд╛рд░реНрдп рдЬреЛ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡реЗ рд╣рдореЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЖрдХрд╛рд░ рд╡рд╛рдкрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдПрдкреАрдЖрдИ рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

@remexre

рдЬрдм рдореИрдВ рдЕрдкрдиреЗ рдЦрд┐рд▓реМрдирд╛ рдХрд░реНрдиреЗрд▓ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рддреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреЛрдИ рдЖрд╡рдВрдЯрди рдирд╣реАрдВ рд╣реБрдЖ, рдЬрдм рддрдХ рдХрд┐ рдПрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реБрдЖ, рдореЗрд░рд╛ рднреА рдПрдХ рд▓рдХреНрд╖реНрдп рдерд╛ред рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рдирд╣реАрдВ рд╣реВрдБ!

рдореБрдЭреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП Heap рд╢рдмреНрдж рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред Default рдХреНрдпреЛрдВ рдирд╣реАрдВ?

рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХрд╛ рдПрдХ рдФрд░ рдмрд┐рдВрджреБ: RFC 1974 рдпрд╣ рд╕рдм рд╕рд╛рдорд╛рди std::alloc рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ std::heap ред рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ рд╕реНрдерд╛рди рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ?

@ рдЬреЗрдереНрд░реЛрдЧрдм "рд╣реАрдк" рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рд┐рд╣рд┐рдд рд╢рдмреНрдж рд╣реИ "рдЙрд╕ рдмрд╛рдд рдХреЗ рд▓рд┐рдП рдЬреЛ

@sfackler

"рд╡рд╣ рдмрд╛рдд рдорд▓реНрд▓реЛрдХ рдЖрдкрдХреЛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ"

рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ System рд╣реИред

рдЖрд╣ рдЬрд╝рд░реВрд░ред Global рдПрдХ рдФрд░ рдирд╛рдо рд╣реИ рд╢рд╛рдпрдж? рдЪреВрдВрдХрд┐ рдЖрдк рдЗрд╕реЗ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП #[global_allocator] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдХрдИ рдвреЗрд░ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП libc рдФрд░ рдЙрдкрд╕рд░реНрдЧ jemalloc)ред std::heap::Heap рд╕реЗ std::heap::Default рдФрд░ #[global_allocator] #[default_allocator] рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ?

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдЕрдиреНрдпрдерд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рд╕рдВрднрд╡рддрдГ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬрдм Vec рдЖрд╡рдВрдЯрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ / рдлрд╝реАрд▓реНрдб рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ) рдЗрд╕ рддрдереНрдп рд╕реЗ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдпрд╣ "рдкреНрд░рддрд┐" рдирд╣реАрдВ рд╣реИ -рд╕реНрдерд╛рдкрдирд╛ "рд░рд╛рдЬреНрдп (рдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг)ред

рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдХреА рдЕрд╡рдзрд┐ рдЕрдм рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИред

FCP рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ рд╕рдмрд╕реЗрдЯ рдмрд╣реБрдд рд╕реАрдорд┐рдд рдЙрдкрдпреЛрдЧ рдХрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ jemallocator рдЯреЛрдХрд░рд╛ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ? jemallocator рдХреЛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдзреНрд╡рдЬ рдХреЗ рдкреАрдЫреЗ рдЕрд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХреЗ рдХреБрдЫ рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реИред

рдпрджрд┐ jemallocator рдкрд░ рд╕реНрдерд┐рд░ рд░реВрд╕реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ Alloc::realloc je_rallocx рдХреЙрд▓ рдХрд░рдХреЗ, рд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЖрдмрдВрдЯрд┐рдд + рдХреЙрдкреА + рдбреАрд▓реЙрдХ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдирд╣реАрдВ рд╣реИ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ alloc_jemalloc рдЯреЛрдХрд░рд╛ IMOред

рдЬрд╝рд░реВрд░, рдЖрдкрдХреЛ рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рдЪреАрдЬ рдирд╣реАрдВ рд╣реИред

рдХреНрдпреЛрдВ? C ++ рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рдПрд▓реЛрдХреЗрдЯрд░ API рдореЗрдВ realloc рдХреА рдХреЛрдИ рднреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рднрд╛рд╖рд╛ рдХреЛ рдЕрдкрдВрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдпрд╣ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рдХреНрдпреЛрдВ рд╣реЛрдЧрд╛ред

C ++ рд╕рдВрдЧреНрд░рд╣ рдЖрдорддреМрд░ рдкрд░ realloc рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ C ++ рдореВрд╡ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдордирдорд╛рдиреА рдХреЛрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдирд╛ рдХрд┐ becuse realloc рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИред

рдФрд░ рддреБрд▓рдирд╛ C ++ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╡рд░реНрддрдорд╛рди рд░реБрд╕реНрддрдо рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрд┐рд▓реНрдЯ-рдЗрди рдЬреЗрдорд▓реЙрдХ рд╕рдкреЛрд░реНрдЯ рд╣реИред Alloc API рдХреЗ рдХреЗрд╡рд▓ рдЗрд╕ рд╕рдмрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдФрд░ рдЖрдЙрдЯ-рдСрдл-рдПрд╕рдЯреАрдбреА рдЖрд╡рдВрдЯрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдкреНрд░рддрд┐рдЧрдорди рд╣реЛрдЧрд╛ред

рдФрд░ realloc рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред jemallocator рд╡рд░реНрддрдорд╛рди рдореЗрдВ alloc_zeroed , alloc_excess , usable_size , grow_in_place , рдЖрджрд┐ рднреА рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

рдЖрдмрдВрдЯрд┐рдд_рдЬрд░рд╣рд┐рдд рдХреЛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИред рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдБ (рдКрдкрд░ рдХреА рдУрд░ рджреЗрдЦреЛ), рд╡рд╕реНрддреБрддрдГ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ alloc_excess рд╢реВрдиреНрдп рдЙрдкрдпреЛрдЧ рд╣реИрдВред рдХреНрдпрд╛ рдЖрдк рдХреБрдЫ рдХреЛрдб рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрдВрдЧреЗ рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВред

рдЖрдо рддреМрд░ рдкрд░, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЗрди рдПрдкреАрдЖрдИ рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рддрд░реНрдХ рдХреНрдпреЛрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдЬреИрдорд▓реЛрдХреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд╛рд░реА рдирд╣реАрдВ рд░рдЦ рд╕рдХрддреЗред

рдХреНрдпрд╛ Layout::array<T>() рдХреЛ рдПрдХ рдХреЙрдиреНрд╕реНрдЯреЗрдмрд▓ fn рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдпрд╣ рдШрдмрд░рд╛рд╣рдЯ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдлрд┐рд▓рд╣рд╛рд▓ рдирд╣реАрдВред

рдпрд╣ рдШрдмрд░рд╛рд╣рдЯ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдлрд┐рд▓рд╣рд╛рд▓ рдирд╣реАрдВред

рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ ... рдореИрдВ const fn Layout::array_elem<T>() рд▓рд┐рдП рд╕рдордЭреМрддрд╛ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ Layout::<T>::repeat(1).0 рдмрд░рд╛рдмрд░ рдиреЙрди-рдкреИрдирдХрд┐рдВрдЧ рд╣реЛрдЧрд╛ред

@mzabaluev рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЬреЛ рд╡рд░реНрдгрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ Layout::new<T>() рдмрд░рд╛рдмрд░ рд╣реИред рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдШрдмрд░рд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ Layout::from_size_align рдФрд░ рдлрд┐рд░ .unwrap() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@ рдЬреЛрд╢рдлреЗрд▓ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЖрдХрд╛рд░ 5 рд╣реИ, рдЬрдмрдХрд┐ рдПрдХ рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрд░реЗрдЦрдг рдХреЗ рдХрд╛рд░рдг рд╣рд░ 8 рдмрд╛рдЗрдЯ рдкрд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ:

struct Foo {
    bar: u32,
    baz: u8
}

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ Foo рдХреА рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдЗрд╕рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рддрддреНрд╡ рдХреА рдкреИрдбрд┐рдВрдЧ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реА рдордЬрдмреВрдд рдЙрдореНрдореАрдж рд╣реИред

рдЬрдВрдЧ рдореЗрдВ, рдПрдХ рд╡рд╕реНрддреБ рдХрд╛ рдЖрдХрд╛рд░ рд╣рдореЗрд╢рд╛ рдЗрд╕рдХреЗ рд╕рдВрд░реЗрдЦрдг рдХрд╛ рдПрдХ рдЧреБрдгрдХ рд╣реЛрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЗ n th рддрддреНрд╡ рдХрд╛ рдкрддрд╛ рд╣рдореЗрд╢рд╛ array_base_pointer + n * size_of<T>() ред рддреЛ рдХрд┐рд╕реА рд╕рд░рдгреА рдореЗрдВ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдЖрдХрд╛рд░ рд╣рдореЗрд╢рд╛ рдЙрд╕ рд╡рд╕реНрддреБ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП repr (Rust) рдкрд░ Rustonomicon рдкреЗрдЬ рджреЗрдЦреЗрдВред

рдареАрдХ рд╣реИ, рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдЗрд╕рдХреЗ рд╕рдВрд░реЗрдЦрдг рдореЗрдВ рдЧрджреНрджреЗрджрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди AFAIK рдпрд╣ #[repr(C)] рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдПрдХ рд╕реНрдерд┐рд░ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИред
рд╡реИрд╕реЗ рднреА, Layout::new рдПрдХ const fn рдмрдирд╛рдиреЗ рдХрд╛ рднреА рд╕реНрд╡рд╛рдЧрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣ рдПрдХ рд╕реНрдерд┐рд░ рдХрд╛рд░реНрдп рдХрд╛ рдкреНрд░рд▓реЗрдЦрд┐рдд (рдФрд░ рдЗрддрдирд╛ рдЧрд╛рд░рдВрдЯреАрдХреГрдд) рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ:

https://doc.rust-lang.org/std/mem/fn.size_of.html

рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЖрдХрд╛рд░ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рджреЗрддрд╛ рд╣реИред

рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдПрдХ рдЖрдЗрдЯрдо рдореЗрдВ рдХреНрд░рдорд┐рдХ рддрддреНрд╡реЛрдВ рдХреЗ рдмреАрдЪ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдСрдлрд╕реЗрдЯ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЙрд╕ рдЖрдЗрдЯрдо рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрдг рдкреИрдбрд┐рдВрдЧ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП T рдФрд░ n , [T; n] рдХрд╛ рдЖрдХрд╛рд░ n * size_of::<T>() ред

рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдмрд╕ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдХреЛрдИ рднреА const fn рдЬреЛ Layout::new рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЧреБрдгрд╛ рдХрд░рддрд╛ рд╣реИ, рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдмрджрд▓реЗ рдореЗрдВ рдЖрддрдВрдХрд┐рдд рд╣реЛрдЧрд╛ (рдЬрдм рддрдХ рдХрд┐ рдпрд╣ saturating_mul рдпрд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд╛рдкрд╕ рд╡рд░реНрдЧ рдПрдХ рдореЗрдВ рдЖ рдЧрдпрд╛ рд╣реВрдВред рдирд┐рд░рдВрддрд░ fn рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЗ рдореЗрдВ рджрд╣рд╢рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ

panic!() рдореИрдХреНрд░реЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд┐рд░рдВрддрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд╛рдБрдЪ рдЕрдВрдХрдЧрдгрд┐рдд рд╕реЗ рдкреИрдирд┐рдХ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рд╕реАрдорд╛ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ:

error[E0080]: constant evaluation error
 --> a.rs:1:16
  |
1 | const A: i32 = i32::max_value() * 2;
  |                ^^^^^^^^^^^^^^^^^^^^ attempt to multiply with overflow

error: aborting due to previous error

рдпрд╣ Alloc::realloc рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рд▓реЗрдХрд┐рди рдиреНрдпреВрдирддрдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ ( realloc рдЗрд╕рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИ):

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ Vec::reserve/double рдлреЛрди RawVec::reserve/double рдЬреЛ рдлреЛрди Alloc::realloc , рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреА impl Alloc::realloc рдкреНрд░рддрд┐рдпрд╛рдВ рдореГрдд рд╡реЗрдХреНрдЯрд░ рддрддреНрд╡реЛрдВ (рдореЗрдВ [len(), capacity()) рд░реЗрдВрдЬ) ред рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдЦрд╛рд▓реА рд╡реЗрдХреНрдЯрд░ рдХреЗ рдмреЗрддреБрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬреЛ capacity() + 1 рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕ рд╕рднреА рд╕реНрдореГрддрд┐ рдХреЛ рдЫреВрдиреЗ рдХреА рд▓рд╛рдЧрдд рдирдЧрдгреНрдп рдирд╣реАрдВ рд╣реИред

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрджрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ Alloc::realloc рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди "рдмрд╛рдЗрдЯреНрд╕_рдпреВрд╕реНрдб" рд╢реНрд░реЗрдгреА рднреА рд▓реЗрдЧрд╛, рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рднрд╛рдЧ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдХрдо рд╕реЗ рдХрдо jemalloc Alloc::realloc рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛ rallocx рд╕рд╛рде рдирд┐рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ alloc / dealloc рдбрд╛рдВрд╕ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рд╕реЗ рдХреЗрд╡рд▓ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдореЗрдореЛрд░реА рддреЗрдЬ рд╣реЛрддреА рд╣реИ рдпрд╛ rallocx рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рд╣реЛрддреА рд╣реИ, рд╢рд╛рдпрдж рдХреЙрд▓ рдХрдИ рдЪреАрдЬреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ ( rallocx рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрдЧрд╣ рдореЗрдВ рдмреНрд▓реЙрдХ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП? рдХрд┐рддрдиреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рдореЗрдореЛрд░реА rallocx рдХреЙрдкреА? рдЖрджрд┐) рд╣реЛрдЧреАред

https://github.com/QuiltOS/rust/tree/allocator-error рдореИрдВрдиреЗ рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╕рдВрдмрджреНрдз рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ рд╕рдВрдЧреНрд░рд╣ рдФрд░ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдореИрдВ рдХреИрд╕реЗ рдмрджрд▓рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ

  • рд╣рдореЗрд╢рд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ Result<T, A::Err> рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди T implemetation
  • рдХрднреА unwrap рдпрд╛ рдХреБрдЫ рдФрд░ рдЖрдВрд╢рд┐рдХ рдирд╣реАрдВ
  • oom(e) AbortAdapter ред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореИрдВ рдЬреЛ рдмрджрд▓рд╛рд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдХрд╛рдлреА рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рдФрд░ рдХрд╛рдлреА рдирд╛рд╕рдордЭ рднреА! рддреНрд░реБрдЯрд┐-рд╡рд╛рдкрд╕реА рдФрд░ рддреНрд░реБрдЯрд┐-рдЧрд░реНрднрдкрд╛рдд рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдорд╛рдирд╕рд┐рдХ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП --- рдкреНрд░рдХрд╛рд░ рдЪреЗрдХрд░ рд╕рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрд╛рдж рд╣реИ --- рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @Gankro рдХреЗ RFC рдореЗрдВ? рдпрд╛ рдкреВрд░реНрд╡ rfc рдзрд╛рдЧрд╛ --- рдЧреЗрдХреЛ / рд╕рд░реНрд╡реЛ рд▓реЛрдЧреЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдХреА рдЧрд┐рд░рд╛рд╡рдЯ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рдерд╛ред рдЦреИрд░, рдореИрдВ рдПрдХ #[repr(transparent)] рд╕реЗ AbortAdapter рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ Foo<T, A> рдФрд░ Foo<T, AbortAdapter<A>> (рд╕реБрд░рдХреНрд╖рд┐рдд рд░реИрдкрд░ рдХреЗ рднреАрддрд░) рдХреЗ рдмреАрдЪ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдПрдХ рдХреЛ рдЖрдЬрд╝рд╛рджреА рд╕реЗ рд╣рд░ рд╡рд┐рдзрд┐ рдХреЛ рджреЛрд╣рд░рд╛рдП рдмрд┐рдирд╛ рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВред [рдмреИрдХ-рдХрдорд┐рдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдХрд┐рд╕реА рднреА рдШрдЯрдирд╛ рдореЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ Result<T, !> рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдЗрди рджрд┐рдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред]

рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢ рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд▓реИрдВрдЧ рдЖрдЗрдЯрдо (рдмреЙрдХреНрд╕) рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореЗрдЯреНрд╕ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдХрдВрдкрд╛рдЗрд▓рд░ (рдЖрд╢реНрдЪрд░реНрдп) рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИред ICE- рдХрд╛рд░рдг рдмреЙрдХреНрд╕ рдХрдорд┐рдЯ рдЕрдВрддрд┐рдо рдПрдХ рд╣реИ --- рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рд╣реЛред #eddyb рдиреЗ # 47043 рдореЗрдВ рдЬрдВрдЧ рд▓рдЧрд╛ рджреА!

@joshlf рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдореБрдЭреЗ рдЖрдкрдХреЗ https://github.com/rust-lang/rust/pull/45272 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдзрдиреНрдпрд╡рд╛рдж!

рд▓рдЧрд╛рддрд╛рд░ рдореЗрдореЛрд░реА (рдЬреИрд╕реЗ http://pmem.io ) рдЕрдЧрд▓реА рдмрдбрд╝реА рдЪреАрдЬ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╕реНрдЯ рдХреЛ рддреИрдирд╛рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрдХ рд▓рдЧрд╛рддрд╛рд░ рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрдЯрд░ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, libpmemcto) рдХреЗ рд▓рд┐рдП рд░рд╕реНрдЯ рд░реИрдкрд░ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЬреЛ рднреА рдирд┐рд░реНрдгрдп рд▓рд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: -

  • Libpmemcto рдЬреИрд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрдЯрд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдПрдХ рдкрд░рдлреЙрд░реНрдорд░ рд░реИрдкрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛;
  • рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ (рдкреИрд░рд╛рдореАрдЯрд░) рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ (рдлрд┐рд▓рд╣рд╛рд▓, рдмреЙрдХреНрд╕, рдЖрд░рд╕реА, рдЖрд░реНрдХ, рдЖрджрд┐ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)
  • рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдХреНрд▓реЛрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ
  • рдЙрди рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рд╕рд╛рде рд▓рдЧрд╛рддрд╛рд░ рдореЗрдореЛрд░реА рд╕реНрдЯреЛрд░реЗрдЬ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВ, рдЬреЛ рдПрдХ рдирд┐рд░рдВрддрд░ рдореЗрдореЛрд░реА рдкреВрд▓ рдХреА рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдкрд░ рдкреБрди: рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдХреБрдЫ рд▓рдЧрд╛рддрд╛рд░ рдореЗрдореЛрд░реА рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдбреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рд╣реАрдк рдкрд░ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреЗ рд╣реИрдВред рдореЗрд░реЗ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рддрд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЖрд╡рдВрдЯрди рдФрд░ рдХреНрд╖рдгрд┐рдХ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд▓рдЧрд╛рддрд╛рд░ рдореЗрдореЛрд░реА рдкреВрд▓ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИрдВред

рдПрдХ рддрд░рдл рдХреЗ рд░реВрдк рдореЗрдВ, pmem.io рд╡рд┐рдХрд╛рд╕ (рдЗрдВрдЯреЗрд▓ рдХрд╛ PMDK) рдХрд╡рд░ рдХреЗ рддрд╣рдд рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рдЬреЗрдорд▓реЙрдХ рдЖрд╡рдВрдЯрди рдХрд╛ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд┐рд╡реЗрдХрдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЗрдорд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡рд┐рд╡реЗрдХрдкреВрд░реНрдг рд╣реЛрдЧрд╛ред

рдЬрдм рддрдХ рд╣рдо рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ Alloc ators рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рддрдХ рдХреНрдпрд╛ рдХреЗрд╡рд▓ GlobalAllocator s рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рджрд╛рдпрд░реЗ рдХреЛ рдХрдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛?

IIUC рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА servo рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдЧрд╛ рдФрд░ рд╣рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдкреИрд░рд╛рдЯреНрд░рд┐рдПрдЬрд┐рдВрдЧ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдо рдпрд╛ рддреЛ GlobalAllocator рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХреЗрд╡рд▓ Alloc GlobalAllocator рд▓рд┐рдП рдПрдХ рдХрдВрдмрд▓ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпреЗ рд╕рднреА рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХреЗрдВред

рд╡рд┐рдЪрд╛рд░?

@gnzlbg #[global_allocator] рд╡рд┐рд╢реЗрд╖рддрд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП ( heap::System рдЪрдпрди рдХрд░рдиреЗ рд╕реЗ рдкрд░реЗ) Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рднреА рд╕реНрдерд┐рд░ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЗрд╕реЗ https: / рдЬреИрд╕реЗ рдмрдХреНрд╕реЗ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ GlobalAllocator рдирд╛рдо рдХрд╛ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдХреБрдЫ рдирдП API рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдЗрд╕ рд╕рдордп GlobalAllocator рдирд╛рдо рдХрд╛ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдХреБрдЫ рдирдП рдПрдкреАрдЖрдИ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдореИрдВрдиреЗ рдЬреЛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдерд╛ рдЙрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ " рдорд┐рдирд┐рдордо " рдПрдкреАрдЖрдИ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ Alloc рд╕реЗ GlobalAllocator рдпрд╣рд╛рдБ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛, рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рджрд░рд╡рд╛рдЬрд╛ рдЦреБрд▓рд╛ рдЫреЛрдбрд╝ рдХрд░ рдПрдХ рдЕрд▓рдЧ рд╕реЗ рдкреИрд░рд╛рдЯреНрд░рд┐рдореЗрдб рд╣реЛрдирд╛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдПрд▓реЛрдХреЗрдЯрд░ рдЯреНрд░реЗрд╕ (рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо GlobalAllocator рдЯреНрд░рд┐рдЯ рджреНрд╡рд╛рд░рд╛ рдЙрдиреНрд╣реЗрдВ рдкрдВрдЧреБ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ)ред

IIUC servo рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рдЖрд╡рдВрдЯрди рджреНрд╡рд╛рд░рд╛ рдХреБрдЫ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд╡рд┐рдкрд░реАрдд)ред рддреЛ рд╢рд╛рдпрдж рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЬрд┐рд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдорд╛рдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рдо рдЕрдм рдХреЗрд╡рд▓ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрди рдореБрджреНрджреЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдмрд╛рдж рдореЗрдВ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдкреИрд░рд╛рдореАрд░реАрдЬрд╝ рд╕рдВрдЧреНрд░рд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдЕрдЧрд░ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред

IIUC рд╕рд░реНрд╡реЛ рдХреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдХреБрдЫ рд╕рдВрдЧреНрд░рд╣реЛрдВ рдХреЛ рднреА рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

рдпрд╣ рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди:

  • рдпрджрд┐ рдХреЛрдИ рд▓рдХреНрд╖рдг рдФрд░ рдЗрд╕рдХреА рд╡рд┐рдзрд┐ рд╕реНрдерд┐рд░ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рддреЛ рдЗрд╕реЗ std::heap::Heap рд╕реЗ рдЧреБрдЬрд░реЗ рдмрд┐рдирд╛ рднреА рд╕реАрдзреЗ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреЛ рдпрд╣ рди рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╣реИ, рдпрд╣ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ (рднрд▓реЗ рд╣реА рд╣рдо рдЕрдВрдд рдореЗрдВ рдЖрд╡рдВрдЯрд┐рддрдХрд░реНрддрд╛рдУрдВ рдкрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдмрдирд╛рддреЗ рд╣реИрдВ) рдФрд░ GlobalAllocator рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╛рдо рдирд╣реАрдВ рд╣реИред
  • рдЬреИрдорд▓реЛрдХреЗрдЯрд░ рдЯреЛрдХрд░рд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ alloc_excess , realloc , realloc_excess , usable_size , grow_in_place , рдФрд░ shrink_in_place рдЬреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реИрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдиреНрдпреВрдирддрдо рдПрдкреАрдЖрдИ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ред рдпреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрдиреНрд╣реЗрдВ рд╣рдЯрд╛рдирд╛ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рддрд┐рдЧрдорди рд╣реЛрдЧрд╛ред

рджреЛрдиреЛрдВ рдмрд┐рдВрджреБ рд╕рдордЭ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдореЗрдВ рддреЗрдЬреА рд▓рд╛рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рдХрдЯреМрддреА рдХрд░рдирд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдКрдкрд░ рдкреИрд░рд╛рдбреНрд░рд╛рдЗрдХрд┐рдВрдЧ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓рдХреНрд╖рдг рд╣реИред

[рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╕рд░реНрд╡реЛ рдХреА рддрд░рд╣ (рд╕реНрдерд┐рд░ | рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдореЛрдЬрд╝рд┐рд▓рд╛ рдЯреЛрдХрд░рд╛) рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХрд╛рд░реНрдЧреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рдереЛрдбрд╝рд╛ рджрдмрд╛рд╡ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред]

@Emon2314 рд╕рд░реНрд╡реЛ рдПрдХрдорд╛рддреНрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЗрди рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред

@Emon2314 рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ

рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП: рд╕рд░реНрд╡реЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рдирдВрдмрд░ рдЕрд╕реНрдерд┐рд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ ( #[global_allocator] ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдзреАрд░реЗ-рдзреАрд░реЗ рдЙрд╕ рд╕реЗ рджреВрд░ рдЬрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдпрд╛ рддреЛ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдХреЗ рдЬрд┐рд╕рдиреЗ рдХреБрдЫ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╛ рд╕реНрдерд┐рд░ рд╡рд┐рдХрд▓реНрдк рдвреВрдВрдврдХрд░ред ) рдЗрд╕реЗ https://github.com/servo/servo/issues/5286 рдкрд░ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ #[global_allocator] рд╕реНрдерд┐рд░ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐рд╕реА рднреА рд╕рд░реНрд╡реЛ рдХрд╛рд░реНрдп рдХреЛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдЗрд╕ рддрдереНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдХ cdylib рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╕рдордп Rust std рд╕рд┐рд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рдХреЛ рдбрд┐рдлреЙрд▓реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореЛрдЬрд╝реЗрдЬрдореЙрд▓реЛрдХ рдЬреЛ рдХрд┐ рдПрдХ рд╣реА рдмрд╛рдЗрдирд░реА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, malloc рдФрд░ free рдЬреИрд╕реЗ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред #[global_allocator] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

@SimonSapin рдЕрдзрд┐рдХ рд╣реИ рдХрд┐ рдореИрдВ Alloc рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдкреАрдЖрдИ, рдХреБрдЫ рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреА рдЬрдЯрд┐рд▓рддрд╛, рдХреБрдЫ рд╕рдВрдЧреНрд░рд╣ рд╡рд┐рд╡рд░рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЖрджрд┐ред

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдПрдХ рддрд░реАрдХрд╛ рд╕реБрдЭрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдпрд╣рд╛рдВ рдкреНрд░рдЧрддрд┐ рдХрд░ рд╕рдХреЗрдВред

рдЪрд░рдг 1: рдвреЗрд░ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛

рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реНрдерд┐рд░ рдЬрдВрдЧ рдореЗрдВ рдвреЗрд░ (рдпрд╛ рд╕рд┐рд╕реНрдЯрдо / рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо / рдЧреНрд▓реЛрдмрд▓ / рдлреНрд░реА-рд╕реНрдЯреЛрд░ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛, рдпрд╛ рдлрд┐рд░ рдЖрдк рдЗрд╕реЗ рдирд╛рдо рджреЗрдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ) рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдЦреБрдж рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рдереЗред

рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕реЗ рд╣рдо рд╢реБрд░реВ рдореЗрдВ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреИрд░рд╛рдореАрд░рд┐рдЬ рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ Box , рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ ( new ) рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдФрд░ рдбреАрд▓ рдХрд░рдирд╛ ( drop ) рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЗрд╕ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд╢реБрд░реВ рдореЗрдВ рдПрдкреАрдЖрдИ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ std:: рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдПрдкреАрдЖрдИ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рд╡рд╣рд╛рдВ рдкрд╣реБрдВрдЪ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд┐рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрд╕реНрдерд┐рд░ API рдХреА рд╡рдЬрд╣ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рд╣рд┐рдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЪрд░рдг 2: рдкреНрд░рджрд░реНрд╢рди рд╣рд┐рдЯ рдХреЗ рдмрд┐рдирд╛ рд╣реАрдк рдЖрд╡рдВрдЯрди

рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╣рдо рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдкреБрдирд░реНрдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рдкреНрд░рджрд░реНрд╢рди рд╣рд┐рдЯ рдХреЗ рдХрд╛рд░рдг рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рддрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЛ рдХреИрд╕реЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдП рдФрд░ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдЪрд░рдг 3 рд╕реЗ рдПрди: std рдХрд▓реЗрдХреНрд╢рди рдореЗрдВ рдХрд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░реНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдХрдард┐рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХрднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдпрд╣ рдПрдХ рдмреБрд░реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИред

рдЬрдм рдореИрдВ рдПрдХ рдХрд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛ рдпрд╛ рдкреНрд░рдпреЛрдЬреНрдп рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдЕрдЧрд░ рдореБрдЭреЗ рдХреЛрдИ рдпреВрдЯрд┐рд▓рд┐рдЯреА рдкреНрд░реЙрдмреНрд▓рдо рд╣реИ рддреЛ рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдЕрд▓рдЧ рдХрд▓реЗрдХреНрд╢рди рдПрдкреАрдЖрдИ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдореЗрд░реЗ рдХрд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдлрд╛рдпрджрд╛ рдЙрдард╛рддрд╛ рд╣реЛ, рдЬреИрд╕реЗ рдХрд┐ рдореЗрд░реЗ SliceDeque crate рдХрд░рддрд╛ рд╣реИред рдХрд╕реНрдЯрдо рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдВрдХ рдХрд░рдиреЗ рд╕реЗ рдореБрдЭреЗ рдпрд╣рд╛рдБ рдорджрдж рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреАред

рдЕрдЧрд░ рдореБрдЭреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рддреЛ рдлрд┐рд░ рднреА рдореЗрд░реА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдХрдард┐рди рд╣реЛрдЧрд╛ред рдореИрдВ рдХреЗрд╡рд▓ рдЕрдЧрд▓реЗ рдЦрдВрдбреЛрдВ рдореЗрдВ Vec рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╣ рд╕рдВрдЧреНрд░рд╣ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред

рд╕рд┐рд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рдХрд░реЗрдВ (рд╕реНрдореЙрд▓ рд╡реЗрдХреНрдЯрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди)

рдЕрдЧрд░ рдореИрдВ рд╕рд┐рд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рдХреЛ рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Vec рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдВрджрд░ рдХреБрдЫ рддрддреНрд╡реЛрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдЖрдЬ рдореИрдВ рд╕рд┐рд░реНрдл SmallVec<[T; M]> рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ SmallVec Vec :

  • рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ Vec O (1) рд╣реИ, рд▓реЗрдХрд┐рди N <M рдФрд░ O (1) рдХреЗ рд▓рд┐рдП SmallVec<[T; M]> O (N) рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛,

  • Vec len() <= M рдкрд░ into_iter рдЬреИрд╕реЗ рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ len() <= M рддрддреНрд╡реЛрдВ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реИрдВред рд╕рд┐рд░реНрдл рдкреЙрдЗрдВрдЯрд░реНрд╕ рд▓реЗрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрдЯрд┐рд▓реЗрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реАред

рдХреНрдпрд╛ рд╣рдо рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдкрд░ Vec рд╕рд╛рдорд╛рдиреНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╕рдм рдХреБрдЫ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдЧрдд рд╣реИрдВ:

  • рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ Vec рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдкрд░ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ
  • Vec рдХрд╛ рдкреНрд░рд▓реЗрдЦрди рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рд▓рд╛рдЧрдд рдЧреИрд░-рдирдЧрдгреНрдп рд╣реИрдВред

рдЖрд╡рдВрдЯрди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

Vec рдХрд╛ рд╡рд┐рдХрд╛рд╕-рдХрд╛рд░рдХ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЖрдмрдВрдЯрдХ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддрд╛ рд╣реИред std рд╣рдо рдЗрд╕реЗ рдЖрдо рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рджрд░реНрдЬреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ jemalloc / malloc / ... рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдПрдХ рдХрд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╡рд┐рдХрд╛рд╕-рдХрд╛рд░рдХ рд╣рдо рдЪреБрдирддреЗ рд╣реИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ vec рдЬреИрд╕реЗ рдЖрд╡рдВрдЯрди рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╛рд╕-рдХрд╛рд░рдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛, рд▓реЗрдХрд┐рди рдореЗрд░реА рдЖрдВрдд рднрд╛рд╡рдирд╛ рдореБрдЭреЗ рдмрддрд╛рддреА рд╣реИ: рд╢рд╛рдпрдж рдирд╣реАрдВред

рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рдХреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рд╢реЛрд╖рдг рдХрд░реЗрдВ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдУрд╡рд░-рдХрдорд┐рдВрдЧ рдПрд▓реЛрдХреЗрдЯрд░ рдЯрд┐рдпрд░ 1 рдФрд░ рдЯрд┐рдпрд░ 2 рд▓рдХреНрд╖реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рд▓рд┐рдирдХреНрд╕ рдХреА рддрд░рд╣ рдФрд░ рдореИрдХреЛрд╕ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдбрд┐рдлрд░реЗрдВрд╢рд┐рдпрд▓ рд░реВрдк рд╕реЗ рдвреЗрд░ рдПрд▓реЛрдХреИрдорд┐рдЯрд░ рдУрд╡рд░рдлрд┐рдЯ рд╣реЛрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╡рд┐рдВрдбреЛрдЬ рдПрдкреАрдЖрдИ VirtualAlloc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЗрдореЛрд░реА рдХреЛ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬреИрд╕реЗ Vec::reserve/with_capacity ) рдФрд░ push рдкрд░ рдореЗрдореЛрд░реА рдХрд░реЗрдВ

рд╡рд░реНрддрдорд╛рди рдореЗрдВ Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрд▓реЛрдХреЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдореГрддрд┐ рдХреЛ рдХрдо рдХрд░рдиреЗ рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рд▓рд┐рдирдХреНрд╕ рдкрд░ рдПрдХ рдЧреИрд░-рдУрд╡рд░-рдХрдорд┐рдВрдЧ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рд╣реИрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдмрд╕ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдХреЛ рдПрдХ рдмрд╛рд░ рд╕реНрдкрд░реНрд╢ рдХрд░рдХреЗ)ред рдпрд╣ рдПрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрддрд╛рдиреЗ рдХрд╛ рднреА рддрд░реАрдХрд╛ рдирд╣реАрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ alloc рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдУрд╡рд░-рдХрдорд┐рдЯ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рд╣реИ, рд╣рдо рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА Alloc рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ Vec , рдФрд░ рдХрд╣рд╛ рдХрд┐ рдЫреЛрдЯреЗ рд╕реЗ рдЬреАрдд рдХреЗ рд▓рд┐рдП IMO рд╣реЛрдЧрд╛ред рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ рдПрд▓реЛрдХреЗрдЯрд░ рд╣реЛрддрд╛ рд╣реИ, рддреЛ Vec рд╢рдмреНрджрд╛рд░реНрде рдлрд┐рд░ рд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВ:

  • Vec рдХреЛ рдХрднреА рднреА рдлрд┐рд░ рд╕реЗ рдмрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП reserve рдЬреИрд╕реЗ рдСрдкрд░реЗрд╢рди рдмрд╣реБрдд рдХрдо рдорд╛рдпрдиреЗ рд░рдЦрддреЗ рд╣реИрдВ
  • push O(1) рдмрдЬрд╛рдп amortized O(1) ред
  • рдЬреАрд╡рд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рдХрднреА рднреА рдЕрдорд╛рдиреНрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╡рд╕реНрддреБ рдЬреАрд╡рд┐рдд рд╣реИ, рдЬреЛ рдХреБрдЫ рдЕрдиреБрдХреВрд▓рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ

рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рдХреА рдЕрдзрд┐рдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╢реЛрд╖рдг рдХрд░реЗрдВ

cudaMalloc / cudaMemcpy ... рдЬреИрд╕реЗ рдХреБрдЫ рд╕рд┐рд╕реНрдЯрдо рдкрд┐рдиреЛрд▓реНрдб рдФрд░ рдиреЙрди-рдкрд┐рди рдХрд┐рдП рдЧрдП рдореЗрдореЛрд░реА рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдЕрд╕рдВрддреБрд╖реНрдЯ рдкрддреЗ рд╡рд╛рд▓реЗ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА Alloc рд╡рд┐рд╢реЗрд╖рддрд╛), ...

рд▓реЗрдХрд┐рди рд╡реАрдИрд╕реА рдЬреИрд╕реЗ рд╕рдВрдЧреНрд░рд╣ рдкрд░ рдЗрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдлрд┐рд░ рд╕реЗ рд╕реВрдХреНрд╖реНрдо рддрд░реАрдХреЗ рд╕реЗ рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдирд╛ рдЕрдЪрд╛рдирдХ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк GPU рдХрд░реНрдиреЗрд▓ рд╕реЗ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рд╣реЛрд╕реНрдЯ рд╕реЗред

рд╕рдореЗрдЯ рд░рд╣рд╛ рд╣реБ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ Alloc API рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬреЛ рд╕рднреА рд╕рдВрдЧреНрд░рд╣ (рдпрд╛ рдХреЗрд╡рд▓ Vec ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рд╣реИ, рд╢рд╛рдпрдж рдмрд╣реБрдд рдХрдард┐рди рд╣реИред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╡реИрд╢реНрд╡рд┐рдХ / рдкреНрд░рдгрд╛рд▓реА / рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо / рд╣реАрдк / рдлрд╝реНрд░реА-рд╕реНрдЯреЛрд░ рдПрд▓реЛрдХреЗрдЯрд░реНрд╕ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдФрд░ Box , рд╣рдо рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХреЗрдВред рд╢рд╛рдпрдж рд╣рдо Alloc рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ VecAlloc, VecDequeAlloc , HashMapAlloc` рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ, ... рдпрд╛ рд╢рд╛рдпрдж рд╣рдо рдмрд╕ рдХрд╣реЗрдВ, "рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ , рдмрд╕ рдорд╛рдирдХ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдПрдХ рдЯреЛрдХрд░реЗ рдореЗрдВ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ, рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдврд╛рд▓рдирд╛ "ред рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╕рд┐рд░реНрдл рдЗрд╕ рдЖрд╕рд╛рди рдХреЛ рдмрдирд╛рдирд╛ рд╣реИ, рдирд░реНрд╕рд░реА рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЯреЛрдХрд░реЗ (рдпрд╛ рдмрдХреНрд╕реЗ) рдореЗрдВ рдПрд╕ рдбреА рдбреА рд╕рдВрдЧреНрд░рд╣ рдХрд░рдХреЗ рдФрд░ рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╢рд╛рдпрдж рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рд╡реИрд╕реЗ рднреА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдЗрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ рдФрд░ рдПрдХ Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ рдЬреЛ рд╕рдм рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИред рд╣рдо рдЪрд░рдг реж рдкрд░ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЪрд░рдг рез рдФрд░ рдЪрд░рдг реи рдореЗрдВ рдЬрд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рддрдХ рд╣рдо рд╡рд╣рд╛рдБ рд╣реИрдВ, рддрдм рддрдХ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЪрд┐рддреНрд░ рд╕реЗ рдмрд╛рд╣рд░ рди рдЫреЛрдбрд╝реЗрдВред

рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рд╡рд╣рд╛рдВ рдкрд╣реБрдВрдЪ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд┐рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрд╕реНрдерд┐рд░ API рдХреА рд╡рдЬрд╣ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рд╣рд┐рдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдХрд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рдЪреБрдирдирд╛ рдЖрдорддреМрд░ рдкрд░ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреМрди рд╕реЗрд╡рд╛ рдХрд░реЗрдЧрд╛ред

рдПрдХ рдХрд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рдЪреБрдирдирд╛ рдЖрдорддреМрд░ рдкрд░ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреМрди рд╕реЗрд╡рд╛ рдХрд░реЗрдЧрд╛ред

рд╕рдм рд▓реЛрдЧ? рдХрдо рд╕реЗ рдХрдо рдЕрднреА рддреЛред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╢рд┐рдХрд╛рдпрдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рддрд░реАрдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреНрд░рд╕реНрддрд╛рд╡ ( alloc_excess , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдореЗрдВ рдЧрд╛рдпрдм рд╣реИрдВ, AFAIK рдЕрднреА рддрдХ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХреБрдЫ рднреА рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╛ рдпрд╣ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛?

Vec (рдФрд░ RawVec рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛) realloc push

@SimonSapin

рдЬреЗрдорд▓реЛрд╕реЛрдЯрд░ рдХреНрд░реЗрдЯ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрд▓реЛрдХреЗрд╢рди, рдПрдХреНрд╕рд▓рд╕, рд░рд┐рдпрд▓рд▓реЛрдХ, рд░рд┐рдпрд▓рд▓реЛрдХрдПрдХреНрд╕рдПрдХреНрд╕рдПрдХреНрд╕, рдпреВрдЬреЗрдмрд▓_рд╕рд╛рдЗрдЬ, рдЧреНрд░реЛ_рдЗрди_рдкреНрд▓реЗрд╕, рдФрд░ рд╕рд┐рдХреНрд░реЗрдЯ_рдЗрди_рдкреНрд▓реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ

рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ, AFAIK realloc , grow_in_place , рдФрд░ shrink_in_place рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди grow_in_place shrink_in_place , jemalloc рдкрд░ grow_in_place рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ shrink_in_place рдореЗрдВ Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рджреЛ рддрд░реАрдХреЛрдВ рдореЗрдВ рдХрдЯреМрддреА рдЗрд╕реЗ рдиреАрдЪреЗ: realloc рдФрд░ shrink_in_place ред

рдХрд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рдЪреБрдирдирд╛ рдЖрдорддреМрд░ рдкрд░ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ,

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдЪ рд╣реИ, рдЖрдк рдЗрди рддрд░реАрдХреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдЦрд░рд╛рдм рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╣реИред

IIUC рд╕рд░реНрд╡реЛ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдЬреЗрдорд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рджреВрд╕рд░рд╛ рдЬреЗрдорд▓реЙрдХ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реЛрдиреЗ рдХрд╛ рдерд╛, рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рдерд╛?

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╣рдо рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рд░реАрдХрд░рдг рдореЗрдВ realloc рдФрд░ shrink_in_place Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рдкреНрд░рджрд░реНрд╢рди рд╢рд┐рдХрд╛рдпрддреЛрдВ рдореЗрдВ рджреЗрд░реА рдХрд░реЗрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕ рдкрд▓ рдореЗрдВ рд╣рдо Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрд╕реНрдерд┐рд░ API рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ std рд╕рдВрдЧреНрд░рд╣реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЖрдк рд╕реНрдерд┐рд░ рд╕реЗ рд╕рдорд╛рди рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред рд░рд╛рдд рдХреЛ рдкрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред рдЕрд░реНрдерд╛рддреН, рдпрджрд┐ рд╣рдо рдЖрдмрдВрдЯрд┐рдд рдЧреБрдг рдореЗрдВ realloc_excess рдФрд░ shrink_in_place_excess рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ Vec / String ... рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо realloc рд╕реНрдерд┐рд░ рдХрд░рддреЗ рд╣реИрдВред shrink_in_place рдиреЗ рдЖрдкрдХреЛ рдПрдХ рдмрд┐рдЯ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХреА рд╣реЛрдЧреАред

IIUC рд╕рд░реНрд╡реЛ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдЬреЗрдорд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рджреВрд╕рд░рд╛ рдЬреЗрдорд▓реЙрдХ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реЛрдиреЗ рдХрд╛ рдерд╛, рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рдерд╛?

рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╡реЗ рдХреБрдЫ рдХреЛрдб рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдФрд░ рд╕рд░реНрд╡реЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯ / рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИрдВред

рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ mozjemalloc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЬреЛрдбрд╝рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде jallalloc рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдПрдХ рдХрд╛рдВрдЯрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ unsafe FFI рдХреЛрдб Rust std рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ mozjemalloc рдкрд░ рд╢реБрджреНрдзрддрд╛ рдФрд░ рд╕реБрджреГрдврд╝рддрд╛ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

рд╕рд░реНрд╡реЛ рдЬреАрдореЗрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рд╕рдордп рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред рд╕рд░реНрд╡реЛ рдХреЗ рдкрд╛рд╕ рдХреБрдЫ unsafe рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЛрдб рднреА рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдЬреЗрдорд▓реЙрдХ рдкрд░ рдзреНрд╡рдирд┐ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред (рдкрд╛рд╕рд┐рдВрдЧ Vec::as_ptr() рд╕реЗ je_malloc_usable_size ред)

рд╕рд░реНрд╡реЛ рдЬреАрдореЗрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рд╕рдордп рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред

рдпрд╣ рдЬрд╛рдирдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░реНрд╕ рд╣реИ рдХрд┐ рд╕рд░реНрд╡реЛ рд▓рдХреНрд╖реНрдп realloc рдФрд░ shrink_to_fit API рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ jemalloc рдХрд░рддрд╛ рд╣реИ? realloc (рдФрд░ calloc ) рдмрд╣реБрдд рдЖрдо рд╣реИрдВ, рд▓реЗрдХрд┐рди shrink_to_fit ( xallocx ) AFAIK jemalloc рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВред рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ realloc рдФрд░ alloc_zeroed ( calloc ) рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдмрд╛рдж рдореЗрдВ shrink_to_fit рдХреЛ рдЫреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╕рд░реНрд╡реЛ рдХреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред

рд╕рд░реНрд╡реЛ рдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЛрдб рднреА рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдЬреЗрдорд▓реЙрдХ рдкрд░ рдзреНрд╡рдирд┐ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред (рдкрд╛рд╕рд┐рдВрдЧ рд╡реАрдИрд╕реА :: as_ptr () рд╕реЗ je_malloc_usable_sizeред)

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, jemallocator рдХреНрд░реЗрдЯ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рд╣реИрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ jemallocator crate рдХреЗ рд╕рдорд╛рди рдмрдХреНрд╕реЗ рдЕрдиреНрдп рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди API рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрди рдХрд╣рд╛рдиреА рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рд▓рдЧрддреА рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рд╣реИ рдХрд┐ рдпреЗ API Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ malloc_usable_size рдЖрд╡рд╢реНрдпрдХрддрд╛ Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд╣реИред #[global_allocator] рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдЖрд╢реНрд╡рд╕реНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрд╡рдВрдЯрд┐рддрдХрд░реНрддрд╛ Vec<T> рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ jemallocator рдЯреЛрдХрд░рд╛ рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрд▓рдЧ рд╣реИред

@SimonSapin Alloc рдЯреНрд░рд┐рдЯ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдВрднрд╡рддрдГ рд▓рд┐рдирдХреНрд╕ рдореЙрд▓реЙрдХ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП jemallocator рдЬреИрд╕рд╛ рдПрдХ рдЯреЛрдХрд░рд╛ рд╣реЛрдЧрд╛ред рдЗрди рдЯреЛрдХрд░реЛрдВ рдореЗрдВ рдЙрди рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ рд╡реЗ рдЕрд╕реНрдерд┐рд░ Alloc API (рдЬреИрд╕реЗ, usable_size malloc_usable_size ) рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╣реЛрдВ рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рдЬреЛ Alloc API рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИрдВ, рдЬреИрд╕реЗ mallinfo рдКрдкрд░ рдореЗрдореЛрд░реА рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧред рдПрдХ рдмрд╛рд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреНрд░реЗрдЯ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рд╕рд░реНрд╡реЛ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЬрд╛рдирдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдХрд┐ Alloc рдХрд╛ рдХреМрди рд╕рд╛ рднрд╛рдЧ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рд╢рд╛рдпрдж рдирдП рдПрдкреАрдЖрдИ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдЬреЛ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП allocatorsред

@gnzlbg рдореИрдВ https://github.com/rust-lang/rust/issues/32838#issuecomment -358267292 рдореЗрдВ рдЪреАрдЬреЛрдВ рдкрд░ рдереЛрдбрд╝рд╛ рд╕рдВрджреЗрд╣ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЙрди рд╕рднреА рд╕рд┐рд╕реНрдЯрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд╛рдорд╛рди рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЖрд╡рдВрдЯрди рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ - рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд┐рдпрд╛ рд╣реИред рдПрдХ рдЕрд▓рдЧ рдЪреБрдиреМрддреА рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред

@SimonSapin рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдХреНрдпрд╛ рдХреЛрдИ рдЕрд╕реНрдерд┐рд░ рдЬрдВрдЧ рдиреАрддрд┐ рдирд╣реАрдВ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рднреНрд░рдорд┐рдд рд╣реЛ рд░рд╣рд╛ рдерд╛: рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдФрд░ рд╕рд░реНрд╡реЛ рдпрд╣ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рдЬреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрдмрд╛рд╡ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реЛрдЧрд╛ред

@sfackler рджреЗрдЦреЗрдВ рдХрд┐ ^ рдореИрдВ рдЙрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдВрддрд░ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдмрдирд╛рдо рдЗрд╕ рд╕реНрдерд┐рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд░реНрд╡реЛ рдЙрд╕ рд╡рд┐рднрд╛рдЬрди рдХреЗ рджреВрд╕рд░реА рддрд░рдл рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдЬреЛ рдпрд╣ рдЪрд╛рд╣рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд░рд╕реНрдЯ рдХреЗ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд░реНрд╡реЛ рдпрд╛ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрд╛рджреБрдИ рдирд╣реАрдВ рд╣реИред

@Emon2314 рд╕рд╣реА, рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рд╕реНрдерд┐рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: https://wiki.mozilla.org/Rust_Update_Policy_for_Firefoxред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╕рдордЭрд╛рдпрд╛ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдЬ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╣рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрд╡рд░реЛрдзрдХ рдирд╣реАрдВ рд╣реИред рдпрд╣ #[global_allocator] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ / рдЕрдзрд┐рдХ рдордЬрдмреВрдд рд╣реЛрдЧрд╛, рдмрд╕ рдЗрддрдирд╛ рд╣реАред

рд╕рд░реНрд╡реЛ рдХреБрдЫ рдЕрд╕реНрдерд┐рд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдЖрд╡рдВрдЯрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рд╕рд░рд▓ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ (рдЬреИрд╕реЗ

@ Ericson2314

рдЙрди рд╕рднреА рд╕рд┐рд╕реНрдЯрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд╛рдорд╛рди рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЖрд╡рдВрдЯрди рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ - рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд┐рдпрд╛ рд╣реИред рдПрдХ рдЕрд▓рдЧ рдЪреБрдиреМрддреА рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ ArrayVec рдпрд╛ SmallVec Vec рдХрд╕реНрдЯрдо рдПрд▓реЛрдХреЗрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ? рдпрд╣ рдкрд╣рд▓рд╛ рдмрд┐рдВрджреБ рдерд╛ рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдгрд╛рд▓реА рдирд╣реАрдВ рд╣реИред рд╕рдВрднрд╡рдд: рдпрд╣ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рджреЛ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдПрдХ рднрдВрдбрд╛рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдХрдЪреНрдЪрд╛ рд╕рд░рдгреА рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдПрдХ рд╣реАрдк рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рд╕рд░рдгреА рдХреНрд╖рдорддрд╛ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ "рд╡реИрд╢реНрд╡рд┐рдХ" рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди Vec s рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдЕрдиреНрдп рд╕рднреА рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ, рдФрд░ рдпреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╕реНрдЯреЗрдЯрдлреБрд▓ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣рд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдХрдард┐рди рд╣реИ: C ++ рдХреЗрд╡рд▓ рдЖрдВрд╢рд┐рдХ рд╕рдлрд▓рддрд╛ рдХреЗ рд╕рд╛рде 30 рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ: рдЬреЗрдиреЗрд░рд┐рдХ рдкреЙрдЗрдВрдЯрд░ рдФрд░ GC рдПрд▓реЛрдХреЗрдЯрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдХрд╛рд░рдг рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди ArrayVec рдФрд░ SmallVec Vec C ++ рднреВрдорд┐ рдореЗрдВ рд╢реВрдиреНрдп-рд▓рд╛рдЧрдд рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ ( P0843r1 рдХреБрдЫ рдореБрджреНрджреЛрдВ рдкрд░ ArrayVec рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ)ред

рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдо рдЗрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛рдПрдВрдЧреЗ, рддреЛ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдпреЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд╕реНрдЯрдо рд╕рдВрдЧреНрд░рд╣ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдкреАрдЫрд╛ рди рдХрд░реЗрдВред


рдореИрдВрдиреЗ IRC рдкрд░ @SimonSapin рдХреЗ рд╕рд╛рде рдереЛрдбрд╝реА рдмрд╛рдд рдХреА рдФрд░ рдЕрдЧрд░ рд╣рдо realloc рдФрд░ alloc_zeroed рд╕рд╛рде рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдереЗ, рддреЛ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдореЗрдВ рдЬрдВрдЧ (рдЬреЛ рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░ рдЬрдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред mozjemalloc рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рд╕реНрдерд┐рд░ рдЬрдВрдЧ рдореЗрдВ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВред рдЬреИрд╕рд╛ рдХрд┐ @SimonSapin рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЖрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдирд╣реАрдВ рд▓рдЧрддреА рд╣реИред

рдлрд┐рд░ рднреА, рд╣рдо рд╡рд╣рд╛рдВ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рд╡рд╣рд╛рдВ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ servo рдХреЛ рдкреНрд░рджрд░реНрд╢рди рд╣рд╛рдирд┐ рдХреЗ рдмрд┐рдирд╛ #[global_allocator] рд╕реНрдерд┐рд░ рдХрд░рддреЗ рд╣реИрдВред


@joshlf

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдЖрд╡рдВрдЯрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИрдВред

рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ рдорддрд▓рдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрдк Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдЖрдмрдВрдЯрдХреЛрдВ рдХреЛ рдкрдВрдЧреБ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ? рдпрд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рд▓рдХреНрд╖рдг рдФрд░ рдЕрдВрддрд┐рдо рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдкрд░ Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ (рдЗрди рджреЛрдиреЛрдВ рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рд╕рдорд╛рди рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)?

рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ "рд╕реНрдореЙрд▓рд╡реЗрдХ = рд╡реАрдИрд╕реА + рд╡рд┐рд╢реЗрд╖ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛" рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдХрд╣рд╛рдВ рд╕реЗ рдЖрддрд╛ рд╣реИред рдпрд╣ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ (рди рддреЛ рдЬрдВрдЧ рдореЗрдВ рдФрд░ рди рд╣реА рдЕрдиреНрдп рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ), рдареАрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХрдИ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рдЬрдм рдореИрдВ "рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рдВрдЯрди рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ, рддреЛ рдРрд╕рд╛ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореИрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВред

Layout API рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ from_size_align рдФрд░ align_to рдмреАрдЪ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдЕрдВрддрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рдЬрд╣рд╛рдВ рдкреВрд░реНрд╡ рдореЗрдВ None рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ , рдЬрдмрдХрд┐ рдмрд╛рдж рдХреЗ рджрд╣рд╢рдд (!)ред

рдХреНрдпрд╛ рдпрд╣ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рдФрд░ рд╕реБрд╕рдВрдЧрдд рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдФрд░ рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг LayoutErr рдПрдирдо рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ Result<Layout, LayoutErr> рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ (рдФрд░ рд╢рд╛рдпрдж рд╡рд░реНрддрдорд╛рди рдореЗрдВ Option рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

@rkruppe

рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ "рд╕реНрдореЙрд▓рд╡реЗрдХ = рд╡реАрдИрд╕реА + рд╡рд┐рд╢реЗрд╖ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛" рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдХрд╣рд╛рдВ рд╕реЗ рдЖрддрд╛ рд╣реИред рдпрд╣ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ (рди рддреЛ рдЬрдВрдЧ рдореЗрдВ рдФрд░ рди рд╣реА рдЕрдиреНрдп рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ), рдареАрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХрдИ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рдЬрдм рдореИрдВ "рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рдВрдЯрди рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ, рддреЛ рдРрд╕рд╛ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореИрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВред

Rust рдФрд░ C ++ рдореЗрдВ рдПрд▓реЛрдХреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рджреЛ рд╕реНрд╡рддрдВрддреНрд░ рддрд░реАрдХреЗ рд╣реИрдВ: рд╕рд┐рд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рднреА рдПрд▓реЛрдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдПрд▓реЙрдХреЗрдЯрд░ рдЯреНрд░реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдЧреНрд░рд╣ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ; рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ)ред

рдХреЗрд╡рд▓ рдЗрд╕ рджреВрд╕рд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ: рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рдПрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдкреНрд░рдХрд╛рд░ рдЙрд╕ рд╕рдВрдЧреНрд░рд╣ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЖрд╡рдВрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рд╕реА ++ рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ, рдПрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рджреЛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

  • рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╡рдВрдЯрди рдкреИрдЯрд░реНрди, рдФрд░ / рдпрд╛ рдкрд░ рд▓рдХреНрд╖рд┐рдд рдХрд╕реНрдЯрдо рдЖрд╡рдВрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдЧреНрд░рд╣ рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░
  • рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдПрдХ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдЬреЛрдбрд╝реЗрдВ, рдЬрд┐рд╕рд╕реЗ рд╡рд╣ рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд╕рдХреЗ рдЬреЛ рд╡рд╣ рдкрд╣рд▓реЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред

рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЬреЛрдбрд╝рдирд╛

рдпрд╣ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ C ++ рдХреЛрдб-рдмреЗрд╕ рдореЗрдВ 99% рдмрд╛рд░ рджреЗрдЦрддрд╛ рд╣реВрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдПрдХ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕рдВрдпреЛрдЧ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдирд┐рдореНрди рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдЖрд╡рдВрдЯрди рдкреИрдЯрд░реНрди рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╡реЗ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, @SON2314 рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд░реВрдк рдореЗрдВ, "рд╕рд┐рд╕реНрдЯрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ" рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ:

  • рдЫреЛрдЯреЗ рдмрдлрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рдПрд▓реЛрдХреЗрдЯрд░ (рджреЗрдЦреЗрдВ рд╣рд╛рд╡рд░реНрдб рд╣рд┐рдиреЗрдВрдЯ рд╕реНрдЯреИрдХ_рд▓реЙрдХ рдкреЗрдкрд░ )ред рд╡реЗ рдЖрдкрдХреЛ std::vector рдпрд╛ flat_{map,set,multimap,...} рдФрд░ рдЗрд╕реЗ рдПрдХ рдХрд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдХреЗ ( SmallVec ) рдпрд╛ рдмрд┐рдирд╛ ( ArrayVec ) рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдвреЗрд░ рд╡рд╛рдкрд╕ рдЧрд┐рд░ рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреИрдХ рдпрд╛ рд╕реНрдерд┐рд░ рдореЗрдореЛрд░реА (рдЬрд╣рд╛рдВ рдпрд╣ рдЕрдиреНрдпрдерд╛ рдвреЗрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реЛрддрд╛) рдкрд░ рдЕрдкрдиреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдбрд╛рд▓ рд░рд╣рд╛ рд╣реИред

  • рдЦрдВрдбрд┐рдд рдореЗрдореЛрд░реА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ (рдЬреИрд╕реЗ 16-рдмрд┐рдЯ рд╡рд╛рдЗрдб рдкреЙрдЗрдВрдЯрд░ x86 рдЯрд╛рд░рдЧреЗрдЯ рдФрд░ GPGPUs)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, C ++ 17 рд╕рдорд╛рдирд╛рдВрддрд░ STL, C ++ 14 рдХреЗ рджреМрд░рд╛рди, рд╕рдорд╛рдирд╛рдВрддрд░ рддрдХрдиреАрдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдереАред рдпрд╣ рдПрдХ рд╣реА рд▓реЗрдЦрдХ рдХрд╛ рдЕрдЧреНрд░рджреВрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ NVIDIA рдХрд╛ рдереНрд░рд╕реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рдЬрд┐рд╕рдореЗрдВ GPGPU рдореЗрдореЛрд░реА (рдЬреИрд╕реЗ рдереНрд░рд╕реНрдЯ :: device_malloc_allocator ) рдпрд╛ рдкрд┐рди рдХреА рдЧрдИ рдореЗрдореЛрд░реА (рдЬреИрд╕реЗ рдереНрд░рд╕реНрдЯ - pinned_allocator ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдЯреЗрдирд░ рдХреНрд▓реИрд╕ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реЛрдХреЗрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ; рдкрд┐рди рдХреА рдЧрдИ рдореЗрдореЛрд░реА рд╣реЛрд╕реНрдЯ-рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдмреАрдЪ рддреЗрдЬ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХреБрдЫ рдорд╛рдорд▓реЗ)ред

  • рд╕рдорддреБрд▓реНрдпрддрд╛-рд╕рдВрдмрдВрдзреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛, рдЬреИрд╕реЗ рдХрд┐ рдЧрд▓рдд рд╕рд╛рдЭрд╛рдХрд░рдг (рдЬреИрд╕реЗ рдЗрдВрдЯреЗрд▓ рдереНрд░реЗрдб рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХ cache_aligned_allocator ) рдпрд╛ SIMD рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЕрдзрд┐рдХ-рд╕рдВрд░реЗрдЦрдг рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ (рдЬреИрд╕реЗ Eigen3 рдХреЗ aligned_allocator )ред

  • рдЗрдВрдЯрд░рдкреНрд░реЛрд╕реЗрд╕ рд╢реЗрдпрд░реНрдб рдореЗрдореЛрд░реА: рдмреВрд╕реНрдЯ.рдЗрдВрдЯрд░рдкреНрд░реЛрд╕реЗрд╕ рдХреЗ рдкрд╛рд╕ рдлреИрд╕рд┐рд▓рд┐рдЯреАрдЬ (рдЬреИрд╕реЗ рд╕рд┐рд╕реНрдЯрдо V рд╢реЗрдпрд░реНрдб рдореЗрдореЛрд░реА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд▓реЗрдХреНрд╢рди рдХреА рдореЗрдореЛрд░реА рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрд▓реЛрдХреЗрдЯрд░ рд╣реИрдВред рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдореЗрдореЛрд░реА рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рдПрдХ std рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

  • рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣: рд╣рд░реНрдм рд╕рдЯрд░ рдХреА рдЖрд╕реНрдердЧрд┐рдд рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ рдЬреЛ рдХрдЪрд░рд╛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдХреЛрдИ рд╡реЗрдХреНрдЯрд░ рдмрдврд╝рддрд╛ рд╣реИ, рддреЛ рдореЗрдореЛрд░реА рдХрд╛ рдкреБрд░рд╛рдирд╛ рд╣рд┐рд╕реНрд╕рд╛ рддрдм рддрдХ рдЬреАрд╡рд┐рдд рд░рд╣рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЙрд╕ рдореЗрдореЛрд░реА рдХреЗ рд╕рднреА рд╕рдВрдХреЗрдд рдирд╖реНрдЯ рд╣реЛ рдЧрдП рд╣реЛрдВ, рдЬрдм рддрдХ рдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЕрдорд╛рдиреНрдп рди рд╣реЛ рдЬрд╛рдПред

  • рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрдб рдПрд▓реЛрдХреЗрдЯрд░: рдмреНрд▓реВрдордмрд░реНрдЧ рдХреА рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдмреНрд▓реНрд╕реНрдорд╛_рдЯреИрд╕реНрдЯрд▓реЛрд╕реИрдЯрд░ рдЖрдкрдХреЛ рдЙрди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрд╢рди / рдбреАрд▓рд▓реЛрдХреЗрд╢рди (рдФрд░ C ++ - рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди / рд╡рд┐рдирд╛рд╢) рдкреИрдЯрд░реНрди рдХреЛ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХреНрдпрд╛ Vec reserve рдмрд╛рдж рдЖрд╡рдВрдЯрд┐рдд рд╣реЛрддрд╛ рд╣реИ? рдРрд╕реЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдореЗрдВ рдкреНрд▓рдЧ рдХрд░реЗрдВ, рдФрд░ рд╡реЗ рдЖрдкрдХреЛ рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрди рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдЖрдкрдХреЛ рдЙрдирдХрд╛ рдирд╛рдо рджреЗрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХрдИ рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВ рдФрд░ рд▓реЙрдЧ рдХрд╣ рд╕рдХреЗрдВ рдХрд┐ рдХреМрди рд╕реА рд╡рд╕реНрддреБ рдХреНрдпрд╛ рдХрд░ рд░рд╣реА рд╣реИред

рдпреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ C ++ рдореЗрдВ рдЬрдВрдЧрд▓реА рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рджреЗрдЦрддрд╛ рд╣реВрдВред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕рдВрдпреЛрдЧ рд╣реИред рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╡рд┐рд╢реЗрд╖ рдЖрд╡рдВрдЯрди рдкреИрдЯрд░реНрди рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрди рдкреИрдЯрд░реНрди рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рдирд╛ред

AFAIK рд╡рд╣рд╛рдБ рдХрд┐рд╕реА рднреА рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ C ++ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдореИрдВ рд╕рдордЭрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рджреВрд╕рд░реЗ рдореЗрдВ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рднреА рдЖрд╡рдВрдЯрди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╡реЗ рдЖрд╡рдВрдЯрди рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рднрд╛рдЧ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рдВрдЯрди рдкреИрдЯрд░реНрди рдкрд░ рд▓рдХреНрд╖рд┐рдд рдХрд╕реНрдЯрдо рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рд╛рдорд╛рдиреНрдп рд╕рд▓рд╛рд╣ рдЬреЛ рдореИрдВ рдЕрдкрдиреЗ C ++ рджрд┐рдиреЛрдВ рд╕реЗ рдпрд╛рдж рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ рд╕рд┐рд░реНрдл "рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ" (рд╡реЗ рдмрд╣реБрдд рдЕрдВрддрд┐рдо рдЙрдкрд╛рдп рд╣реИрдВ) рдХреНрдпреЛрдВрдХрд┐:

  • рд╕рд┐рд╕реНрдЯрдо рдЖрдмрдВрдЯрдХ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдорд┐рд▓рд╛рди рдмрд╣реБрдд рдХрдард┐рди рд╣реИ, рдЗрд╕реЗ рдкреАрдЯрдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реИ,
  • рдХрд┐рд╕реА рдФрд░ рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрд╢рди рдкреИрдЯрд░реНрди рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдЖрдкрдХреА рдкрддрд▓реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрдиреЗ рдЖрд╡рдВрдЯрди рдкреИрдЯрд░реНрди рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдкрдХреЛ рдХреМрди рд╕реЗ рдПрд▓реЛрдХреЗрдЯрд░ рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХ рдХрд╛ рдорд┐рд▓рд╛рди рдХрд░рдирд╛ рд╣реИред
  • рд╡реЗ рдкреЛрд░реНрдЯреЗрдмрд▓ рдирд╣реАрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХреНрд░реЗрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реА ++ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдЖрд╡рдВрдЯрди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ; рд╡рд┐рдХреНрд░реЗрддрд╛ рдЖрдорддреМрд░ рдкрд░ рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдкрд░ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдПрдХ рд╡рд┐рдХреНрд░реЗрддрд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдПрдХ рд╕рдорд╛рдзрд╛рди рджреВрд╕рд░реЗ рдореЗрдВ рдмреБрд░реА рддрд░рд╣ рд╕реЗ (рд╕рд┐рд╕реНрдЯрдо рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╕реЗ рднреА рдмрджрддрд░) рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  • рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬреЛ рдЗрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдердХ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдХ рдЕрд▓рдЧ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рд╕реНрдореГрддрд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдирд╛, ... рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд┐рдХрд▓реНрдк рдХрдо рдкреНрд░рдпрд╛рд╕ рд╣реИрдВ рдФрд░ рдмрдбрд╝реА рдЬреАрдд рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИрдВред рд╡реЗ рд╣реИрдВ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдлрд╝реМрдирд╛рдерди / рдореЗрдореЛрд░реА рдЬреИрд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░рд┐рдпрд╛рдБ рдЦрд┐рд▓ рд░рд╣реА рд╣реИрдВред рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ рд╡реЗ рдЖрд╡рдВрдЯрди рдХреЗ рдореБрдХрд╛рдмрд▓реЗ рдЬрдВрдЧрд▓реА рдореЗрдВ рдХрдо рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЗ рд╣реИрдВ рдЬреЛ "рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ" рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЬреАрдд рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рд┐рд╕реНрдЯрдо рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рд╣рд░рд╛рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ (Stackoverflow рдкреВрд░реНрдг рд╣реИ "рдореИрдВрдиреЗ Boost.Pool рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рдореЗрд░реЗ рдкреНрд░рджрд░реНрд╢рди рдЦрд░рд╛рдм рд╣реЛ рдЧрдП, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдХреНрдпрд╛ рд╣реБрдЖ? рдореИрдВ Boost.Pool рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред")

рд╕рдореЗрдЯ рд░рд╣рд╛ рд╣реБ

IMO рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ C ++ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдореЙрдбрд▓, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХрджрдо рд╕рд╣реА рд╣реИ, рджреЛрдиреЛрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ Rust рдХреЗ std рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬреНрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рджреЛрдиреЛрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдХрдо рд╕реЗ рдХрдо рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП C ++ рдПрд▓реЛрдХреЗрдЯрд░ рдЙрдкрдпреЛрдЧреА рд╕рд╛рдмрд┐рдд рд╣реБрдП рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╡реИрд╢реНрд╡рд┐рдХ / рдкреНрд░рдгрд╛рд▓реА / рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо / рдбрд┐рдлрд╝реЙрд▓реНрдЯ / рдвреЗрд░ / рдореБрдлреНрдд-рд╕реНрдЯреЛрд░ рдЖрд╡рдВрдЯрди рдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдУрд░реНрдереЛрдЧреЛрдирд▓ рд╣реИ, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рджреЛрдиреЛрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди рдореЗрдВ рджреЗрд░реА рд╣реЛ рд╕рдХрддреА рд╣реИ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗред

рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЛ рдПрдХ рдЖрдмрдВрдЯрдХ рджреНрд╡рд╛рд░рд╛ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡рд╣ рдЙрди рддрд░реАрдХреЛрдВ рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЕрдЧрд░ @rkruppe "рдЖрдмрдВрдЯрди рдЖрд╡рдВрдЯрди рдкреИрдЯрд░реНрди" рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдореИрдВ "рдЭреВрдареА рд╢реЗрдпрд░рд┐рдВрдЧ рдХреЛ рд░реЛрдХрдирд╛" рдпрд╛ "рд╣реАрдк рдлрд╛рд▓рдмреИрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреЗ рдмрдлрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛" рд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдБ, рддреЛ рдпрд╣ рдмрд╕ рдкрд╣рд▓реЗ рд╕реЗ рдХрдард┐рди рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рдПрдХ рджреВрд╕рд░реЗ рдХреА рдЬрд╝рд░реВрд░рддреЛрдВ рдХреЛ рд╕рдордЭреЗрдВ рдФрд░ рджреВрд╕рд░рд╛, рдЖрдЧрдорди рдПрдХ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдЬреЛ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@gnzlbg рд╕рдордЭрджрд╛рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЗрд╕рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдореЗрд░реЗ рдореВрд▓ рдкреНрд░рд╢реНрди рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдореИрдВ рдЗрд╕рдореЗрдВ рд╕реЗ рдХреБрдЫ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рд╣рдо рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдмрд╛рдд рди рдХрд░реЗрдВред

рдореЗрд░рд╛ рдкреНрд░рд╢реНрди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдерд╛:

рдЫреЛрдЯреЗ рдмрдлрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рдПрд▓реЛрдХреЗрдЯрд░ (рджреЗрдЦреЗрдВ рд╣рд╛рд╡рд░реНрдб рд╣рд┐рдиреЗрдВрдЯ рд╕реНрдЯреИрдХ_рд▓реЙрдХ рдкреЗрдкрд░)ред рд╡реЗ рдЖрдкрдХреЛ std :: рд╡реЗрдХреНрдЯрд░ рдпрд╛ рдлреНрд▓реИрдЯ_ {рдореИрдк, рд╕реЗрдЯ, рдорд▓реНрдЯрд┐рдореИрдк, ...} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдХрд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдХреЗ (рд╕реНрдореЙрд▓рд╡реЗрдХ) рдпрд╛ (рдПрд░реЗрд╡реЗрдХ) рд╣реАрдк рдмреИрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреЗ рдмрдлрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдпрд╣, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреИрдХ рдпрд╛ рд╕реНрдерд┐рд░ рдореЗрдореЛрд░реА (рдЬрд╣рд╛рдВ рдпрд╣ рдЕрдиреНрдпрдерд╛ рдвреЗрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реЛрддрд╛) рдкрд░ рдЕрдкрдиреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдбрд╛рд▓ рд░рд╣рд╛ рд╣реИред

Stack_alloc рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рдирд╛, рдореБрдЭреЗ рдЕрдм рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдЖрдорддреМрд░ рдкрд░ SmallVec (рдЬрд╣рд╛рдВ рдмрдлрд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЗрдирд▓рд╛рдЗрди рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рд╕реЗ рдорддрд▓рдм рд╣реИ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдЙрд╕ рд╡рд┐рдХрд▓реНрдк рд╕реЗ рдЪреВрдХ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдкрдХреНрд╖ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЙрдард╛рддрд╛ рд╣реИ рдЬрдм рд╕рдВрдЧреНрд░рд╣ рдЪрд▓рддрд╛ рд╣реИ (рдФрд░ рдЙрди рдЪрд╛рд▓реЛрдВ рдХреЛ рднреА рд╕рд╕реНрддрд╛ рдмрдирд╛рддрд╛ рд╣реИ )ред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ short_alloc рдХрдИ рд╕рдВрдЧреНрд░рд╣реЛрдВ рдХреЛ рдПрдХ arena рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ SmallVec рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рдФрд░ рднреА рдЕрдзрд┐рдХ рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд░реЗрдЦреАрдп / рдмрдореНрдк-рдкреЙрдЗрдВрдЯрд░ рдПрд▓реЛрдХреЗрдЯрд░ рдЬреИрд╕рд╛ рд╣реИ рдЬреЛ рдПрд▓реЙрдЯреЗрдб рд╕реНрдкреЗрд╕ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реЛрдХреЗрд╢рди рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдФрд░ cache_aligned_allocator рдореВрд▓ рд░реВрдк рд╕реЗ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВред рд╡реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ "рдЖрд╡рдВрдЯрди рдкреИрдЯрд░реНрди" рдХреА рдЖрдкрдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╡рдВрдЯрди рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рдХреЗ рдвреЗрд░ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рд╕рдЯрд░ рдХреЗ рдЖрд╕реНрдердЧрд┐рдд рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдЬреИрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреЛ рдПрдХ "рдкреЙрдЗрдВрдЯрд░" рдХрд╛ рднреА рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рдЕрд▓рдЧ рдЖрд╡реЗрджрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

Stack_alloc рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рдирд╛, рдореБрдЭреЗ рдЕрдм рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдЖрдорддреМрд░ рдкрд░ SmallVec (рдЬрд╣рд╛рдВ рдмрдлрд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЗрдирд▓рд╛рдЗрди рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рд╕реЗ рдорддрд▓рдм рд╣реИ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдЙрд╕ рд╡рд┐рдХрд▓реНрдк рд╕реЗ рдЪреВрдХ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдкрдХреНрд╖ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЙрдард╛рддрд╛ рд╣реИ рдЬрдм рд╕рдВрдЧреНрд░рд╣ рдЪрд▓рддрд╛ рд╣реИ (рдФрд░ рдЙрди рдЪрд╛рд▓реЛрдВ рдХреЛ рднреА рд╕рд╕реНрддрд╛ рдмрдирд╛рддрд╛ рд╣реИ )ред

рдореИрдВрдиреЗ stack_alloc рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ "рдПрдХ рдкреЗрдкрд░" рдХреЗ рд╕рд╛рде рдПрдХрдорд╛рддреНрд░ рдРрд╕рд╛ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ 2009 рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ C ++ 11 (C ++ 03 рдиреЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд░рд╛рдЬреНрдпрд╡рд╛рд░ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛)ред

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ C ++ 11 (рдЬреЛ рд░рд╛рдЬреНрдпрд╡рд╛рд░ рдЖрд╡рдВрдЯрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ) рдореЗрдВ рдпрд╣ рдХрд╛рдо рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╣реИ:

  • std :: рд╡реЗрдХреНрдЯрд░ рдПрдХ Allocator рд╡рд╕реНрддреБ рдХреЛ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рд░рдЦрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд░реБрд╕реНрдЯ RawVec рдХрд░рддрд╛ рд╣реИ ред
  • рдПрд▓реЛрдХреЗрдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯ рд╕рдВрдкрддреНрддрд┐ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕реЗ рдПрд▓реЛрдХреЗрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ true рд╣реИред рдпрджрд┐ рдпрд╣ рд╕рдВрдкрддреНрддрд┐ false , рддреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдкрд░, рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рдЪрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдорд╛рдирдХ рджреНрд╡рд╛рд░рд╛ рдЗрд╕рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рдирдП рднрдВрдбрд╛рд░рдг рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЗрд╕рд▓рд┐рдП рдЬрдм рд╕рд┐рд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реНрдЯреИрдХ рдкрд░ рдирдП рд╡реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реНрдЯреЛрд░реЗрдЬ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдПрд▓реЛрдХреЗрдЯрд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреЛ рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рд╣реИ), рдФрд░ рдлрд┐рд░ 3 рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрднреА рднреА рдорд╛рдиреНрдп рд╣реИрдВред рдРрд╕реА рдЪрд╛рд▓ O(1) ред

OTOHO, рдЬрдм POCMA == true рдПрд▓реЛрдХреЗрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реЗрдХреНрдЯрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реНрдЯреИрдХ рдкрд░ рдирдП рд╡реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рднрдВрдбрд╛рд░рдг рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЦрд╛рд▓реА рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдкреБрд░рд╛рдирд╛ рд╕рдВрдЧреНрд░рд╣ drain ed рд╣реИред рдирдпрд╛, рддрд╛рдХрд┐ рдкреБрд░рд╛рдирд╛ рдЦрд╛рд▓реА рд╣реЛ, рдФрд░ рдирдпрд╛ рднрд░рд╛ рд╣реБрдЖ рд╣реЛред рдпрд╣ рдЙрдирдХреЗ рдЪрд╛рд▓ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрджрдо O(N) рдФрд░ рддрддреНрд╡реЛрдВ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдореВрд▓ рдЕрдм рдЦрд╛рд▓реА рд╕рдВрдЧреНрд░рд╣ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдПрдХ рдХреНрд▓реЛрди рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рддрддреНрд╡ рд╕реНрд╡рдпрдВ рдХреНрд▓реЛрди рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди C ++ рдореЗрдВ рдЪрд▓реЗ рдЧрдП рд╣реИрдВред

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рд╣реИ?

C ++ рдореЗрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐:

  • рд╡реЗрдХреНрдЯрд░ рд╡рд┐рдХрд╛рд╕-рдиреАрддрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ
  • рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ API рдХреЗ рдкрд╛рд╕ _excess рд╡рд┐рдзрд┐рдпрд╛рдБ рдирд╣реАрдВ рд╣реИрдВ
  • рдКрдкрд░ рджрд┐рдП рдЧрдП рджреЛ рдореБрджреНрджреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ рд╡реЗрдХреНрдЯрд░ рдЕрдзрд┐рдХрддрдо 9 рддрддреНрд╡реЛрдВ рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдЯреИрдХ рдПрд▓реЛрдХреЗрдЯрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ 9 рддрддреНрд╡реЛрдВ рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рд╡реЗрдХреНрдЯрд░ рдмрдврд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЗрд╕рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд╛рд░рдХ 8 рд╣реЛред рез.рел рдореЗрдВ рд╕реЗ резред рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЬрдЧрд╣ рдХрдо рдХрд░рдиреЗ рдФрд░ рд╕реНрдерд╛рди рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  • рдПрд▓реЛрдХреЗрдЯрд░ рдЧреБрдгреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡реЗрдХреНрдЯрд░ рдСрдкрд░реЗрд╢рди рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреА рдЬрдЯрд┐рд▓рддрд╛ (POCMA рд╕рд┐рд░реНрдл рдХрдИ рдЧреБрдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ C ++ Allatorator API рдХреЗ рдкрд╛рд╕ рд╣реИред C ++ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд▓рд┐рдЦрдирд╛ рдЧреИрд░-рддреБрдЪреНрдЫ рд╣реИ)ред рдпрд╣ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдПрдкреАрдЖрдИ рдХреЛ рдПрдХ рджрд░реНрдж рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрднреА-рдХрднреА рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмреАрдЪ рддрддреНрд╡реЛрдВ рдХреЛ рдХреЙрдкреА рдпрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЧрдд рд╣реЛрддреА рд╣реИ, рдЬреЛ рдСрдкрд░реЗрд╢рди рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдмрджрд▓ рджреЗрддреА рд╣реИред рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХреЛ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рджрд░реНрдж рднреА рдмрдирд╛рддрд╛ рд╣реИред рдиреЛрдЯрдмрдВрджреА рдЬреИрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдХрдИ рдСрдирд▓рд╛рдЗрди рд╕реНрд░реЛрддреЛрдВ рдиреЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЛ рдЙрд▓реНрдЯрд╛ рдХрд░ рджрд┐рдпрд╛, рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде 99% рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯреЗ рд╕реЗ рдЫреЛрдЯреЗ рдЕрдХреНрд╖рд░реЛрдВ рдореЗрдВ рдЕрдЧрд░ рдПрдХ рдЖрд╡рдВрдЯрди рд╕рдВрдкрддреНрддрд┐ рд╕рд╣реА рдпрд╛ рдЧрд▓рдд рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╡рд░рдгред

рдЗрди рдореБрджреНрджреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП C ++ рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдПрдкреАрдЖрдИ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд▓реЛрдЧ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, _excess рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдФрд░ рдЗрд╕ рдмрд╛рдд рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реБрдП рдХрд┐ рдорд╛рдирдХ рдЕрдиреБрд░реВрдк рд╕рдВрдЧреНрд░рд╣ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдФрд░ cache_aligned_allocator рдореВрд▓ рд░реВрдк рд╕реЗ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВред

рд╢рд╛рдпрдж рдореЗрд░рд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдЖрдкрдХреЛ рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдпрд╛ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЖрдк рдкрд╣рд▓реЗ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдереЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, C ++ рдореЗрдВ рдЖрдк рд╕реНрдЯреИрдХ рдПрд▓реЛрдХреЗрдЯрд░ рдЬреИрд╕реА рдЪреАрдЬрд╝ рдХреЗ рдмрд┐рдирд╛ рдЕрдкрдиреЗ рдмрд╛рдЗрдирд░реА рдХреЗ рд╕реНрдерд┐рд░ рдореЗрдореЛрд░реА рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдирд╣реАрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдлрд┐рд░ рднреА рдЖрдк рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ)ред OTOH, C ++ рдорд╛рдирдХ SIMD рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддрд░рд╣ рд╕рдВрд░реЗрдЦрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк new рд╕рд╛рде рдПрдХ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░реЗрдВрдЧреЗ (рдЖрдкрдХреЛ posix_memalign рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ) ред рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдо рддреМрд░ рдкрд░ рдПрдХ segfault (*) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рддрд╛ рд╣реИред aligned_allocator рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдЖрдкрдХреЛ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдЕрд▓рдЧ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдП рдмрд┐рдирд╛, рдЙрдиреНрд╣реЗрдВ рдПрд╕рдЖрдИрдбреА рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирдП рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрд╡рдВрдЯрди рдкреИрдЯрд░реНрди рд╣реЛрдВрдЧреЗ (рдпреЗ рдЖрд╡рдВрдЯрди рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рднреА рдореЗрдореЛрд░реА btw рдХреЛ рдУрд╡рд░рд▓реИрдЧ рдХрд░рддреЗ рд╣реИрдВ ...), рд▓реЗрдХрд┐рди рдЬреЛ рд▓реЛрдЧ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рд╡реЗ рдкрд╣рд▓реЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдереЗред

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд░рд╕реНрдЯ C ++ рдирд╣реАрдВ рд╣реИред рдФрд░ рд╕реА ++ рдореЗрдВ рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдЬрдВрдЧ рдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИрдВ (рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд)ред рдПрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдЬреЛ C ++ рдореЗрдВ рдПрдХ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, Rust рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SIMD рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

(*) Eigen3 рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕реЗ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдкреАрдбрд╝рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ C ++ рдФрд░ STL рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ SIMD рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдХрдВрдЯреЗрдирд░реЛрдВ рдХреА рд░рдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдпрд╛ SIMD рдкреНрд░рдХрд╛рд░реЛрдВ ( Eigen3 рдбреЙрдХреНрд╕ ) рд╕реЗ рдпреБрдХреНрдд рдФрд░ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХрднреА рднреА рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ new рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЙрдирдХреЗ рд▓рд┐рдП new ( рдЕрдзрд┐рдХ Eigen3 рдбреЙрдХреНрд╕ )ред

@gnzlbg рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рднреА рд╕реНрдореЙрд▓рд╡реЗрдХ рдПрдХреНрд╕реИрдореНрдкрд▓ рджреНрд╡рд╛рд░рд╛ рдЙрд▓рдЭрди рдореЗрдВ рдерд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдЬрдВрдЧрдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдЬрдВрдЧ рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрд▓реЛрдХрд╛ --- рд╕рдореАрдХреНрд╖рд╛ рдореЗрдВ рджреЛ рдЖрд░рдПрдлрд╕реА рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдЕрдзрд┐рдХ рдЕрдиреБрд╡рд░реНрддреА рдХрд╛рд░реНрдп --- рддрд╛рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЙрд╕ рд╕рдордп рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдпреЛрдЧреНрдпрддрд╛ рди рд╣реЛред рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕реНрдЯреИрдХ рд╕реНрдкреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдореМрдЬреВрджрд╛ рдЫреЛрдЯреА рд╕реА рд░рдгрдиреАрддрд┐ рдЖрдкрдХреЛ рдЕрдм рдареАрдХ рд▓рдЧрддреА рд╣реИред

рдореИрдВ @rkruppe рд╕реЗ рднреА рд╕рд╣рдордд рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИред рдХрднреА-рдХрднреА рдкреВрд░реНрдг Collection<Allocator> рдореЗрдВ рдирдП рдЧреБрдг рд╣реЛрддреЗ рд╣реИрдВ (рдореМрдЬреВрджрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд┐рди рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдореЗрдВ, рдХрд╣рддреЗ рд╣реИрдВ) рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╡рдВрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рд┐рд░реНрдл рдПрдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдкрд░рд┐рдгрд╛рдо рд╣реИред

рдпрд╣рд╛рдВ рдЬреЛ рдЕрдкрд╡рд╛рдж рдореБрдЭреЗ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рд╡рд╣ рд╣реИ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЖрдХрд╛рд░ / рдкреНрд░рдХрд╛рд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ (NVidia рд╡рд╛рд▓реЗ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрд▓реИрдм рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрд░рддреЗ рд╣реИрдВ)ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрд▓рдЧ ObjAlloc<T> рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ: impl<A: Alloc, T> ObjAlloc<T> for A ред рддрдм, рд╕рдВрдЧреНрд░рд╣ рдУрдмреНрдЬрд╛рд▓реЛрдХ рд╕реАрдорд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдпрджрд┐ рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреБрдЫ рд╣рдж рддрдХ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рднреА рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдЕрдиреБрдХреВрд▓ рддрд░реАрдХреЗ рд╕реЗ рдкреАрдЫреЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рд╣реИ?

рдЬрд╝рд░реВрд░ рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдХрджрдо рдирд╣реАрдВ рд╣реИред рддреЛ (рдЪрд▓) рдЖрд╡рдВрдЯрди рдЬреЛ рд╕реАрдзреЗ рдореЗрдореЛрд░реА рдХреЛ рд╕рдорд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдХреЗрд╡рд▓ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, C ++ рдореЗрдВ рдЖрдк рд╕реНрдЯреИрдХ рдПрд▓реЛрдХреЗрдЯрд░ рдЬреИрд╕реА рдЪреАрдЬрд╝ рдХреЗ рдмрд┐рдирд╛ рдЕрдкрдиреЗ рдмрд╛рдЗрдирд░реА рдХреЗ рд╕реНрдерд┐рд░ рдореЗрдореЛрд░реА рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдирд╣реАрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдлрд┐рд░ рднреА рдЖрдк рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ)ред

рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реИред рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдХрдИ рд╡реИрдз рдХрд╛рд░рдг рд╣реИрдВ рдЬрд╣рд╛рдБ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдЙрдирдХреА рд╕реНрдореГрддрд┐ рдорд┐рд▓рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рд╕рднреА "рдмрд╛рд╣реНрдпрддрд╛рдУрдВ" рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ рдЬреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рди, рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдореЗрдореЛрд░реА рд▓реЗрдЖрдЙрдЯ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг, рдЖрджрд┐ред

Align_allocator рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдЖрдкрдХреЛ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдЕрд▓рдЧ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдП рдмрд┐рдирд╛, рдЙрдиреНрд╣реЗрдВ рдПрд╕рдЖрдИрдбреА рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЯреАрдмреАрдмреА рдХреЗ cache_aligned_allocator рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рди рдХрд┐ Eigen рдХреЗ align_allocator рдХрд╛ред cache_aligned_allocator рдЕрдкрдиреЗ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд░реЗрдЦрдг рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ (рдпрд╣ рд╕рд┐рд░реНрдл рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ "рдЖрдорддреМрд░ рдкрд░" 128 рдмрд╛рдЗрдЯ рд╣реИ), рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдХрд┐рдпрд╛ рддреЛ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рд╕рдВрд░реЗрдЦрдг рд╕рдВрднрд╡рддрдГ рдЖрдо рддреМрд░ рдкрд░ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИред SIMD рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреГрд╖реНрда-рд╕рдВрд░реЗрдЦрд┐рдд DMA рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ)ред рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, рдЭреВрдареЗ рдмрдВрдЯрд╡рд╛рд░реЗ рд╕реЗ рдмрдЪрдирд╛ рд╣реИред

@gnzlbg

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдЖрд╡рдВрдЯрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИрдВред

рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ рдорддрд▓рдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрдк рдПрд▓реЛрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬрд╝ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╛ рдЖрдкрдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рд▓рдХреНрд╖рдг рдФрд░ рдЕрдВрддрд┐рдо рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдкрд░ рдПрд▓реЛрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЗрди рджреЛ рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛; рдореБрдЭреЗ рдмреЗрд╣рддрд░ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдореИрдВ рдПрдХ рдПрд▓реЛрдХреЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ:

  • рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ
  • рдиреЛ-рдПрд╕рдЯреАрдбреА рдорд╛рд╣реМрд▓ рдореЗрдВ

рдФрд░ рдорд╛рди рд▓реЗрдВ рдХрд┐ рдореИрдВ рдЗрд╕ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реВрдб рдХреЗ рдиреАрдЪреЗ Vec рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рд╕реАрдзреЗ рддреМрд░ рдкрд░ Vec рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдЬ рдореМрдЬреВрдж рд╣реИ

  • рдЕрдЧрд░ рдореИрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрдмрдВрдЯрдХ рд╣реВрдВ, рддреЛ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рд╕реЗ рд╕рд┐рд░реНрдл рдЦреБрдж рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рд╣реЛрдЧрд╛
  • рдпрджрд┐ рдореИрдВ рдПрдХ рдиреЛ-рдПрд╕рдЯреАрдбреА рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╣реВрдВ, рддреЛ рдХреЛрдИ Vec рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдЬ рднреА рдореМрдЬреВрдж рд╣реИ

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореБрдЭреЗ рдЬреЛ рдХреБрдЫ рднреА рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдПрдХ Vec рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрд┐ рдПрдХ рдЕрдиреНрдп рдПрд▓реЛрдХреЗрдЯрд░ рдкрд░ рдкреИрд░рд╛рдЯреНрд░рд╛рдЗрдЬреНрдб рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдЖрдВрддрд░рд┐рдХ рдЖрдВрддрд░рд┐рдХ рдмрд╣реАрдЦрд╛рддрд╛ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ bsalloc рдХрд╛ рд▓рдХреНрд╖реНрдп рд╣реИ (рдФрд░ рдирд╛рдо рдХрд╛ рд╕реНрд░реЛрдд - рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп

рдПрд▓реНрдлрдорд╛рд▓реЙрдХ рдореЗрдВ, рд╣рдо рдЕрднреА рднреА рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдмрдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ:

  • рдЬрдм рдЦреБрдж рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЬреЗрдорд▓реЙрдХ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ
  • рдПрдХ рд╕рд╛рдЭрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЕрдиреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрднрд╛рдЬрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрднрд╛рдЬрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХреНрдпреЛрдВрдХрд┐ рддрдм, рдПрдХ рдмрд╛рд░ рд▓реЛрдб, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдирд┐рд░реНрднрд░рддрд╛ рдлрд┐рд░ рд╕реЗ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╣рдо рдкреНрд░рдгрд╛рд▓реА рд╕рдВрднрд╛рдЬрдХ рд╣реИрдВ рд╕рдВрдХрд▓рди рдирд╣реАрдВ рд╣реИред

рд▓реЗрдХрд┐рди рдпрд╣ рддрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрдм:

  • рдХреЛрдИ рд╣рдореЗрдВ "рдЖрдзрд┐рдХрд╛рд░рд┐рдХ" рддрд░реАрдХреЗ рд╕реЗ рд░рд╕реНрдЯ рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рд╕рд╛рдЭрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рд╕реЗ рд╡рд┐рд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)
  • рд╣рдо рдПрдХ no-std рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╣реИрдВ

OTOH, C ++ рдорд╛рдирдХ SIMD рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддрд░рд╣ рд╕рдВрд░реЗрдЦрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдирдП рдХреЗ рд╕рд╛рде рдПрдХ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ (рдЖрдкрдХреЛ posix_memalign рдпрд╛ рд╕рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред

рдЪреВрдБрдХрд┐ рд╣рдорд╛рд░рд╛ рд╡рд░реНрддрдорд╛рди Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд░реЗрдЦрдг рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд░реНрдЧ ("рдореИрдВ рдПрдХ рдЕрд▓рдЧ рд╕рдВрд░реЗрдЦрдг рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛" рд╕рдорд╕реНрдпрд╛) рд╣рдорд╛рд░реЗ рд▓рд┐рдП рджреВрд░ рдЬрд╛рддреА рд╣реИ?

@gnzlbg - рдПрдХ рд╡реНрдпрд╛рдкрдХ рд▓реЗрдЦрди-рдЕрдк (рдзрдиреНрдпрд╡рд╛рдж) рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд▓рдЧрд╛рддрд╛рд░ рд╕реНрдореГрддрд┐ * рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рджреГрдврд╝рддрд╛ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╕рд╣реА рд╣реИ: -

  • рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реИ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЬрдм рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрд╡рдВрдЯрд┐рддрдХрд░реНрддрд╛ рд▓рдЧрд╛рддрд╛рд░ рд╕реНрдореГрддрд┐ рдХреЗ рд▓рд┐рдП рд╣реИ, рддреЛ рдпрд╣ рдХрднреА рднреА рд╕рд┐рд╕реНрдЯрдо рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛; (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрдИ рд▓рдЧрд╛рддрд╛рд░ рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрдЯрд░реНрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ)
  • рдорд╛рдирдХ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рдЕрдзрд┐рдХ рд╣реИ, рдФрд░ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рдХреЛрдб рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред
  • рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ 'static ред
  • рдирд┐рд░рдВрддрд░ рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдерд┐рддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдХрд┐ рдвреЗрд░ рд╕реЗ рдкреЙрдкреБрд▓реЗрдЯреЗрдб рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рдд рдЙрдиреНрд╣реЗрдВ рд░рд╛рдЬреНрдп рдХреЗ рдкреБрдирд░реНрдирд┐рд╡реЗрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореНрдпреВрдЯреЗрдХреНрд╕ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓рд┐рдП рд╣реИред рдПрдХ рдмрд╛рд░ рдЬреЛ рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓ рдерд╛ рд╡рд╣ рдЕрдм рдирд┐рдкрдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИред

рд░рд╕реНрдЯ рдХреЗ рдкрд╛рд╕ рдпрд╣рд╛рдВ рдкрд╣рд▓ рдХреЛ рдЬрдмреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЕрд╡рд╕рд░ рд╣реИ, рдФрд░ рдпрд╣ рдПрдЪрдбреА, рдПрд╕рдПрд╕рдбреА рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреАрд╕реАрдЖрдИ-рд╕рдВрд▓рдЧреНрди рднрдВрдбрд╛рд░рдг рдХреА рдЬрдЧрд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХрд╛ рдордВрдЪ рдмрдирд╛ рджреЗрдЧрд╛ред

* рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЬрдм рддрдХ рдпрд╣ рдереЛрдбрд╝рд╛ рд╡рд┐рд╢реЗрд╖ рд╣реИред рдЕрдм рдпрд╣ рд▓рд┐рдирдХреНрд╕, рдлреНрд░реАрдмреАрдПрд╕рдбреА рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реИред

@raphaelcohn

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рд╕реНрдореГрддрд┐ рдмрд╛рд╣рд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЖрдкрдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛ рдирд╣реАрдВ рд╣реИ- рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкрддрд╛ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдЪрд▓рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдЕрдЦрдВрдбрддрд╛ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рддреЗрдЬ рдбрд┐рд╕реНрдХ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рд╣реИред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд▓рдЧрд╛рддрд╛рд░ рд╕реНрдореГрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдерд╛рди рдкрд░ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдмрдирд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд░реЗрдВ, рдЖрд╡рдВрдЯрдирдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХреБрдЫ рдФрд░ рдареЛрд╕ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ, рдФрд░ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдпрд╣ рдорд╛рдорд▓рд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдкрд░рд┐рд╡рд░реНрддрди рдЙрди рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рд▓рд╛рдпрдХ рд╣реИрдВ рдЬреЛ рдЙрдирдХреЗ рдФрд╕рдд рдорд╛рдорд▓реЗ рдкрд░ рд╣реЛрдВрдЧреЗред

@rpjohnst

рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВред рдпрд╣ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХрд╛ рд╕реНрдерд╛рди рд╣реИ рдЬреИрд╕рд╛ рд╡рд╣ рд╣реИред рдореИрдВ рдПрдХ рдРрд╕реЗ рдирд┐рд░реНрдгрдп рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рдРрд╕рд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдмрд╣реБрдд рд╣реА рд╕рдВрдХреАрд░реНрдг рд╣реИ рдФрд░ рдПрдХ рд╕рд╛рдХреНрд╖реНрдп рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИред

рд╡рд░реНрддрдорд╛рди рдЗрдВрдЯреЗрд▓ рдкреАрдПрдордбреАрдХреЗ - рдЬреЛ рдХрд┐ рдирд┐рдореНрди-рд╕реНрддрд░ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдВрддрд░рд┐рдХреНрд╖ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рд╣реИ - рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ, рдЗрд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдирд┐рдпрдорд┐рдд рдореЗрдореЛрд░реА - рдореЗрдореЛрд░реА рдЬреЛ mmap рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдорд╛рди рд╣реИ, рдХрд╣рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдХреЛрдИ рд▓рд┐рдирдХреНрд╕ рдкрд░ рд▓рдЧрд╛рддрд╛рд░ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдлрд┐рд▓рд╣рд╛рд▓ рдЖрдкрдХреЗ рдХреЙрд▓ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдкреЛрд░реНрдЯ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдиреНрдирдд рдЯреВрд▓рдХрд┐рдЯ рдореЗрдВ рд╕реЗ рдПрдХ - рдкреНрд░рдЪрд▓рд┐рдд рдПрдХ рдЕрдЧрд░ рдЖрдк рдХрд░реЗрдВрдЧреЗ - рдЗрд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рд╕реНрдореГрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддреЗ рд╣реИрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдареАрдХ рд╣реИ, рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдХрд╣рд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рд╣реИ: -

рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрдХ рд▓рдЧрд╛рддрд╛рд░ рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрдЯрд░ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, libpmemcto) рдХреЗ рд▓рд┐рдП рд░рд╕реНрдЯ рд░реИрдкрд░ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

(рдЖрдк рдореЗрд░реЗ рдЯреЛрдХрд░реЗ рдХреЗ рд╢реБрд░реБрдЖрддреА рджрд┐рдиреЛрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ https://crates.io/crates/nvml рдкрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред cto_pool рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реНрд░реЛрдд рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рдпреЛрдЧ рд╣реИ)ред

рдореЗрд░рд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛, рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░реЗрдЬ рдЗрдВрдЬрди рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдХрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕реА рддрд░рд╣ рдХреА рдорд╛рдирд╕рд┐рдХрддрд╛ рдореЗрд░реЗ рдХрдИ рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдкреАрдЫреЗ рд╣реИред рдореИрдВрдиреЗ рдХрдИ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдкрд╛рдпрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдорд╛рдирдХ рд╣реИрдВ, рдЬреЛ _from_ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

рд╡рд░реНрддрдорд╛рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рд╕рдЪ рдХрд╣реВрдБ, рддреЛ Alloc рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрднрд╡, рдлрд┐рд░ рдкреВрд░реЗ Vec рдирдХрд▓ рдХрд░рдирд╛, рдлрд┐рд░ рдЗрд╕реЗ рдЯреНрд╡рд┐рдХ рдХрд░рдирд╛ рджрд░реНрджрдирд╛рдХ рдерд╛ред рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реНрдерд╛рди рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреИрд╕реЗ Vec::new() ред

рдЗрд╕реЗ рдХрд░рдиреЗ рдореЗрдВ, рдореИрдВрдиреЗ рдЕрдкрдиреА рдореВрд▓ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдпрд╛ рдХрд┐ рдПрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреА рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рдРрд╕реЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЖрд╡рдВрдЯрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдереНрд░реЗрдб рдкрд░ рдмрд╣реБрдд рдорд╛рдиреНрдп рд╣реИрдВред

рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ https://github.com/rust-lang/rust/issues/32838#issuecomment -358940992 рд╕реЗ рдЖрдкрдХреЗ рдкрд╣рд▓реЗ 3 рдмреБрд▓реЗрдЯ рдкреЙрдЗрдВрдЯ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рд╣реИрдВред

рдореИрдВ рдмрд╕ рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рд╕реВрдЪреА рдореЗрдВ рдЧреИрд░-рд╡рд╛рд╖реНрдкрд╢реАрд▓ рдореЗрдореЛрд░реА рдирд╣реАрдВ рдЬреЛрдбрд╝реА
рдХреНрдпреЛрдВрдХрд┐ рд╕реВрдЪреА рд╕реВрдЪреАрдмрджреНрдз рдЖрд╡рдВрдЯрди рдорд╛рдорд▓реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреИрд░рд╛рдЯреНрд░рд╛рдЗрдЬрд┐рдВрдЧ рдХрдВрдЯреЗрдирд░
рд╕реА ++ рджреБрдирд┐рдпрд╛ рдЬреЛ "рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ" рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рдЕрдиреБрднрд╡ (рдЙрди рдкрд░)
рдореИрдВрдиреЗ рдЬрд┐рди рдбреЙрдХреНрдЯрд░реЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд╡реЗ рдЬреНрдпрд╛рджрд╛рддрд░ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рд╣реИрдВред
рдЬрдмрдХрд┐ рдореБрдЭреЗ рдЗрдВрдЯреЗрд▓ рдПрд╕рдбреАрдХреЗ (рдЙрдирдХреЗ рдХреБрдЫ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХрд╛ рдкрддрд╛ рд╣реИ
C ++ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░реЗрдВ) рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ (рдХреНрдпрд╛ рдЙрдирдХреЗ рдкрд╛рд╕ рд╣реИ)
рдПрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ std :: рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛)ред рдпрд╣ рдирд╣реАрдВ рд╣реИ
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рди рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рдореБрдЭреЗ рдЬрд╛рдирдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА
рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реА рдкреЛрд╕реНрдЯ рдХрд╛ рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдпрд╣ рдерд╛ рдХрд┐ рдкреИрд░рд╛рдбреНрд░рд╛рдЗрдЬрд╝рд┐рдВрдЧ
рдХрдВрдЯреЗрдирд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рдВрдЯрди рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП
рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рджрд░рд╡рд╛рдЬреЗ рдХреЛ рдмрдВрдж рдХрд┐рдП рдмрд┐рдирд╛ рд╕рд┐рд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рдЧрддрд┐
(рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП)ред

рд╕рди 21. рдЬрдирд╡рд░реА 2018 рдХреЛ 17:36 рдкрд░, рдЬреЙрдиреАрди рд╕реВрдЪрдирд╛рдПрдБ @ithub.com рдиреЗ рд▓рд┐рдЦрд╛:

рдЕрдЪреНрдЫреА рдЦрдмрд░ # 32838 (рдЯрд┐рдкреНрдкрдгреА) рд╕реЗ рдЖрдкрдХреЗ рдкрд╣рд▓реЗ 3 рдмреБрд▓реЗрдЯ рдкреЙрдЗрдВрдЯ рд╣реИрдВ
https://github.com/rust-lang/rust/issues/32838#issuecomment-358940992
рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/32838#issuecomment-359261305 ,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AA3Npk95PZBZcm7tknNp_Cqrs_3T1UkEks5tM2ekgaJpZM4IDYUN
ред

рдореИрдВрдиреЗ рдЬреЛ рдХреБрдЫ рд▓рд┐рдЦрд╛ рд╣реИ, рдЙрд╕рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрдврд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдБ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рдЦреЗрдж рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рдЪреВрдХ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдЬрд╛рддрд╛ рд╣реИ:

рдХреБрдЫ рдЬреЛ рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИ (рд╕реА / рд╕реА ++ рдореЗрдВ) "рдкреНрд░рддрд┐ рдлреНрд░реЗрдо рд╕реНрдХреНрд░реИрдЪ рдЖрд╡рдВрдЯрди" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд░реИрдЦрд┐рдХ / рдЯрдХреНрдХрд░ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╣реИ рдЬреЛ рдЙрди рдЖрд╡рдВрдЯрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рдЬреАрд╡рд┐рдд рд╣реИрдВ (рдореЗрдВ рдПрдХ рдЧреЗрдо рдлреНрд░реЗрдо) рдФрд░ рдлрд┐рд░ "рдирд╖реНрдЯ"ред

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╖реНрдЯ рд╣реЛрдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░реАрд╕реЗрдЯ рдХрд░ рджреЗрддреЗ рд╣реИрдВред рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдХреЛрдИ рднреА "рд╡рд┐рдирд╛рд╢" рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ POD рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рд╣реИ (рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛрдИ рднреА рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ)

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХреБрдЫ рд░реБрд╕реНрдЯ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЖрд╡рдВрдЯрди рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд╕рд╛рде рдлрд┐рдЯ рд╣реЛрдЧрд╛?

(рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдХреЛрдИ рд╡рд┐рдирд╛рд╢ рдирд╣реАрдВ рд╣реИ)

@emoon

рдХреБрдЫ рдЬреЛ рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИ (рд╕реА / рд╕реА ++ рдореЗрдВ) "рдкреНрд░рддрд┐ рдлреНрд░реЗрдо рд╕реНрдХреНрд░реИрдЪ рдЖрд╡рдВрдЯрди" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд░реИрдЦрд┐рдХ / рдЯрдХреНрдХрд░ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╣реИ рдЬреЛ рдЙрди рдЖрд╡рдВрдЯрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рдЬреАрд╡рд┐рдд рд╣реИрдВ (рдореЗрдВ рдПрдХ рдЧреЗрдо рдлреНрд░реЗрдо) рдФрд░ рдлрд┐рд░ "рдирд╖реНрдЯ"ред

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╖реНрдЯ рд╣реЛрдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░реАрд╕реЗрдЯ рдХрд░ рджреЗрддреЗ рд╣реИрдВред рдЗрди рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ "рд╡рд┐рдирд╛рд╢" рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ POD рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛрдИ рднреА рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ)

рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░реЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░, рдЖрдкрдХреЛ рдЕрдЦрд╛рдбрд╝реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╕реНрддреБ рдЪрд╛рд╣рд┐рдП рдФрд░ рджреВрд╕рд░реА рд╡рд╕реНрддреБ рдЬреЛ рдЕрдЦрд╛рдбрд╝реЗ рдкрд░ рдПрдХ рдкреНрд░рддрд┐-рдлреНрд░реЗрдо рд╣реИрдВрдбрд▓ рд╣реИред рдлрд┐рд░, рдЖрдк рдЙрд╕ рд╣реИрдВрдбрд▓ рдХреЗ рд▓рд┐рдП Alloc рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк рдЖрд╡рдВрдЯрди рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рд╕реБрд░рдХреНрд╖рд┐рдд рд░реИрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Box Alloc рдкрд░ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдмрди рдЬрд╛рддрд╛ рд╣реИ), рдкреНрд░рддрд┐-рдлреНрд░реЗрдо рд╣реИрдВрдбрд▓ рдЧрд┐рд░рд╛рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдмрдВрдЯрд┐рдд рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдЖрд╡рдВрдЯрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП dealloc рдлрд┐рд░ рднреА рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ dealloc рдПрдХ рдиреЛ-рдСрдк рдерд╛, рддреЛ рд╕рдВрдкреВрд░реНрдг рдбреНрд░реЙрдк-рдПрдВрдб-рдбреАрд▓реЙрд▓реЗрдЯ рддрд░реНрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрд╛ рдЕрдзрд┐рдХрддрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЖрдк рдПрдХ рдХрд╕реНрдЯрдо рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ Drop рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рдХрд╣реАрдВ рдФрд░ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдВрдЧреАред

рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдореВрд▓ рдкреЛрд╕реНрдЯ рдореЗрдВ рдПрдХ рдЯрд╛рдЗрдкреЛ рдмрдирд╛рдпрд╛ред рдпрд╣ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╡рд┐рдирд╛рд╢ рдирд╣реАрдВ рд╣реИ ред

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЗрд╕ рд╕реВрддреНрд░ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рд╡рд░реНрддрдорд╛рди рд╕рд╣рдорддрд┐ рдХреНрдпрд╛ рд╣реИ: рдХреНрдпрд╛ рд╣рдо stdlib рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ?

@alexreg рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдВрддрд┐рдо рдпреЛрдЬрдирд╛ рдХреНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ 0 рддрдХрдиреАрдХреА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреА рдкреБрд╖реНрдЯрд┐ рдХреА рдЧрдИ рд╣реИред OTOH рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддрдм рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ std рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛ рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рд╕рдВрджрд┐рдЧреНрдз рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рдЗрд╕реЗ alloc рдмрдирд╛рдиреЗ рдХреА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдм рд╣рдо рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдкреНрд░рдЧрддрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@Emon2314 рдареАрдХ рд╣реИ, рд╕реБрдирдХрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ред рдХреНрдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рд╣реИрдВ? рдпрд╛ RFC рд╕реНрдЯреЗрдЬ рдкрд░ рд╢рд╛рдпрдж? рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, рдпрджрд┐ рд╡реЗ рдХреЗрд╡рд▓ рдЖрд╡рдВрдЯрд┐рдд / std::heap рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЪреАрдЬреЛрдВ рддрдХ рд╣реА рд╕реАрдорд┐рдд рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рдм рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@alexreg рджреЗрдЦреЗрдВ https://github.com/rust-lang/rfcs/pull/2321

рдореБрдЭреЗ рд╕рдЪ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ AllocErr рдПрд░рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдПрдХ рдФрд░ рдореЙрдбреНрдпреВрд▓ (рдЬреИрд╕реЗ io) рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ред

impl Error for AllocError рд╢рд╛рдпрдж рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдФрд░ рдЪреЛрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ Error рдЧреБрдг рдмреЗрдХрд╛рд░ рдкрд╛рдпрд╛ рд╣реИред

рдореИрдВ рдЖрдЬ рд▓реЗрдЖрдЙрдЯ :: From_size_align рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЗрдЦ рд░рд╣рд╛ рдерд╛, рдФрд░ " align 2 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП 31 (рдпрд╛рдиреА 1 << 31 )," рд╕реАрдорд╛ рдХрд╛ рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рдерд╛ред рдФрд░ рдЧрд┐рдЯ рджреЛрд╖ # 30170 рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ред

рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рднреНрд░рд╛рдордХ рдкреНрд░рддрд┐рдмрджреНрдз рд╕рдВрджреЗрд╢ рдерд╛, рдЬреЛ рдХрд┐ рдПрдХ u32 рдореЗрдВ align рдлрд┐рдЯрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛, рдЬреЛ рдХреЗрд╡рд▓ рдЖрдХрд╕реНрдорд┐рдХ рд╣реИ, рдЬрдм рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЪреАрдЬрд╝ "рдирд┐рд╢реНрдЪрд┐рдд" (рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рджреБрд░реНрд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред

рдЬреЛ рдореБрдЭреЗ рдЗрд╕ рдиреЛрдЯ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ: "OSX / рдЖрд╡рдВрдЯрди_ рд╕рд┐рд╕реНрдЯрдо рднрд╛рд░реА рд╕рдВрд░реЗрдЦрдг рдкрд░ рдЫреЛрдЯреА рдЧрд╛рдбрд╝реА рд╣реИ" рдпрд╣рд╛рдВ рдЖрдЗрдЯрдо рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реАрдзреЗ рдореБрджреНрджреЗ рд╕реЗ рдирд┐рдкрдЯрд╛ рдЧрдпрд╛ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рдХреЗ рд▓рд┐рдП рдареАрдХ рд╣реИ: рдХреНрдпреЛрдВрдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рджреБрд░реНрд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЖрд╡рдВрдЯрди рдХреЛ

@ рдЧреНрд▓реИрдВрдбрд┐рдпрдо рдХреНрдпрд╛ 4 рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рдпрд╛ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рдХрдИ рд╕реЗ рд╕рдВрд░реЗрдЦрдг рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ?

рдореИрдВ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬрд╣рд╛рдВ рдХреЛрдИ 4GiB рдореЗрдВ 4 рдЬреА рдПрд▓рдмреАрдмреА рдХреЗ рдЖрд╡рдВрдЯрди рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рд╣реА рдЕрдзрд┐рдХ рд╣реЛред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдордирдорд╛рдиреА рд╕реАрдорд╛рдПрдВ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдЬреЛрдбрд╝ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрдм рдРрд╕реЗ рдХрд╛рд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВред

рдореИрдВ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬрд╣рд╛рдВ рдХреЛрдИ 4GIB рдореЗрдВ рдЧрдардмрдВрдзрди рдХрд┐рдП рдЧрдП 4GiB рдХрд╛ рдЖрд╡рдВрдЯрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рд╡реЗ рдорд╛рдорд▓реЗ рдХреНрдпрд╛ рд╣реИрдВ?

рдореИрдВ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬрд╣рд╛рдВ рдХреЛрдИ 4GIB рдореЗрдВ рдЧрдардмрдВрдзрди рдХрд┐рдП рдЧрдП 4GiB рдХрд╛ рдЖрд╡рдВрдЯрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рд╡реЗ рдорд╛рдорд▓реЗ рдХреНрдпрд╛ рд╣реИрдВ?

рд╡рд╕реНрддреБрддрдГ, рдореИрдВ рд╕рд┐рд░реНрдл рд╕рдорд░реНрдерди рдореЗрдВ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдмрдбрд╝реЗ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ mmap-alloc рдХреНрд░рдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрдореГрддрд┐ рдХреА рдмрдбрд╝реА, рдЧрдардмрдВрдзрди рд╕реНрд▓реИрдм рдЖрд╡рдВрдЯрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ elfmalloc ред рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рд╕реНрдореГрддрд┐ рдХреЗ рд╕реНрд▓реИрдм рдХреЛ рдЙрд╕рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐, рдЙрд╕ рд╕реНрд▓реИрдм рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рджрд┐рдпрд╛ рдЬрд╛рдП, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╕реНрд▓реИрдм рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдмрд┐рдЯреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдо рд╕реНрд▓реИрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдХрд╛рд░ рдореЗрдВ 4GB рд╣реИрдВ (рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдмрдбрд╝реЗ рд╣реИрдВ, рд╣рдо рд╕реАрдзреЗ mmap рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ), рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдФрд░ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрдбрд╝реА рд░реИрдо рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрд╡реЗрджрди рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рдерд╛ рдЬреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ рд╡рд╣ (рдпрджрд┐ рдпрд╣ рдмрд╣реБ-GB рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдЕрдХреНрд╕рд░ рдкрд░реНрдпрд╛рдкреНрдд рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдпрд╣ mmap рдХреЗ рдУрд╡рд░рд╣реЗрдб рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛)ред

рдпрд╣рд╛рдВ> 4GiB рд╕рдВрд░реЗрдЦрдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИ: рдПрдХ рдмрдбрд╝реЗ рдкреГрд╖реНрда рдХреА рд╕реАрдорд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрд░реЗрдЦрдгред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕реЗ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╣реИрдВ рдЬреЛ> 4 GiB рдкреГрд╖реНрдареЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ IBM рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╣рддрд╛ рд╣реИ "POWER5 + рдкреНрд░реЛрд╕реЗрд╕рд░ рдЪрд╛рд░ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдкреЗрдЬ рд╕рд╛рдЗрдЬрд╝ рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ: 4 KB, 64 KB, 16 MB рдФрд░ 16 GBред" рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ x86-64 рднреА рджреВрд░ рдирд╣реАрдВ рд╣реИ: "рд╡рд┐рд╢рд╛рд▓ рдкреГрд╖реНрда" рдЖрдорддреМрд░ рдкрд░ 2 MiB рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ 1 GiB рдХрд╛ рднреА

Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд╕рднреА рдЧреИрд░-рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп *mut u8 рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡реЗ рдЕрд╢рдХреНрдд рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд▓реЗ рдпрд╛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рднреА рдирд░рдХ рдвреАрд▓реЗ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп NonNull рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдХрдИ рд╕рдВрдХреЗрдд рд╣реИрдВ рдХрд┐ рд╡реЗ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╕реЗ рд╕рднреА рдирд░рдХ рд╣реЛрдВрдЧреЗ
рдвреАрд▓рд╛ рдмреНрд░реЗрдХред
рд╕реВрд░реНрдп рдкрд░, рдорд╛рд░реНрдЪ 4, 2018 рдХреЛ 3:56 рдкреВрд░реНрд╡рд╛рд╣реНрди рдорд╛рдЗрдХ рд╣реЙрдореЗрдп рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ:

Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд╕рднреА рдЧреИрд░-рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп * mut u8 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡реЗ рдЕрд╢рдХреНрдд рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд▓реЗ рдпрд╛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рднреА рдирд░рдХ рд╣реЛрдВрдЧреЗ
рдвреАрд▓рд╛ рдмреНрд░реЗрдХред рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдиреЙрдирдмреБрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/32838#issuecomment-370223269 ,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABY2UR2dRxDtdACeRUh_djM-DExRuLxiks5ta9aFgaJpZM4IDYUN
ред

NonNull рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рд╕рдореНрдореЛрд╣рдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ Result s рдХреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ Alloc рд╡рд┐рдзрд┐рдпреЛрдВ (рдпрд╛ Options рд╕реЗ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛ рджреЗрдЧрд╛, рдпрджрд┐ рд╣рдо рдЗрд╕рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВ рднрд╡рд┐рд╖реНрдп) рдЫреЛрдЯреЗ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдПред

NonNull рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕рдореНрдореЛрд╣рдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ Alloc рд╡рд┐рдзрд┐рдпреЛрдВ (рдпрд╛ рд╡рд┐рдХрд▓реНрдк, рдпрджрд┐ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрд╕ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВ) рд╕реЗ рдЫреЛрдЯреЗ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ AllocErr рдХреЗ рджреЛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВред

рдРрд╕реЗ рдХрдИ рд╕рдВрдХреЗрдд рд╣реИрдВ рдХрд┐ рд╡реЗ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддреЗ рдереЗ рдЬрд┐рд╕рд╕реЗ рд╕рднреА рдирд░рдХ рдвреАрд▓реЗ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред

рд▓реЗрдХрд┐рди рдПрдХ рдЕрд╢рдХреНрдд рд╕реВрдЪрдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд╕реВрдЪрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЧрд▓рдд рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдВрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА footguns рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХреЛ рд╕рд╛рдВрдХреЗрддрд┐рдХ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдмрджрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред alloc рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рддрд╛ рд╣реИ "рдпрджрд┐ рдпрд╣ рд╡рд┐рдзрд┐ Ok(addr) рд▓реМрдЯрд╛рддреА рд╣реИ, рддреЛ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдЧреИрд░-рд╢реВрдиреНрдп рдкрддрд╛ рд╣реЛрдЧрд╛", рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЪреАрдЬреЗрдВ рд╣реИрдВ, Ok(malloc(layout.size())) рдПрдХ рд╡реИрдз рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрдЧрд╛, рдЬрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╣реИред

рдиреЛрдЯ, рдЧреИрд░-рд╢реВрдиреНрдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП Layout рдЖрдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдиреЛрдЯ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣ рднреА рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдиреЙрдирдЬреЗрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рднреА рдХрд╛рд░реНрдп рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдХреБрдЫ рдлреБрдЯрдЧрди рдХреА рд░реЛрдХрдерд╛рдо рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ (рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ: рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ) рдореЗрдВ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ, рдПрдХ рд╢реВрдиреНрдп рд╕реВрдЪрдХ рдХреЛ рдиреАрдЪреЗ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИ (рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рд╕рд╛рдл-рд╕реБрдерд░реЗрдкрди рдкрд░ рдЫреВрдЯ рдорд┐рд▓рддреА рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдордПрдордпреВ рд╣реИ рдФрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рддреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╣реА рдЕрдЬреАрдм рдмрд╛рддреЗрдВ), рдФрд░ рдЖрдорддреМрд░ рдкрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рддреБрдЪреНрдЫ рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдлреБрдЯрдЧрдВрдЬ рдХреЛ рд░реЛрдХрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдлреБрдЯрдЧрди рдЕрд╕рдВрдЧрдд рд░реВрдк рд╕реЗ рдЫреЛрдЯреА рд▓рдЧрддреА рд╣реИ (рдЕрдиреНрдп рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЗрд╕ рдЕрдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреА рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП)ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрд╡рдВрдЯрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗрд╡рд▓ NonNull "рдХреЗ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ" рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП "рдХрд░реЗрдВрдЧреЗ: рдЪреВрдВрдХрд┐ рдПрдХ рд╕рд╣реА рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрднреА рднреА рд╢реВрдиреНрдп рдирд╣реАрдВ рд▓реМрдЯреЗрдЧрд╛, рдпрд╣ NonNell::new(...).unwrap() рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛ред рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рднреА рдареЛрд╕ рдлреБрдЯрдЧрди рдХреА рд░реЛрдХрдерд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдмрд╕ рдЕрдзрд┐рдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯред ( Result рдЖрдХрд╛рд░ рдХрд╛ рд▓рд╛рдн, рдпрджрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИ, рддрдм рднреА рдЗрд╕рдХрд╛ рдПрдХ рдЖрдХрд░реНрд╖рдХ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред)

рдПрд▓реЛрдХреЗрд╢рди рдЗрдВрдкреНрд▓реЙрдЗрдЬ рд╕рд┐рд░реНрдл рдиреЙрдирдиреБрд▓ рдХреЗ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ

рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рдВрджреБ рдХрдо рд╣реИред рдпрджрд┐ MyVec рдореЗрдВ NonNull<T> рдФрд░ Heap.alloc() рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ NonNull , рддреЛ рдПрдХ рдХрдо рдЪреЗрдХ рдпрд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд-рдЕрдирдЪреЗрдХ рдХреЙрд▓ рдЬрд┐рд╕реЗ рдореБрдЭреЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рдВрдХреЗрдд рди рдХреЗрд╡рд▓ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рд╡реЗ рднреА dealloc рдФрд░ realloc рдЬреИрд╕реЗ рдЗрдирдкреБрдЯ рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рдХреНрдпрд╛ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЙрдирдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рдЦрд┐рд▓рд╛рдл рдХрдареЛрд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рдВрднрд╡рддрдГ рдЕрд╢рдХреНрдд рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ? рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рд╣рд╛рдБ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ред

рдЗрд╕реА рддрд░рд╣ рд╕реЗ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдлреАред рдЖрдХрд╛рд░ ()ред рдХреНрдпрд╛ рдЖрд╡рдВрдЯрди рдХрд╛рд░реНрдп рдЕрдиреБрд░реЛрдзрд┐рдд рдЖрдХрд╛рд░ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ 0 рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдирд╣реАрдВ?

(рдкрд░рд┐рдгрд╛рдо рдЖрдХрд╛рд░ рд▓рд╛рдн, рдпрджрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИ, рддреЛ рдЕрднреА рднреА рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдореНрдореЛрд╣рдХ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред)

рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЖрдХрд╛рд░ рдХреЗ рд▓рд╛рдн рд╣реИрдВ, рд▓реЗрдХрд┐рди # 48741 рдЬреИрд╕реЗ рдХреБрдЫ рдХреЗ рд╕рд╛рде, рдХреЛрдбрдЬреЗрди рд▓рд╛рдн рд╣реЛрдВрдЧреЗред

рдпрджрд┐ рд╣рдо API рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗ рд╣реЛрдиреЗ рдХреЗ рдЙрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд░рд┐рдЯрд░реНрди рдореЗрдВ NonNull рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рддрд░реНрдХреЛрдВ рдореЗрдВ рдирд╣реАрдВред (рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрди рддрд░реНрдХреЛрдВ рдХреЛ рд░рди-рдЯрд╛рдЗрдо рдкрд░ рд╢реВрдиреНрдп-рдЬрд╛рдБрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдкреЛрд╕реНрдЯреЗрд▓ рдХреЗ рдХрд╛рдиреВрди рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЧрд▓рдд рд╣реИред рдХреНрдпрд╛ рд╡рд╣рд╛рдБ рдХреЛрдИ
рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рдЕрд╢рдХреНрдд рд╕реВрдЪрдХ рдХреЛ рдПрдХ рдЕрд▓реЛрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рдорд╛рдиреНрдп рд╣реИ? рдЕрдЧрд░ рдирд╣реАрдВ,
рдлрд┐рд░ рд╡рд╣ рд▓рдЪреАрд▓рд╛рдкрди рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рд┐рд░реНрдл рдлреБрдЯрдЧрди рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рджреЗ рд░рд╣рд╛ рд╣реИ
рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЯреНрд░рд┐рдЧрд░ред

5 рдорд╛рд░реНрдЪ, 2018 8:00 рдкреВрд░реНрд╡рд╛рд╣реНрди рдкрд░, "рд╕рд╛рдЗрдорди рд╕реИрдкрд┐рди" рд╕реВрдЪрдирд╛рдПрдВ @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдпрджрд┐ рд╣рдо API рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рд╣реЛрдиреЗ рдХреЗ рдЙрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ,
рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд░рд┐рдЯрд░реНрди рдЯрд╛рдЗрдкреНрд╕ рдореЗрдВ рдиреЙрди-рдиреЙрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рд▓реЗрдХрд┐рди рддрд░реНрдХреЛрдВ рдореЗрдВ рдирд╣реАрдВред (рдпрд╣
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрди рддрд░реНрдХреЛрдВ рдХреЛ рд░рди-рдЯрд╛рдЗрдо рдкрд░ рд╢реВрдиреНрдп-рдЬрд╛рдБрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред]

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЗрд╕ рдзрд╛рдЧреЗ рдХреА рд╕рджрд╕реНрдпрддрд╛ рджреА рдЧрдИ рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/32838#issuecomment-370327018 ,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AA_2L8zrOLyUv5mUc_kiiXOAn1f60k9Uks5tbOJ0gaJpZM4IDYUN
ред

рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рдВрджреБ рдХрдо рд╣реИред рдпрджрд┐ MyVec рдореЗрдВ рдПрдХ NonNull рд╣реИрдФрд░ Heap.alloc () рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЧреИрд░-рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдПрдХ рдХрдо рдЬрд╛рдБрдЪ рдпрд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд-рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдХреЙрд▓ рд╣реИ рдЬрд┐рд╕реЗ рдореБрдЭреЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЖрд╣ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдлрд╝реБрдЯрдЧреБрди рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЛ рдХреЗрдВрджреНрд░реАрдХреГрдд рдХрд░рддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреЙрдЗрдВрдЯрд░реНрд╕ рди рдХреЗрд╡рд▓ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рд╡реЗ рднреА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬреИрд╕реЗ рдбреАрд▓реЙрдХ рдФрд░ рд░рд┐рдпрд▓рд▓реЛрдХред рдХреНрдпрд╛ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЙрдирдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рдЦрд┐рд▓рд╛рдл рдХрдареЛрд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рдВрднрд╡рддрдГ рдЕрд╢рдХреНрдд рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ? рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рд╣рд╛рдБ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ред

рдХреНрдпрд╛ рдХреЛрдИ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрд╢рдХреНрдд рд╕реВрдЪрдХ рдХреЛ рдПрдХ рдПрд▓реЛ рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдорд╛рдиреНрдп рд╣реИ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╡рд╣ рд▓рдЪреАрд▓рд╛рдкрди рдореВрд▓ рд░реВрдк рд╕реЗ рдмрд╕ рдлреБрдЯрдЧреБрди рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЯреНрд░рд┐рдЧрд░ рджреЗ рд░рд╣рд╛ рд╣реИред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрди рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдорди рдореЗрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛рдУрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдХрдИ рд╣рдорд▓рд╛рд╡рд░реЛрдВ рдХреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдпрджрд┐ рд╡реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рддреЛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рд╕рд╡рд╛рд▓ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдиреЙрдирдиреЙрд▓ рдбрд╛рд▓рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдорджрдж рдХрд░реЗрдЧрд╛

  • рдЙрдиреНрд╣реЗрдВ рдбреЙрдХреНрд╕ рдкрдврд╝рдиреЗ рдФрд░ рд╣рдорд▓рд╛рд╡рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛
  • рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ ( @SimonSapin рдХрд╛ рдмрд┐рдВрджреБ wrt рдЖрдмрдВрдЯрди рдХрд╛ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп)
  • рдХреБрдЫ рднреМрддрд┐рдХ рд▓рд╛рдн (рдЬреИрд╕реЗ, рд▓реЗрдЖрдЙрдЯ рдЕрдиреБрдХреВрд▓рди)

рдореБрдЭреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП dealloc NonNull рдХрд╛ рддрд░реНрдХ рджреЗрдиреЗ рдореЗрдВ рдХреЛрдИ рдордЬрд╝рдмреВрдд рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ред рдореИрдВ рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рдЧрднрдЧ рджреЛ рд╡рд░реНрдЧ рджреЗрдЦрддрд╛ рд╣реВрдВ:

  1. рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рддреБрдЪреНрдЫ рдЙрдкрдпреЛрдЧ, рдЬрд╣рд╛рдВ рдЖрдк alloc , рд▓реМрдЯреЗ рд╣реБрдП рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдХрд╣реАрдВ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рд╕рдВрдЧреНрд░рд╣реАрдд рдкреЙрдЗрдВрдЯрд░ рдХреЛ dealloc ред
  2. рдПрдлрдПрдлрдЖрдИ, рдкреЙрдЗрдВрдЯрд░ рдЕрдВрдХрдЧрдгрд┐рдд рдЖрджрд┐ рд╕реЗ рдЬреБрдбрд╝реЗ рдЬрдЯрд┐рд▓ рдкрд░рд┐рджреГрд╢реНрдп рдЬрд╣рд╛рдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрд░реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдк рдЕрдВрдд рдореЗрдВ dealloc рд╕рд╣реА рдЪреАрдЬ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

рдореВрд▓ рд░реВрдк рд╕реЗ NonNull рд╕реЗ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ NonNull рдХреЛ рдХрд┐рд╕реА рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ NonNull рдЕрдирд╡рд╛рд▓реНрдб рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдпрд╣ рдХреБрдЫ рд▓реЗрдЦрди-рддреНрд░реБрдЯрд┐рдпреЛрдВ (рдЧреБрдЬрд░ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ foo рдЬрдм рдЖрдк рдорддрд▓рдм bar ) рдЕрдЧрд░ рдЖрдкрдХрд╛ рдХрд░рддрдм рджрд┐рдЦрд╛рдиреЗ рдХрдИ рд╕рдВрдХреЗрдд рджрд┐рдП рдЧрдП рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реИ NonNull , рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рдмрд╣реБрдд рдЖрдо рдпрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдгред dealloc рдХрд╛ рдиреБрдХрд╕рд╛рди рдПрдХ рдХрдЪреНрдЪреЗ рд╕реВрдЪрдХ рдХреЛ рд▓реЗрдиреЗ ( alloc NonNull рдЬреЛ @SimonSapin рдиреЗ рдореБрдЭреЗ рдЖрд╢реНрд╡рд╕реНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛) рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕реЗ as_ptr рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдбреАрд▓рд▓реЙрдХ рдХреЙрд▓, рдЬреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ, рд▓реЗрдХрд┐рди рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рджреВрд╕рд░реА рддрд░рд╣ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди NonNull рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд░рдЦ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрдЪреНрдЪреЗ рд╕реВрдЪрдХ рд╕реЗ NonNull рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЬреЛ рднреА рдорддрд▓рдм рд╣реЛред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рддрд░реНрдХ рджрд┐рдпрд╛ рдерд╛, рдпрд╣ рд╕рдВрднрд╡рдд: рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░рди рдЯрд╛рдЗрдо рдЪреЗрдХ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд / unsafe рдЬреЛрд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рдлреБрдЯрдЧрди рдХреЛ рд░реЛрдХрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рдХрд╣рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ dealloc рдХрдЪреНрдЪреЗ рд╕реВрдЪрдХ рд▓реЗрдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВред рдореИрдВ рдмрд╕ рдХрд┐рд╕реА рднреА рд▓рд╛рдн рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдлреБрдЯ рдлреБрдЯред рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдЧрддрд┐ рд╢рд╛рдпрдж рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЬреАрддрддреА рд╣реИред

рдореБрдЭреЗ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ "рдХрдИ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ... рдЗрд╕рд▓рд┐рдП рдЪрд▓реЛ рдХреЛрд╢рд┐рд╢ рднреА рдирд╣реАрдВ рдХреА"ред рдЪрд▓реЛ рдЕрдЪреНрдЫрд╛рдИ рдХрд╛ рджреБрд╢реНрдорди рдордд рдмрдиреЛ!

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ NonNull рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдЧрд╛рд░рдВрдЯрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдЯреНрд░реЗрдбрдСрдлрд╝реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИ рдФрд░ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ NonNull рдФрд░ рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рдмреАрдЪ рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рд╕рдВрдХреНрд░рдордг рд╕реЗ рд╣рд╛рд░ рдЧрдПред рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╛ рддреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдордЬрдмреВрдд рд░рд╛рдп рдирд╣реАрдВ рд╣реИ - рди рддреЛ рдХреЛрдИ рдкрдХреНрд╖ рдЕрдиреБрдЪрд┐рдд рд╣реИред

@cramertj рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рддрд░реНрдХ рдХрд╛ рдЖрдзрд╛рд░ рдирд╣реАрдВ рдЦрд░реАрджрддрд╛ред рд▓реЛрдЧ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ Alloc рдЕрд╕реНрдкрд╖реНрдЯ, рдЫрд┐рдкреЗ рд╣реБрдП рдФрд░ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИред рдареАрдХ рд╣реИ, рдЕрд╕реНрдкрд╖реНрдЯ, рд╣рд╛рд░реНрдб-рдЯреВ-рд░реАрдб рдХреЛрдб рдореЗрдВ, рдореИрдВ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕реБрд░рдХреНрд╖рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ --- рдареАрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЫреБрдЖ рд╣реЛ рдЗрд╕рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдореВрд▓ рд▓реЗрдЦрдХ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдирд╣реАрдВ рд╣реЛрдЧреАред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрджрд┐ рдХреЛрдб рдХреЛ рд╡рд░реНрд╖реЛрдВ рдмрд╛рдж рдкрдврд╝рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ egonomics рдкреЗрдВрдЪред рдХреБрдЫ рднреА рд╣реЛ, рдпрд╣ рдкреНрд░рддрд┐-рдЙрддреНрдкрд╛рджрдХ рд╣реИред рдХреЛрдб рдХреЛ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдПрдХ рдЕрдкрд░рд┐рдЪрд┐рдд рдкрд╛рдардХ рдмреЗрд╣рддрд░ рд╕рдордЭ рд╕рдХреЗ рдХрд┐ рдкреГрдереНрд╡реА рдХреНрдпрд╛ рдЪрд▓ рд░рд╣реА рд╣реИред рдХрдо рд╢реЛрд░ <рд╕реНрдкрд╖реНрдЯ рд╣рдорд▓рд╛рд╡рд░ред

рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди NonNull рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд░рдЦ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрдЪреНрдЪреЗ рд╕реВрдЪрдХ рд╕реЗ NonNull рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЬреЛ рднреА рд╕рд╛рдзрди рд╣реЛред

рдпрд╣ рдмрд╕ рдПрдХ рд╕рдордиреНрд╡рдп рд╡рд┐рдлрд▓рддрд╛ рд╣реИ, рди рдХрд┐ рддрдХрдиреАрдХреА рдЕрдирд┐рд╡рд╛рд░реНрдпрддрд╛ред рдпрдХреАрди рд╣реИ, рдЕрднреА рдХрдИ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдПрдкреАрдЖрдИ рдХрдЪреНрдЪреЗ рд╕рдВрдХреЗрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ рдХреБрдЫ рдХреЛ NonNull рдпрд╛ рдЕрдиреНрдп рд░реИрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдмреЗрд╣рддрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░рдирд╛ рд╣реИред рдлрд┐рд░ рдЕрдиреНрдп рдХреЛрдб рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реВрдЯ рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЧреНрд░реАрдирдлреАрд▓реНрдб рдореЗрдВ рд╣рд╛рд░реНрдб-рдЯреВ-рд░реАрдб, рдЕрдирдЗрдирдлреЙрд░реНрдореЗрдЯрд┐рд╡ рд░реЙ-рдкреЙрдЗрдВрдЯрд░реНрд╕, рдСрд▓-рд░рд╕реНрдЯ, рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдкрд░ рд▓рдЧрд╛рддрд╛рд░ рдЧрд┐рд░рд╛рд╡рдЯ рдХрд╛ рдореБрдЭреЗ 0 рдХрд╛рд░рдг рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред

рдирдорд╕реНрддреЗ!

рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐, рдПрдХ рд░рд╕реНрдЯ рдХрд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рдХреЗ рд▓реЗрдЦрдХ / рдЕрдиреБрд░рдХреНрд╖рдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ NonNull рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВред рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░рдЦреА рдЧрдИ рд╕рднреА рд╡рдЬрд╣реЛрдВ рд╕реЗ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐

рдореИрдВ @232314 рдФрд░ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд▓реНрджреА рд╕реЗ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрд▓рдЧ рдФрд░ рджрд╛рд░реНрд╢рдирд┐рдХ рдмрд╣рд╕ рдмрди рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдЫреЛрдЯрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдЗрд╕ рдмрд╛рдд рдХреЗ рдЦрд┐рд▓рд╛рдл рдмрд╣рд╕ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдкреАрдЖрдИ рдореЗрдВ NonNull рдХреЗ рд╕реБрд░рдХреНрд╖рд╛ рд▓рд╛рднреЛрдВ рдХрд╛ рдУрд╡рд░-рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реИ (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреНрдп рд▓рд╛рдн рд╣реИрдВ)ред рдпрд╣ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╕реБрд░рдХреНрд╖рд╛ рд▓рд╛рдн рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди @cramertj рдиреЗ рдХрд╣рд╛, рд╡реНрдпрд╛рдкрд╛рд░ рдореЗрдВ NonNull рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдУрд░ рдЭреБрдХрддрд╛ рд╣реВрдВ - рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ @SimonSapin рдиреЗ alloc , dealloc рдореЗрдВ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП рджрд┐рдпрд╛ред рддреЛ рдЪрд▓реЛ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рднреА рдЕрдзрд┐рдХ рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рдкрд░ рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВред

рдпрджрд┐ рдХреБрдЫ NonNull рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬреЛ рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд╕рд╛рде рдмреЛрд░реНрдб рдкрд░ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╢реБрд░реБрдЖрдд рд╣реИред

рд╣рдо рд╢рд╛рдпрдж Unique рдФрд░ рджреЛрд╕реНрддреЛрдВ рдХреЛ NonNull рдмрдЬрд╛рдп NonZero рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо liballoc рдХрдо рдХреЗ рднреАрддрд░ рдШрд░реНрд╖рдг рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд╕реНрддрд░ рдкрд░ рдПрдХ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рд╕реНрддрд░ рдкрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдореИрдВ рдПрд▓реЛрдХреЗрдЯрд░ рд╕реНрддрд░ рдкрд░ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ред рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЙрдЪрд┐рдд рдмрджрд▓рд╛рд╡ рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣рд╛ рд╣реИред

( From рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ рдЬреЛ Unique<T> рдФрд░ NonNull<T> рдмреАрдЪ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред)

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдореБрдЭреЗ рд╕реНрдерд┐рд░ рдЬрдВрдЧ рдореЗрдВ рдЖрд╡рдВрдЯрди рдПрдкреАрдЖрдИ рдХреА рддрд░рд╣ рдмрд╣реБрдд рдХреБрдЫ рдЪрд╛рд╣рд┐рдП, рдореИрдВрдиреЗ рдЬрдВрдЧ рд░реЗрдкреЛ рд╕реЗ рдХреЛрдб рдирд┐рдХрд╛рд▓рд╛ рдФрд░ рдПрдХ рдЕрд▓рдЧ рдЯреЛрдХрд░рд╛ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛:

рдпрд╣ / рдПрдкреАрдЖрдИ рдХреЗ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рддрдХ, рдпрд╣ рдЬрдВрдЧ рдореИрджрд╛рди рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдХреА рдПрдХ рд╕рд╛рджрд╛ рдкреНрд░рддрд┐ рд╣реИред

[рдмрдВрдж рд╡рд┐рд╖рдп] рд╣рд╛рдБ, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ std рдЙрд╕ рддрд░рд╣ рд╕реЗ рдкреЗрдбрд╝ рдХреЗ рд╕реНрдерд┐рд░ рдХреЛрдб рдмрдХреНрд╕реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗ, рддрд╛рдХрд┐ рд╣рдо рд╕реНрдерд┐рд░ рдХреЛрдб рдореЗрдВ рдЕрд╕реНрдерд┐рд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред рдпрд╣ рдПрдХ рдХрд╛рд░рдг рд╣реИ рдЬреЛ рдореБрдЭреЗ std рдПрдХ рдореБрдЦреМрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╕рдВрдж рд╣реИред

std crates.io рд╕реЗ рдПрдХ рдЯреЛрдХрд░рд╛ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рднреА рдЙрд╕реА рдЯреЛрдХрд░реЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рд╡реИрд╕реЗ рд╣реА "crate / type / traits" рдХреА рддрд░рд╣ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдбреЙрди рдпрд╣ рдХреИрд╕реЗ рдорджрдж рдХрд░реЗрдЧрд╛ рджреЗрдЦреЗрдВред рд╡реИрд╕реЗ рднреА, рдЪрд╛рд╣реЗ рдХреЛрдИ рднреА рдкрд╣рд▓реВ рд╣реЛ, рд╕реНрдерд┐рд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕реНрдерд┐рд░ рдЪреИрдирд▓ рдкрд░ рдЕрдиреБрдкрд▓рдмреНрдз рдмрдирд╛рдирд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЬрд╛рдирдмреВрдЭрдХрд░ рдкрд╕рдВрдж рд╣реИ, рджреБрд░реНрдШрдЯрдирд╛ рдирд╣реАрдВред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдиреЙрдирдиреНрдпреВрдЕрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдЫ рд╕рдордЭреМрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдХреНрдпрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИ? рдмрд╕ рдПрдХ рдкреАрдЖрд░ рдпрд╣ рдХрд░ рд░рд╣рд╛ рд╣реИ? рдПрдХ рдЖрд░рдПрдлрд╕реА

рдЕрд╕рдВрдмрдВрдзрд┐рдд рд░реВрдк рд╕реЗ, рдореИрдВ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдЪреАрдЬреЛрдВ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХреБрдЫ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рддреНрд░реБрдЯрд┐ рдкрде рдмрдбрд╝реЗ рд╣реИрдВред рдХреНрдпрд╛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдЙрджрд╛рд╣рд░рдг:

pub fn bar() -> Box<[u8]> {
    vec![0; 42].into_boxed_slice()
}

pub fn qux() -> Box<[u8]> {
    Box::new([0; 42])
}

рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди:

example::bar:
  sub rsp, 56
  lea rdx, [rsp + 8]
  mov edi, 42
  mov esi, 1
  call __rust_alloc_zeroed<strong i="11">@PLT</strong>
  test rax, rax
  je .LBB1_1
  mov edx, 42
  add rsp, 56
  ret
.LBB1_1:
  mov rax, qword ptr [rsp + 8]
  movups xmm0, xmmword ptr [rsp + 16]
  movaps xmmword ptr [rsp + 32], xmm0
  mov qword ptr [rsp + 8], rax
  movaps xmm0, xmmword ptr [rsp + 32]
  movups xmmword ptr [rsp + 16], xmm0
  lea rdi, [rsp + 8]
  call __rust_oom<strong i="12">@PLT</strong>
  ud2

example::qux:
  sub rsp, 104
  xorps xmm0, xmm0
  movups xmmword ptr [rsp + 58], xmm0
  movaps xmmword ptr [rsp + 48], xmm0
  movaps xmmword ptr [rsp + 32], xmm0
  lea rdx, [rsp + 8]
  mov edi, 42
  mov esi, 1
  call __rust_alloc<strong i="13">@PLT</strong>
  test rax, rax
  je .LBB2_1
  movups xmm0, xmmword ptr [rsp + 58]
  movups xmmword ptr [rax + 26], xmm0
  movaps xmm0, xmmword ptr [rsp + 32]
  movaps xmm1, xmmword ptr [rsp + 48]
  movups xmmword ptr [rax + 16], xmm1
  movups xmmword ptr [rax], xmm0
  mov edx, 42
  add rsp, 104
  ret
.LBB2_1:
  movups xmm0, xmmword ptr [rsp + 16]
  movaps xmmword ptr [rsp + 80], xmm0
  movaps xmm0, xmmword ptr [rsp + 80]
  movups xmmword ptr [rsp + 16], xmm0
  lea rdi, [rsp + 8]
  call __rust_oom<strong i="14">@PLT</strong>
  ud2

рдмрдХреНрд╕реЗ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рднреА рдЬрдЧрд╣ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЛрдб рд╣реИред 1.19 рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВ, рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реИ:

example::bar:
  push rax
  mov edi, 42
  mov esi, 1
  call __rust_allocate_zeroed<strong i="18">@PLT</strong>
  test rax, rax
  je .LBB1_2
  mov edx, 42
  pop rcx
  ret
.LBB1_2:
  call alloc::oom::oom<strong i="19">@PLT</strong>

example::qux:
  sub rsp, 56
  xorps xmm0, xmm0
  movups xmmword ptr [rsp + 26], xmm0
  movaps xmmword ptr [rsp + 16], xmm0
  movaps xmmword ptr [rsp], xmm0
  mov edi, 42
  mov esi, 1
  call __rust_allocate<strong i="20">@PLT</strong>
  test rax, rax
  je .LBB2_2
  movups xmm0, xmmword ptr [rsp + 26]
  movups xmmword ptr [rax + 26], xmm0
  movaps xmm0, xmmword ptr [rsp]
  movaps xmm1, xmmword ptr [rsp + 16]
  movups xmmword ptr [rax + 16], xmm1
  movups xmmword ptr [rax], xmm0
  mov edx, 42
  add rsp, 56
  ret
.LBB2_2:
  call alloc::oom::oom<strong i="21">@PLT</strong>

рдпрджрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╢рд╛рдпрдж рдПрд▓рдПрд▓рд╡реАрдПрдо рдмрдбрд╝реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИ?

рдирд╡реАрдирддрдо рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдореЗрдВ 1439 __rust_oom рдХреЙрд▓ рд╣реИрдВред рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдЬрдВрдЧ рдХреЗ рдЖрд╡рдВрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдореЙрд▓реЙрдХ / рдХреЙрд▓реЛрдХ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рдХреЙрд▓ рдорд┐рд▓рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдмрд╛рдж рдПрдХ рд╢реВрдиреНрдп рдЬрд╛рдВрдЪ рд╣реЛрддреА рд╣реИ рдХрд┐ рдСрдо рддреИрдпрд╛рд░реА рдХреЛрдб рдореЗрдВ рдХреВрджрддрд╛ рд╣реИ, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рджреЛ movq рдФрд░ рдПрдХ рдЕрдХреНрд╖рд░ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ AllocErr рдХреЛ рднрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдкрдирд╛ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП __rust__oom ред рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА 20 рдЪрд╛рд▓ рдХреА рдорд╢реАрди рдХреЛрдб рдХреЗ рд▓рд┐рдП рджреЛ movq рдФрд░ lea рд╣реИред

рдпрд╣ рдореИрдВ ripgrep рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВ, 85 рд╣реИрдВ, рдФрд░ рд╡реЗ рд╕рднреА рд╕рдорд╛рди _ZN61_$LT$alloc..heap..Heap$u20$as$u20$alloc..allocator..Alloc$GT$3oom17h53c76bda5 0c6b65aE.llvm.nnnnnnnnnnnnnnn рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╣реИрдВред рд╡реЗ рд╕рднреА 16 рдмрд╛рдЗрдЯреНрд╕ рд▓рдВрдмреА рд╣реИрдВред рдЙрди рдЖрд╡рд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП 685 рдХреЙрд▓ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рд╕рдорд╛рди рд╣реИрдВ рдЬреЛ рдореИрдВрдиреЗ https://github.com/rust-lang/rust/issues/32838#issuecomment -377097485 рдкрд░ рдЪрд┐рдкрдХрд╛рдП рд╣реИрдВред

@ рдиреЛрдХреНрд╕ рдЖрдЬ mergefunc llvm рдкрд╛рд╕ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдЦ рд░рд╣рд╛ рдерд╛, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣рд╛рдВ рдХреЛрдИ рдлрд░реНрдХ рдкрдбрд╝рддрд╛ рд╣реИред

mergefunc рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдХрдИ рд╕рдорд╛рди _ZN61_$LT$alloc..heap..Heap$u20$as$u20$alloc..allocator..Alloc$GT$3oom17h53c76bda5 0c6b65aE.llvm.nnnnnnnnnnnnnnn рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ ( -C passes=mergefunc RUSTFLAGS )ред

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдПрдХ рдмрдбрд╝рд╛ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ LTO рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдХреЙрд▓ malloc рд╕реАрдзреЗ рдмрдирд╛рддрд╛ рд╣реИ, рдХреЗ рдирд┐рд░реНрдорд╛рдг рдЫреЛрдбрд╝рдиреЗ рд╣реИ AllocErr рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП __rust_oom ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рднреА рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдЖрддрд╛ рд╣реИ Layout рд╕рдВрднрд╛рдЬрдХ рдмреБрд▓рд╛, рдпрд╣ рдЬрдм рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╡рд╛рдирд╛ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ AllocErr ред

рдЗрд╕рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрд╡рдВрдЯрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, __rust_oom рдХреЛ рд╕рдВрднрд╡рддрдГ рдЗрдирд▓рд╛рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

Btw, Firefox рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рджреЗрдЦрд╛ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдЖрджрд░реНрд╢ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрдиреАрдп рд╣реЛрдЧрд╛ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ moz_xmalloc рдХреЗ рдмрдЬрд╛рдп malloc ред рдпрд╣ рдПрд▓реЛрдХреЗрдЯрд░ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рдмрд┐рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рд╣реАрдк рдПрд▓реЛрдХреЗрдЯрд░ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рд▓реЗрдХрд┐рди рдПрд▓реЛрдХреЗрдЯрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд▓рд╛рддрд╛ рд╣реИ: moz_xmalloc рдЕрдЪреВрдХ рд╣реИ рдФрд░ рдХрднреА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред рд╡рд┐рдлрд▓рддрд╛ред IOW, рдпрд╣ OOM рдЦреБрдж рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рдФрд░ рдЬрдВрдЧ рдХреЛрдб рдХреЛ рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ __rust_oom рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдЬреЛ рдЗрд╕реЗ рд╕рдВрднрд╛рдЬрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрдиреАрдп рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ ! рдХреЗ рдмрдЬрд╛рдп AllocErr ред

рд╣рдордиреЗ AllocErr рдПрдХ рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдиреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ, рдЬреЛ рдпрд╣рд╛рдВ рднреА рдорджрдж рдХрд░ рд╕рдХрддреА рд╣реИред рд╕реВрдЪрдХ рдХреЗ рд╕рд╛рде NonNull , рд╕рдВрдкреВрд░реНрдг рд╡рд╛рдкрд╕реА рдорд╛рди рд╕реВрдЪрдХ-рдЖрдХрд╛рд░ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

https://github.com/rust-lang/rust/pull/49669 рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдмрд╕реЗрдЯ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рдХреНрд╖реНрдп рдХреЗ рд╕рд╛рде, рдЗрди рдПрдкреАрдЖрдИ рдореЗрдВ рдХрдИ рдмрджрд▓рд╛рд╡ рдХрд░рддрд╛ рд╣реИред рдЙрд╕ рд╕рдмрд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджрд╛: https://github.com/rust-lang/rust/issues/49668ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдПрдХ рдирдпрд╛ GlobalAlloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреЗрд╢ рдХреА рдЬрд╛рддреА рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреАрдЖрд░ рд╣рдореЗрдВ Vec::new_with_alloc(alloc) рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬрд╣рд╛рдВ alloc: Alloc рдЬрд▓реНрдж рд╣реА?

@alexreg рдирдВ

@sfackler рд╣рдореНрдо, рдХреНрдпреЛрдВ рдирд╣реАрдВ? рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП? рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкреАрдЖрд░ рдХреА рдмрд╛рдд рдирд╣реАрдВ рдЖрддреА рдЕрдиреНрдпрдерд╛, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИред

@alexreg

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкреАрдЖрд░ рдХреА рдмрд╛рдд рдирд╣реАрдВ рдЖрддреА рдЕрдиреНрдпрдерд╛, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред

@alexreg рдХрд╛ рдорддрд▓рдм рдЕрдЧрд░ рдЖрдк рд╕реНрдерд┐рд░ рд╣реИрдВ, рддреЛ рдХрдИ рддрд░рд╣ рдХреЗ рдЕрдирд╕реБрд▓рдЭреЗ рд╕рд╡рд╛рд▓ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред рд░рд╛рдд рдореЗрдВ, рдпрд╣ RawVec рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ рдФрд░ рд╢рд╛рдпрдж #[unstable] рд▓рд┐рдП Vec рдЬреЛ рдХрд┐ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдорди рдХрд░рддрд╛ рд╣реИ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдареАрдХ рд╣реИред

рдФрд░ рд╣рд╛рдБ, рдЬреИрд╕рд╛ рдХрд┐ рдкреАрдЖрд░ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рдпрд╛ Vec::with_capacity рдкрд╛рд▓рди тАЛтАЛрдХрд┐рдП рдмрд┐рдирд╛ (рдПрдХ рдХрд╕реНрдЯрдо рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд░ рдореЗрдВ) рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ред

FWIW, https://github.com/rust-lang/rust/issues/32838#issuecomment -376793369 рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд allocator_api рдЯреЛрдХрд░рд╛ RawVec<T, A> рдФрд░ Box<T, A> рд╢рд╛рдЦрд╛ (рдЕрднреА рддрдХ рдЬрд╛рд░реА рдирд╣реАрдВ)ред рдореИрдВ рдЗрд╕реЗ рдПрдХ рдЗрдирдХреНрдпреВрдмреЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЖрд╡рдВрдЯрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрдЧреНрд░рд╣ рдХреНрдпрд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ (рдкреНрд▓рд╕ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╕реНрдерд┐рд░ рд░рд╕реНрдЯ рдХреЗ рд▓рд┐рдП Box<T, A> рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред рдореИрдВрдиреЗ рдЕрднреА рддрдХ Vec<T, A> рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП vec.rs рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди PRs рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред versред рдмрдбрд╝рд╛ рд╣реИред

рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ https://github.com/rust-lang/rust/issues/32838#issuecomment -377097485 рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдХреЛрдбрдЬреЗрди "рдореБрджреНрджреЛрдВ" рдХреЛ # 49669 рдореЗрдВ рд╣реБрдП рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдм, рдкрд░рддреЛрдВ рдореЗрдВ рдПрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рдХреБрдЫ рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, рджреЛ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреА (рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдП):

  • рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдЕрд▓рдЧ AllocErr рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред рдпрд╣ ! рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЕрдм, AllocErr рдЦрд╛рд▓реА рд╣реИ, рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдпрд╣ "рд╡рд┐рдлрд▓" рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИред
  • рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдЕрд▓рдЧ Layout рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреА рджреЛ рдкрд░рддреЗрдВ рд╣реИрдВ: рдПрдХ рдкреГрд╖реНрда рдЖрд╡рдВрдЯрди рдХреЗ рд▓рд┐рдП, рдФрд░ рдПрдХ рдмрдбрд╝реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдПред рдмрд╛рдж рд╡рд╛рд▓рд╛ рдкреВрд░реНрд╡ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рд╡реЗ рджреЛрдиреЛрдВ рд╕рдорд╛рди Layout рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рджреЛрдиреЛрдВ рдкрд░рддреЛрдВ рдХреЛ рдЕрдкрдирд╛ рд╕рддреНрдпрд╛рдкрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рд╕рдмрд╕реЗ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдкрд░, рдпрд╣ рдЖрдХрд╛рд░ рдФрд░ рд╕рдВрд░реЗрдЦрдг рдкреГрд╖реНрда рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рдПрдХ рдмрд╣реБ рд╣реИ, рдФрд░ рдЙрдЪреНрдЪ рд╕реНрддрд░, рд╡рд╣ рдЖрдХрд╛рд░ рдФрд░ рд╕рдВрд░реЗрдЦрдг рдмрдбрд╝реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡реЗ рдЪреЗрдХ рдмреЗрдорд╛рдиреА рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ Layout рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, рд╕рддреНрдпрд╛рдкрди рдХреЛ рдЖрд╡рдВрдЯрд┐рддрдХрд░реНрддрд╛ рдХреЗ рдмрдЬрд╛рдп Layout рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ Layout рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рд░реВрдкрд╛рдВрддрд░рдг рдирд┐рд░рд░реНрдердХ рдЬрд╛рдВрдЪреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

@cramertj @SimonSapin @glandium рдареАрдХ рд╣реИ, рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рд╕рд┐рд░реНрдл рдХреБрдЫ рдЕрдиреНрдп рд╕рдВрдЧреНрд░рд╣-рдкреНрд░рдзрд╛рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛-рдПрдкреАрдУ рд░реЗрдкреЛ / рдЯреЛрдХрд░рд╛,

@alexreg Alloc 49669 рдореЗрдВ Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╡рд┐рд▓рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

@ рдЧреНрд▓реИрдВрдбрд┐рдпрдо рдореЗрд▓рд╛ рдкрд░реНрдпрд╛рдкреНрдд рдпрд╣ рд▓реИрдВрдбрд┐рдВрдЧ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рдирд╣реАрдВ рд▓рдЧрддрд╛ https://github.com/pnkfelix/collections-prime repo рдкрд░ рднреА рдзреНрдпрд╛рди рджрд┐рдпрд╛ ... рдЖрдкрдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдРрд╕рд╛ рдХреНрдпрд╛ рд╣реИ?

рдореИрдВ рдПрдХ рдФрд░ рдЦреБрд▓рд╛ рдкреНрд░рд╢реНрди рдЬреЛрдбрд╝реВрдВрдЧрд╛:

  • рдХреНрдпрд╛ Alloc::oom рдХреЛ рдЖрддрдВрдХрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ? рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдбреЙрдХреНрд╕ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рдзрд┐ рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд░рд╕реНрдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╣реИ рдЬреЛ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рддрдм рдореЗрдореЛрд░реА рдХреЛ рд▓реАрдХ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдирдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдареАрдХ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдореЗрдВ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдмрд╛рдж рд╕реЗ рдШрдмрд░рд╛рд╣рдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП, рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рднреА рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПред рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ oom рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛ (рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдореМрдЬреВрджрд╛ рдХреЛрдб рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛)ред

@alexreg рдпрд╣ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрд╕рдЯреАрдбреА / рдЖрд╡рдВрдЯрди / рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдХреА рдПрдХ рд╕рд╛рджреА рдкреНрд░рддрд┐ред рдЦреИрд░, рдЗрд╕рдХреА рджреЛ рд╕рд╛рд▓ рдкреБрд░рд╛рдиреА рдХреЙрдкреАред рдореЗрд░рд╛ рдЯреЛрдХрд░рд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рджрд╛рдпрд░реЗ рдореЗрдВ рд╕реАрдорд┐рдд рд╣реИ (рдкреНрд░рдХрд╛рд╢рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХреБрдЫ рд╣рдлреНрддреЛрдВ рдкрд╣рд▓реЗ рддрдХ Alloc рдЧреБрдг рд╣реИ, рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдореЗрдВ рдХреЗрд╡рд▓ RawVec рдФрд░ Box рд╢реАрд░реНрд╖ рдкрд░ рд╣реИ рд╡рд╣), рдФрд░ рдореЗрд░рд╛ рдПрдХ рд▓рдХреНрд╖реНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдЬрдВрдЧ рдХреЗ рд╕рд╛рде рдмрдирд╛рдП рд░рдЦрд╛ рдЬрд╛рдПред

@glandium , рдирд┐рд╖реНрдкрдХреНрд╖?

@alexreg рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЖрдк / рдЙрд╕ рдкрд░ рдЕрднреА рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рдкреАрдЖрд░ рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдкрд░ / рдЬрдм рдЖрдкрдХреЗ рдмрд╛рдЗрдХреНрд╕ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрдЧреА, рддреЛ рдЖрдкрдХреЗ рдЕрдВрдд рдкрд░ рдХреБрдЫ рдордВрдерди рд╣реЛрдЧрд╛ред

@ рдЧреНрд▓реИрдВрдбрд┐рдпрдо рдиреЗ рдореБрдЭреЗ рдЕрднреА рддрдХ

рдХреНрдпрд╛ Alloc :: oom рдХреЛ рдШрдмрд░рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ? рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдбреЙрдХреНрд╕ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рдзрд┐ рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд░рд╕реНрдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╣реИ рдЬреЛ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рддрдм рдореЗрдореЛрд░реА рдХреЛ рд▓реАрдХ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдирдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдареАрдХ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

@Amanieu рдЗрд╕ RFC рдХрд╛ рд╡рд┐рд▓рдп рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛: https://github.com/rust-lang/rfcs/pull/2116 рдбреЙрдХреНрд╕ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрднреА рддрдХ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВред

рдПрдкреАрдЖрдИ рдореЗрдВ рдПрдХ рдмрджрд▓рд╛рд╡ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдПрдХ рдкреАрдЖрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ: "рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди" рдФрд░ "рд╕рд╣рд╛рдпрдХ"ред рдкреВрд░реНрд╡ рдореЗрдВ alloc , dealloc , realloc , рдЖрджрд┐ рдФрд░ рдмрд╛рдж рдХреЗ рдХрд╛рд░реНрдп рд╣реЛрдВрдЧреЗ, alloc_one , dealloc_one , alloc_array , рдЖрджрд┐ рдЬрдмрдХрд┐ рдмрд╛рдж рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рд╕реЗ рдХреБрдЫ рдХрд╛рд▓реНрдкрдирд┐рдХ рд▓рд╛рдн рд╣реИрдВ, рдпрд╣ рд╕рдмрд╕реЗ рдЖрдо рдЬрд░реВрд░рдд рд╕реЗ рджреВрд░ рд╣реИ, рдФрд░ рдЬрдм рдЖрдкрдХреЛ рдЬреЗрдиреЗрд░рд┐рдХ рд░реИрдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЬреЛ рдореИрдВрдиреЗ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкрд╛рдпрд╛ рд╣реИ, рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЬреЛ рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ), рдЖрдкрдХреЛ рдЕрднреА рднреА рдЙрди рд╕рднреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд░реИрдкреНрдкреА рдЙрдиреНрд╣реЗрдВ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

OTOH, рдпрджрд┐ Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛ рдЬреИрд╕реЗ alloc_one рдореЗрдВ рдлреИрдВрд╕реА рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдЗрд╕ рдмрд╛рдд рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдЙрд╕ рдЖрд╡рдВрдЯрди рдХреЗ рд▓рд┐рдП dealloc_one рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдХрдИ рдХрд╛рд░рдг рд╣реИрдВ:

  • рд╕рд╣рд╛рдпрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рдЧрд╛рддрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд╕ рдПрдХ рдЙрджрд╛рд╣рд░рдг, raw_vec alloc_array , alloc / alloc_zeroed рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ dealloc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
  • рдпрд╣рд╛рдБ рддрдХ рдХрд┐ alloc_array / dealloc_array рд▓рдЧрд╛рддрд╛рд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде, рдПрдХ рдЕрднреА рднреА рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ Vec рдХреЛ Box рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рддрдм dealloc рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛
  • рдЗрд╕рдХреЗ рдмрд╛рдж рдПрдкреАрдЖрдИ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЗ рд╣реИрдВ рдЬреЛ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ ( alloc_one / alloc_array рдХреЛрдИ рд╢реВрдиреНрдп рд╕рдВрд╕реНрдХрд░рдг) рдирд╣реАрдВ

рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, alloc_one (рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ mozjemalloc рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреА рдЬрд░реВрд░рдд рд╣реИ) рдХреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ, рдПрдХ рдмрдЬрд╛рдп рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рдВрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдмреЗрд╣рддрд░ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЙрд╕рд╕реЗ рднреА рдмрджрддрд░ рд╣реИ, рдЬрдВрдЧ рдХреЗ рд░реЗрдкреЛ рдореЗрдВ, alloc_array рдХрд╛ рдПрдХ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ alloc_one , dealloc_one , realloc_array , dealloc_array ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмреЙрдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ alloc_one рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ exchange_malloc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ size рдФрд░ align рд▓реЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдзрд┐рдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

impl<A: Alloc> AllocHelpers for A (рдпрд╛ AllocExt , рдЬреЛ рднреА рдирд╛рдо рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ) рдЬреИрд╕реА рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд╕рд╛рде, рд╣рдо рдЕрднреА рднреА рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рдЬрдмрдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреИрд░ рдореЗрдВ рдЦреБрдж рдХреЛ рдЧреЛрд▓реА рдорд╛рд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рдпрджрд┐ рд╡реЗ рд╕реЛрдЪрддреЗ рд╣реИрдВ рд╡реЗ рдЙрдиреНрд╣реЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ (рдФрд░ рдкреНрд░реЙрдХреНрд╕реА рдЖрд╡рдВрдЯрди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдкрд░ рдЖрд╕рд╛рди рдмрдирд╛рдХрд░) рдлреИрдВрд╕реА рдЪреАрдЬреЗрдВ рдХрд░реЗрдВрдЧреЗред

рдПрдкреАрдЖрдИ рдореЗрдВ рдПрдХ рдмрджрд▓рд╛рд╡ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдкреАрдЖрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

# 50436 рдореЗрдВ рдРрд╕рд╛ рдХрд┐рдпрд╛

@glandium

(рдФрд░ рддрдереНрдп рдХреА рдмрд╛рдд рдХреЗ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ mozjemalloc рдХреА рдЗрддрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ),

рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ?

mozjemalloc рдХрд╛ рдПрдХ рдмреЗрд╕ рдПрд▓реЛрдХреЗрдЯрд░ рд╣реИ рдЬреЛ рдЙрджреНрджреЗрд╢реНрдпрдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд▓реАрдХ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЬрд╣рд╛рдБ рдпрд╣ рдПрдХ рдирд┐рдГрд╢реБрд▓реНрдХ рд╕реВрдЪреА рд░рдЦрддрд╛ рд╣реИред рдореИрдВ alloc_one рд╕рд╛рде рдЯреНрд░рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдП рдПрд▓реЛрдХреЗрдЯрд░ рдХреЛ рд▓реЗрдЯ рдХрд░ рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдХреНрдпрд╛ рдпрд╣ рдЙрд╕ рд╕рдЯреАрдХ рд╕рдВрд░реЗрдЦрдг рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдерд╛?

рдмрд╕ рдпрд╣ рдкреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рд╣рд╛рдВ рд╣реИ , рдореЗрд░реЗ рдкрд╛рд╕ рд╕реНрд╡рдпрдВ Microsoft рдХрд╛ рдпрд╣ рдкреНрдпрд╛рд░рд╛ рдЙрджреНрдзрд░рдг рд╣реИ:

align_alloc () рдХреЛ рд╢рд╛рдпрдж рдХрднреА рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ C11 рдиреЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИ (рдЕрд░реНрдерд╛рддреН, рдпрд╣ рдореБрдлрд╝реНрдд () рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрд░реЗрдЦрд┐рдд рдЖрд╡рдВрдЯрди рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)

рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рд╕рд┐рд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдПрд▓рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрдм рдЕрддреНрдпрдзрд┐рдХ рдПрд▓рд╛рдпрдВрд╕ рдЖрд╡рдВрдЯрди рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдбреАрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдХреНрд▓реЙрдХ рдХрд░рдирд╛ рд╣реЛ, рддреЛ рдХреНрдпрд╛ рд╣рдо рдХреГрдкрдпрд╛ рдЙрд╕ рдкреНрд░рд╢реНрди рдХреЛ рд╣рд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рд╕рд┐рд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдПрд▓рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрдм рдЕрддреНрдпрдзрд┐рдХ рдПрд▓рд╛рдпрдВрд╕ рдЖрд╡рдВрдЯрди рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдбреАрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдХреНрд▓реЙрдХ рдХрд░рдирд╛ рд╣реЛ, рддреЛ рдХреНрдпрд╛ рд╣рдо рдХреГрдкрдпрд╛ рдЙрд╕ рдкреНрд░рд╢реНрди рдХреЛ рд╣рд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдпрд╣ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣реИред рдЪрд▓реЛ рдлрд┐рд░ overaligned рд╡реИрдХреНрдЯрд░ рдкрд░ рдЫреЛрдбрд╝ рджреЗрдВред : рднреНрд░рдорд┐рдд:

рдЪрд▓реЛ рдлрд┐рд░ overaligned рд╡реИрдХреНрдЯрд░ рдкрд░ рдЫреЛрдбрд╝ рджреЗрдВ

рдРрд╕рд╛ рдХреИрд╕реЗ? рдЖрдкрдХреЛ рдХреЗрд╡рд▓ Vec<T, OverAlignedAlloc<U16>> рдЬреЛ рдУрд╡рд░рд▓реИрдЧреНрдирдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдЖрд╡рдВрдЯрд┐рдд рдФрд░ рдбреАрд▓ рдХрд░рддрд╛ рд╣реИред

рдРрд╕рд╛ рдХреИрд╕реЗ? рдЖрдкрдХреЛ рдХреЗрд╡рд▓ Vec<T, OverAlignedAlloc<U16>> рдЬреЛ рдУрд╡рд░рд▓реИрдЧреНрдирдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдЖрд╡рдВрдЯрд┐рдд рдФрд░ рдбреАрд▓ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛ рдХрд┐ рдЖрдкрдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдмрд╛рд╣рд░ рдПрдХ рдПрдкреАрдЖрдИ рдореЗрдВ рдУрд╡рд░рд▓реЗрдЧ рдХрд┐рдП рдЧрдП рд╡реИрдХреНрдЯрд░ рдЪрд▓рддреЗ рд╣реИрдВ, рдпрд╛рдиреА рдПрдХ Vec<T> рдФрд░ Vec<T, OverAlignedAlloc<U16>> ред (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП CString::new() ред)

рдЖрдкрдХреЛ рдмрд▓реНрдХрд┐ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

#[repr(align(16))]
struct OverAligned16<T>(T);

рдФрд░ рдлрд┐рд░ Vec<OverAligned16<T>> ред

рдЖрдкрдХреЛ рдмрд▓реНрдХрд┐ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рд╡рд╣ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк f32 s рдХреЗ рд╡реЗрдХреНрдЯрд░ рдкрд░ AVX рдЖрдВрддрд░рд┐рдХ (256 рдмрд┐рдЯ рд╡рд╛рдЗрдб, 32-рдмрд╛рдЗрдЯ рд╕рдВрд░реЗрдЦрдг рдЖрд╡рд╢реНрдпрдХрддрд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

  • Vec<T, OverAlignedAlloc<U32>> рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рддреА рд╣реИ, рдХреЛрдИ AVX рдЖрдВрддрд░рд┐рдХ рддрддреНрд╡реЛрдВ рдХрд╛ рд╕реАрдзреЗ рд╡реЗрдХреНрдЯрд░ рддрддреНрд╡реЛрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореЗрдореЛрд░реА рд▓реЛрдбреНрд╕) рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╡реЗрдХреНрдЯрд░ рдЕрднреА рднреА &[f32] рд╕реНрд▓рд╛рдЗрд╕ рдореЗрдВ рдбреАрд░реЗрдлрд╝реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдорд┐рдЯрд╛ рджреЗрддрд╛ рд╣реИред
  • Vec<OverAligned32<f32>> рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ f32 рд╕рдВрд░реЗрдЦрдг рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЗ 32 рдмрд╛рдЗрдЯреНрд╕ рд▓реЗрддрд╛ рд╣реИред рдкреЗрд╢ рдХрд┐рдП рдЧрдП рдкреИрдбрд┐рдВрдЧ f32 s рдХреЗ рдмрд╛рдж рд╕реЗ AVX рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкреНрд░рддреНрдпрдХреНрд╖ рдЙрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ, рдирд┐рд░рдВрддрд░ рдореЗрдореЛрд░реА рдкрд░ рдХрд┐рд╕реА рднреА рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИред рдФрд░ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП &[OverAligned32<f32>] рдереЛрдбрд╝рд╛ рдердХрд╛рдК рдХреЗ рд▓рд┐рдП deref рд▓рдЧрддрд╛ рд╣реИред

рдПрдХ Box , Box<T, OverAligned<U32>> Box<OverAligned32<T>> рдореЗрдВ рдПрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП, рджреЛрдиреЛрдВ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдзрд┐рдХ рд╕рдорд╛рди рд╣реИрдВ, рдФрд░ рджреВрд╕рд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИред

Alloc trait рдореЗрдВ рдЗрд╕ wrt рдмрджрд▓рд╛рд╡ рдХреЛ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВ: https://internals.rust-lang.org/t/pre-rfc-changing-the-alloc-trait/7487

рдЗрд╕ рдЕрдВрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕реНрдерд┐рдд рдЯреНрд░реИрдХрд┐рдВрдЧ рдкреЛрд╕реНрдЯ рдмреБрд░реА рддрд░рд╣ рд╕реЗ рдкреБрд░рд╛рдирд╛ рд╣реИ (рдкрд┐рдЫрд▓реА рдмрд╛рд░ 2016 рдореЗрдВ рдЗрд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред рд╣рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рдЪрд┐рдВрддрд╛рдУрдВ рдХреА рдПрдХ рдЕрджреНрдпрддрди рд╕реВрдЪреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЪрд░реНрдЪрд╛ рдХреЛ рдЕрдк-рдЯреВ-рдбреЗрдЯ рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ рднреА рд▓рд╛рдн рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЕрдирд╕реБрд▓рдЭреЗ рдкреНрд░рд╢реНрди рдФрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдирд┐рд░реНрдгрдпреЛрдВ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреИрдирд▓реЛрдВ (rfc рд░реЗрдкреЛ, рдЬрдВрдЧ-рд▓реИрдВрдЧ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛, рд╡реИрд╢реНрд╡рд┐рдХ рдЖрдмрдВрдЯрд┐рдд PFC, рдЖрдВрддрд░рд┐рдХ рдкреЛрд╕реНрдЯ, рдХрдИ) рдкрд░ рд╣рдЬрд╝рд╛рд░реЛрдВ рдХрдореЗрдВрдЯреЛрдВ рдХрд╛ рдЙрджреНрдШреЛрд╖ рдХрд░рддреЗ рд╣реБрдП "рдореВрд▓ рд░рд╛рддреНрд░рд┐рдХрд╛рд▓ рдореЗрдВ рдХреНрдпрд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ" рд╕реЗ "рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ" рд╕реЗ рднрд┐рдиреНрди рдХреЗ рдХрдИ рд╕реВрддреНрд░ рд╣реИрдВред рд╡рд┐рд╢рд╛рд▓ рдкреАрдЖрд░рдПрд╕, рдЖрджрд┐), рдФрд░ GlobalAlloc RFC рдореЗрдВ рдХреНрдпрд╛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдореВрд▓ RFC рдореЗрдВ рдЬреЛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЙрд╕рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред

рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдбреЙрдХреНрд╕ рдФрд░ рд╕рдВрджрд░реНрдн рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╡рд░реНрддрдорд╛рди рдЪрд░реНрдЪрд╛рдУрдВ рдореЗрдВ рднреА рд╕рд╣рд╛рдпрдХ рд╣реЛрдЧреАред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реЛрдЪрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕рднреА рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЖрд╡рдВрдЯрди рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рдпрд╣ рдЕрдиреБрднрд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реЛрдЪрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕рднреА рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЖрд╡рдВрдЯрди рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рдпрд╣ рдЕрдиреБрднрд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╣рд╛рдБ рдмрд┐рд▓реНрдХреБрд▓ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ Box , рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрднреА рддрдХ Box<T, A> рджреЛ рд╢рдмреНрдж рд▓реЗрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред

рд╣рд╛рдБ рдмрд┐рд▓реНрдХреБрд▓ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмреЙрдХреНрд╕, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрднреА рддрдХ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдмреЙрдХреНрд╕ рд░рдЦрдиреЗ рд╕реЗ рдХреИрд╕реЗ рдмрдЪреЗрдВрджреЛ рд╢рдмреНрдж рдЙрдард╛рдПрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП Box<T, A> рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдРрд╕реА рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ DeAlloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝рдХрд░ рдкрд┐рдЫрдбрд╝реЗ-рд╕рдВрдЧрдд рддрд░реАрдХреЗ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЖрд╡рдВрдЯрди рд░рджреНрдж рдХрд░рдиреЗред

рдЙрджрд╛рд╣рд░рдг:

trait DeAlloc {
    fn dealloc(&mut self, ptr: NonNull<Opaque>, layout: Layout);
}

trait Alloc {
    // In addition to the existing trait items
    type DeAlloc: DeAlloc = Self;
    fn into_dealloc(self) -> Self::DeAlloc {
        self
    }
}

impl<T: Alloc> DeAlloc for T {
    fn dealloc(&mut self, ptr: NonNull<Opaque>, layout: Layout) {
        Alloc::dealloc(self, ptr, layout);
    }
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рднреА рдРрд▓реЛрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕рднреА рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдВрдЧреНрд░рд╣реЛрдВ рдореЗрдВ рдЖрд╡рдВрдЯрди рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рдпрд╣ рдЕрдиреБрднрд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @SON2314 рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдкреНрд░рддрд┐ https://github.com/rust-lang/rust/issues/42774 рдкрд░ред рдЙрд╕рд╕реЗ рдЕрдкрдбреЗрдЯ рд▓реЗрдирд╛ рдЕрдЪреНрдЫрд╛ рд░рд╣реЗрдЧрд╛ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП Box<T, A> рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдРрд╕реА рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ DeAlloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝рдХрд░ рдкрд┐рдЫрдбрд╝реЗ-рд╕рдВрдЧрдд рддрд░реАрдХреЗ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЖрд╡рдВрдЯрди рд░рджреНрдж рдХрд░рдиреЗред

рдпрд╣ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдиреБрдХрд╕рд╛рди рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХ) рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдПрдХ рдкреЙрдЗрдВрдЯрд░ -> рдПрд▓реЛрдХреЗрдЯрд░ рд▓реБрдХрдЕрдк рд╕рдВрднрд╡ рд╣реИ (рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрд░реЗрдирд╛ рдПрд▓реЛрдХреЗрдЯрд░) рдФрд░, рдмреА) рдпрд╣ dealloc рдорд╣рддреНрд╡рдкреВрд░реНрдг рдУрд╡рд░рд╣реЗрдб рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдпрд╛ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрджреНрджреЗрд╢реНрдп рдкреНрд░рднрд╛рд╡ рдпрд╛ рд╕рдВрджрд░реНрдн рдкреНрд░рдгрд╛рд▓реА рд╣реИред рдпрд╛ рд╢рд╛рдпрдж рдХреБрдЫ рдЕрд▓рдЧ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╡рд░реНрддрдорд╛рди рдЕрд╡рддрд╛рд░ рдХреЗ рд╕рд╛рде рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред

@joshlf рдЗрд╕ рддрдереНрдп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХрд┐ Box<T, A> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрдм рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдкреИрдЯрд░реНрди рдЕрдЦрд╛рдбрд╝реЗ рдХреА рддрд░рд╣ рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдиреЙрди-рдСрдк dealloc рдФрд░ рдЬрдм рдПрд▓реЛрдХреЗрдЯрд░ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдмрд╕ рдореБрдлреНрдд рдореЗрдореЛрд░реАред

рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рдЖрд╡рдВрдЯрди рдХрдВрдЯреЗрдирд░ рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдореЗрдВ рд╣реИ (рдЬреИрд╕реЗ LinkedList ) рдФрд░ рдХрдИ рдЖрд╡рдВрдЯрди рдкреНрд░рдмрдВрдзрд┐рдд, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ Box рдХрд╛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, LinkedList рдЗрдВрдЯрд░реНрдирд▓ рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ Alloc LinkedList рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдирд┐рд╣рд┐рдд Alloc рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЖрд╡рдВрдЯрд┐рдд рдФрд░ рдореБрдХреНрдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рдпрд╣ рд╣рд░ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛рдПрдЧрд╛ред

рдЗрд╕ рддрдереНрдп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХрд┐ Box<T, A> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрдм рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдкреИрдЯрд░реНрди рдЕрдЦрд╛рдбрд╝реЗ рдХреА рддрд░рд╣ рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдиреЙрди-рдСрдк dealloc рдФрд░ рдЬрдм рдПрд▓реЛрдХреЗрдЯрд░ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдмрд╕ рдореБрдлреНрдд рдореЗрдореЛрд░реАред

рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди Box рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ dealloc рдиреЛ-рдСрдк рд╣реИред

рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЬрд╣рд╛рдВ рдЖрд╡рдВрдЯрди рдХрдВрдЯреЗрдирд░ рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдореЗрдВ рд╣реИ (рдЬреИрд╕реЗ LinkedList ) рдФрд░ рдХрдИ рдЖрд╡рдВрдЯрди рдкреНрд░рдмрдВрдзрд┐рдд, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдмреЙрдХреНрд╕ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, LinkedList рдЗрдВрдЯрд░реНрдирд▓ рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ LinkedList рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдирд┐рд╣рд┐рдд Alloc рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд╕рд╛рде рдЖрд╡рдВрдЯрд┐рдд рдФрд░ рдореБрдХреНрдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рдпрд╣ рд╣рд░ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реЛрдЧреАред рдпрджрд┐ рд▓рдХреНрд╖реНрдп рд╕рднреА рд╕рдВрдЧреНрд░рд╣ (рд╕рдВрднрд╡рдд: рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдмрд╛рд╣рд░ рдХреЗ рд▓реЛрдЧреЛрдВ рд╕рд╣рд┐рдд) рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдЖрдмрдВрдЯрдХ рдкрд░ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдмрдирд╛рдирд╛ рд╣реИ, рдФрд░ Box рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛-рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд▓реЗрдЦрдХ рдХреЛ Box рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП Box рдпрд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдФрд░ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рд╣рдореЗрд╢рд╛ рдореБрдлрд╝реНрдд рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ C рдФрд░ C ++ рдореЗрдВ рд╕рдмрд╕реЗ рдЖрдо рдкреНрд░рдХрд╛рд░ рдХреА рдореЗрдореЛрд░реА рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЙрд╕ рд╕рдордп рдХрд╛ рдореБрд╢реНрдХрд┐рд▓-рд╕реЗ-рд╕рд╣реА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд╣реИ)ред рдпрд╣ рдПрдХ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╕реМрджреЗрдмрд╛рдЬреА рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдмреЙрдХреНрд╕ рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдбреАрд▓реЙрдХ рдиреЛ-рдСрдк рд╣реИред

C ++ unique_ptr рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ?
рд╡рд╣ рд╣реИ: рдпрджрд┐ "рд╕реНрдЯреЗрдЯрдлреБрд▓" рд╣реИ, рддреЛ рдПрд▓реЛрдХреЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЕрдЧрд░ рдПрд▓реЛрдХреЗрдЯрд░ "рдмреЗрдХрд╛рд░" рд╣реИ рддреЛ рдЗрд╕реЗ рд╕реНрдЯреЛрд░ рди рдХрд░реЗрдВ
(рдЙрджрд╛ред рд╡реИрд╢реНрд╡рд┐рдХ рд░реИрдкрд░ рд▓рдЧрднрдЧ malloc рдпрд╛ mmap )ред
рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди Alloc рдЪрд┐рд╣реНрди рджреЛ рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛: StatefulAlloc рдФрд░ StatelessAlloc ред
рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрд╢рд┐рд╖реНрдЯ рдФрд░ рдЕрд╕рднреНрдп рд╣реИ (рдФрд░ рд╢рд╛рдпрдж рдХрд┐рд╕реА рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕реЗ рдкрд┐рдЫрд▓реЗ рдЪрд░реНрдЪрд╛рдУрдВ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИ)ред
рдЕрдкрдиреА рдЕрдХреБрд╢рд▓рддрд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдпрд╣ рд╕рдорд╛рдзрд╛рди рд╕рд░рд▓ рдФрд░ рдкрд┐рдЫрдбрд╝рд╛ рд╕рдВрдЧрдд рд╣реИ (рдкреНрд░рджрд░реНрд╢рди рджрдВрдб рдХреЗ рдмрд┐рдирд╛)ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реЛрдЧреАред рдпрджрд┐ рд▓рдХреНрд╖реНрдп рд╕рднреА рд╕рдВрдЧреНрд░рд╣ (рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмрд╛рд╣рд░ рдХреЗ рд▓реЛрдЧреЛрдВ рд╕рд╣рд┐рдд) рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдЖрдмрдВрдЯрдХ рдкрд░ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдмрдирд╛рдирд╛ рд╣реИ, рдФрд░ рдмреЙрдХреНрд╕ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛-рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд▓реЗрдЦрдХ рдХреЛ рдпрд╛ рддреЛ рдмреЙрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдФрд░ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЪреАрдЬреЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рдореБрдлреНрдд рдореЗрдВ рдпрд╛рдж рд░рдЦрдирд╛ C рдФрд░ C ++ рдореЗрдВ рд╕рдмрд╕реЗ рдЖрдо рдкреНрд░рдХрд╛рд░ рдХреА рдореЗрдореЛрд░реА рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЙрд╕ рд╕рдордп рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рд╕рд╣реА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд╣реИ)ред рдпрд╣ рдПрдХ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╕реМрджреЗрдмрд╛рдЬреА рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдкреНрд░рднрд╛рд╡ рдпрд╛ рд╕рдВрджрд░реНрдн рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛ рдХрд┐рд╕реА рдХреЛ рдиреЛрдб-рдЖрдзрд╛рд░рд┐рдд рдХрдВрдЯреЗрдирд░реЛрдВ рдЬреИрд╕реЗ рд╕реВрдЪрд┐рдпреЛрдВ, рдкреЗрдбрд╝реЛрдВ рдЖрджрд┐ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИ (рдпрджрд┐ рдпрд╣ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рд╕рдВрднрд╡ рд╣реИ) рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдХрд╛рдЧрдЬрд╛рдд рдпрд╛ рдЕрдХрд╛рджрдорд┐рдХ рднрд╛рд╖рд╛ рдирд╣реАрдВ рджреЗрдЦреА (рдХреГрдкрдпрд╛, рдореБрдЭреЗ рд╕рд╣реА рдХрд░реЗрдВ рдЕрдЧрд░ рдРрд╕реЗ рдХрд╛рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ)ред

рддреЛ рдиреЛрдб-рдЖрдзрд╛рд░рд┐рдд рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ unsafe рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдмреБрд░рд╛рдИ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдореЗрдВред

@eucpp рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ unique_ptr рдПрдХ рдПрд▓реЛрдХреЗрдЯрд░ рдХреЛ рд╕реНрдЯреЛрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдПрдХ Deleter рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ:

рдкреНрд░рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдлрд╝рдВрдХреНрд╢рди:: pointer`

рдореИрдВ рдЗрд╕реЗ рд▓рдЧрднрдЧ Alloc рдФрд░ Dealloc рд▓рдХреНрд╖рдг рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦрддрд╛ рд╣реВрдБред

@cramertj рд╣рд╛рдБ, рдЖрдк рд╕рд╣реА рд╣реИрдВред рдлрд┐рд░ рднреА, рджреЛ рд▓рдХреНрд╖рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рд╕реНрдЯреЗрдЯрдлреБрд▓ рдФрд░ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ Dealloc ред

рдПрдХ ZST Dealloc рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛?

Tue рдкрд░, Jun 12, 2018 рдХреЛ 3:08 рдЕрдкрд░рд╛рд╣реНрди рдмрдЬреЗред рдПрд╡рдЧреЗрдирд┐рдпрди рдореЛрдЗрдЬрд╝реЗрдВрдХреЛ рд╕реВрдЪрдирд╛рдПрдВ @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

@cramertj https://github.com/cramertj рд╣рд╛рдБ, рдЖрдк рд╕рд╣реА рд╣реИрдВред рдлрд┐рд░ рднреА, рджреЛ
рд▓рдХреНрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рд╕реНрдЯреЗрдЯрдлреБрд▓ рдФрд░ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рдбреАрд▓рд▓реЛрдХред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/32838#issuecomment-396716689 ,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AEAJtWkpF0ofVc18NwbfV45G4QY6SCFBks5t8B_AgaJpZM4IDYUN
ред

рдПрдХ ZST Dealloc рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛?

@ рд╕реБрдкреНрд░реАрдо рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣реЛрдЧрд╛ :)

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдЬрдВрдЧ рд╕рдВрдХрд▓рдХ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ ZST рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
C ++ рдореЗрдВ рдЦрд╛рд▓реА рдЖрдзрд╛рд░ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдЯреНрд░рд┐рдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдореИрдВ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдХреБрдЫ рдЧрд▓рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ рд░рд╕реНрдЯ рдкрд░ рдирдпрд╛ рд╣реВрдБред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рд╕реНрдЯреЗрдЯрдлреБрд▓ рдмрдирд╛рдо рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд▓рдХреНрд╖рдг рдЪрд╛рд╣рд┐рдПред

Box A рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд░реНрдзрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдЗрд╕рдореЗрдВ A рд╕реАрдзреЗ рд╣реЛрдЧрд╛, рди рдХрд┐ A рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдпрд╛ рд╕реВрдЪрдХред рдпрд╣ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ (рдбреА) рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╛ A рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рд╕рдВрджрд░реНрдн рдпрд╛ рд╣реИрдВрдбрд▓ рдХреА рддрд░рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЖрд╡рдВрдЯрд┐рдд рдЖрд╡рдВрдЯрди рдХреЗ рд╕рд╛рде рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХрдИ рдЖрд╡рдВрдЯрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП impl Alloc for MyAllocator рдмрдЬрд╛рдп, рдЖрдк impl<'r> Alloc for &'r MyAllocator рдЬреИрд╕рд╛ рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВ

рд╡реИрд╕реЗ, рдПрдХ Box рдЬреЛ рдХреЗрд╡рд▓ рдбреАрд▓ рдбреАрд▓ рдХрд░рдирд╛ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рди рдХрд┐ рдХреИрд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рд╣реИ Clone рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

@SimonSapin рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ Clone ing рдХреЛ рдлрд┐рд░ рд╕реЗ рдПрдХ рдПрд▓реЛрдХреЗрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдПрдХ рдирдпрд╛ Box рд╣реЛрдЧрд╛ (рдЕрд░реНрдерд╛рдд, рдпрд╣ Clone рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)

@cramertj Vec рдФрд░ рдЕрдиреНрдп рдХрдВрдЯреЗрдирд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬреЛ Clone рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ?
Alloc Box рдмрдЬрд╛рдп Dealloc Alloc рдЕрдВрджрд░ рдХреЗ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рдбрд╛рдЙрдирд╕рд╛рдЗрдб рдХреНрдпрд╛ рд╣реИрдВ?
рддрдм Box Clone рдФрд░ clone_with_alloc ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд▓рдХреНрд╖рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрд▓реЛрди рдХреЛ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣ рд╕рд┐рд░реНрдл impl<T, A> Clone for Box<T, A> where A: Alloc + Dealloc + Clone { ... } ред

@sfackler рдореИрдВ рдЙрд╕ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХрд╛ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдПрдХ clone_into рдпрд╛ рдХреБрдЫ рдРрд╕рд╛ рднреА рдорд┐рд▓реЗрдЧрд╛ рдЬреЛ рдХрд┐рд╕реА рдкреНрд░рджрддреНрдд рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдПрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдпрджреЗрдордВрдж рд╣реЛрдЧрд╛ alloc_copy рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ Alloc ? рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрдбрд╝реЗ рдЖрд╡рдВрдЯрди рдХреЗ рд▓рд┐рдП рддреЗрдЬреА рд╕реЗ рдореЗрдореНрдЪреА ( Copy/Clone ) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдкреГрд╖реНрдареЛрдВ рдХреЗ рдХреЙрдкреА-рдСрди-рд░рд╛рдЗрдЯ рдХреНрд▓реЛрди рдХрд░рдХреЗред

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрдЪреНрдЫ рд╣реЛрдЧрд╛ред

рдРрд╕реЗ alloc_copy рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? impl Clone for Box<T, A> ?

рд╣рд╛рдБ, Vec рд▓рд┐рдП рдбрд┐рдЯреНрдЯреЛред

рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж рдХреБрдЫ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╣реИрдХ рдФрд░ рдЕрд╕рдВрднрд╡ рдХреЗ рдмреАрдЪ рд╕рдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реАрдорд╛ рдХреЗ рднреАрддрд░ рдХреЙрдкреА-рдСрди-рд░рд╛рдЗрдЯ рдкреЗрдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдХрдо рд╕реЗ рдХрдо рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрддрд░ рдХреА рдЧрд╣рд░рд╛рдИ рд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рддреЛ alloc_copy рдПрдХ рдмрдбрд╝рд╛ рд▓рд╛рдн рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рднрд╛рдЧрдиреЗ рдХреА рд╣реИрдЪ рдЬреЛ рднрд╡рд┐рд╖реНрдп рдХреА рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рд╢реЗрдВрдирд┐рдЧрдиреНрд╕ рдХреЛ рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╛рдиреА рдЕрдЧрд░ рдЖрд╡рдВрдЯрди рдмрдбрд╝рд╛ рд╣реИ, рд╡реИрд╕реЗ рднреА рдПрдордПрдордПрдкреА рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдФрд░ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рд╣реИ, рддреЛ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЖрд╡рдВрдЯрди рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдирдЬрд╛рди рд╣реЛрдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлрд┐рд░ рдЙрд╕ рдореЗрдореЛрд░реА рдХреЛ рдПрдХ рдкрд╛рдЗрдк рдкрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрд╕реЗ рдЕрдирдкрдо рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХреА рдЪреАрдЬреЛрдВ рдХреЛ рдЕрдирдореИрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдЧреВрдВрдЧрд╛ mmap-all-the-things рдПрд▓реЛрдХреЗрд╢рдирд░ рдФрд░ рдПрдХ рдЯреНрд░рд╛рдиреНрд╕рдлрд░-рдЯреНрд░рд╛рдВрд╕рдлрд░ рдлрд╝рдВрдХреНрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдПрд╕реНрдХреЗрдк рд╣реИрдЪ рдЬреЛ рднрд╡рд┐рд╖реНрдп рдХреА рдЖрднрд╛рд╕реА рдореЗрдореЛрд░реА рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ

рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрдЯрд░реНрд╕ (рдореЙрд▓реЙрдХ, рдЬреЗрдорд╛рд▓реЙрдХ, ...) рдЖрдо рддреМрд░ рдкрд░ рдЖрдкрдХреЛ рдЙрдирд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреА рдореЗрдореЛрд░реА рдХреЛ рдЪреЛрд░реА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рдЖрдо рддреМрд░ рдкрд░ рдЖрдкрдХреЛ рдХреНрд╡реЗрд░реА рдпрд╛ рдмрджрд▓рдиреЗ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдореЗрдореЛрд░реА рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдХреНрдпрд╛ рдХрд╣рддреЗ рд╣реИрдВред рддреЛ рдЗрд╕ рд╕рд╛рдорд╛рдиреНрдп рдмрдЪрдиреЗ рд╡рд╛рд▓реА рд╣реИрдЪ рдХрд╛ рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрдЯрд░ рд╕реЗ рдХреНрдпрд╛ рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реИ?

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рд╕рдкреЛрд░реНрдЯ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рдмреАрдЪ рдмрд╣реБрдд рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЗрддрдирд╛ рд╣реА рдирд╣реАрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдХрд╛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╕рд░ рдкреНрд░рддрд┐ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореИрдВрдиреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдкрд░ рдХреБрдЫ рдкреЛрд░реНрдЯреЗрдмрд▓ рдЕрдореВрд░реНрддрддрд╛рдПрдВ рджреЗрдЦреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдРрд╕рд╛ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ "рдкреЛрд░реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА" рдХреЗ рдХрд╛рд░рдг рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдмреЗрдХрд╛рд░ рд╣реЛрдиреЗ рдХреА рдмрд╛рдд рддрдХ рдирд╣реАрдВ рдереАред

рдЖрдк рд╕рд╣реА рд╣реЗред рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХреЛрдИ рднреА рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ (рдореИрдВ рдЬреНрдпрд╛рджрд╛рддрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛) рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ рдХрд╕реНрдЯрдо рдПрд▓реЛрдХреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрднрд╡рддрдГ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЕрдкрдиреА CppCon рдкреНрд░рд╕реНрддреБрддрд┐ рдореЗрдВ рдЖрдВрджреНрд░реЗрдИ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╕рдордЧреНрд░ рдПрд▓реЛрдХреЗрдЯрд░ рдПрдкреАрдЖрдИ рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░? рд╡реАрдбрд┐рдпреЛ рдпрд╣рд╛рдВ YouTube рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ: https://www.youtube.com/watch?v=LIb3L4vKZ7U (рд╡рд╣ 26:00 рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдд рдЗрддрдиреА рдордиреЛрд░рдВрдЬрдХ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рдирд┐рд╖реНрдХрд░реНрд╖ рд╣реИ рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп WRT рдЖрд╡рдВрдЯрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╕реНрд╡рдпрдВ рдирд┐рд░реНрдорд╛рдг рд╕реНрдерд▓ рдкрд░ рдЖрд╡рдВрдЯрд┐рддрдХрд░реНрддрд╛рдУрдВ рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдкрдиреА CppCon рдкреНрд░рд╕реНрддреБрддрд┐ рдореЗрдВ рдЖрдВрджреНрд░реЗрдИ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╕рдордЧреНрд░ рдПрд▓реЛрдХреЗрдЯрд░ рдПрдкреАрдЖрдИ рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

рд╡рд░реНрддрдорд╛рди Alloc API рдХрдВрдкреИрдХреНрдЯреЗрдмрд▓ рдПрд▓реЛрдХреИрдЯрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдЬреИрд╕реЗ MyAlloc<Other: Alloc> ) рдФрд░ рдЖрдк рдЖрдВрджреНрд░реЗрдИрд╕ рдЯреЙрдХ рдореЗрдВ рд╣рд╛рд╕рд┐рд▓ рдХреА рдЧрдИ рд╣рд░ рдЪреАрдЬ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рдг рдФрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, "рд╡рд┐рдЪрд╛рд░" рд╕реЗ рдкрд░реЗ, рдЬреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрдВрджреНрд░реЗрдИ рдХреА рдмрд╛рдд рд╕реЗ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рднреА рд░реБрд╕реНрдЯ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдВрджреНрд░реЗрдИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдПрдкреАрдЖрдИ рдмрдирд╛рддрд╛ рд╣реИ, рд╡рд╣ рдЕрдирд░реНрд╕реНрдЯреНрд░реЗрдЯреЗрдб рдЬреЗрдирд░рд┐рдХ + SFINAE / рд╕реНрдЯреЗрдЯрд┐рдХ рдкрд░ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдФрд░ рд░реБрд╕реНрдЯ рдХреЗ рдЬреЗрдирд░рд┐рдХ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИред

рдореИрдВ рдмрд╛рдХреА Layout рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдпреЗ рд╡рд░реНрддрдорд╛рди рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧреА рд╣реИрдВред

рдХреНрдпрд╛ рдпреЗ рд╕рднреА рддрд░реАрдХреЗ рдЖрдкрдХреЗ рдорддрд▓рдм рдХреЗ рд╣реИрдВ?

  • pub fn align_to(&self, align: usize) -> Layout
  • pub fn padding_needed_for(&self, align: usize) -> usize
  • pub fn repeat(&self, n: usize) -> Result<(Layout, usize), LayoutErr>
  • pub fn extend(&self, next: Layout) -> Result<(Layout, usize), LayoutErr>
  • pub fn repeat_packed(&self, n: usize) -> Result<Layout, LayoutErr>
  • pub fn extend_packed(&self, next: Layout) -> Result<(Layout, usize), LayoutErr>
  • pub fn array<T>(n: usize) -> Result<Layout, LayoutErr>

@gnzlbg рд╣рд╛рдВред

@Amanieu рдореБрдЭреЗ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрджреНрджрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИред рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджреЗ (рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреАрдЖрд░) рдХреЛ рджрд░реНрдЬ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ FCP рдЕрд▓рдЧ рд╕реЗ?

рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдФрд░ рдЬреАрд╡рдирдХрд╛рд▓ рд╕реЗ :

  1. (рдЖрдмрдВрдЯрдХ рдЖрдмрдВрдЯрди рдХреЗ рд▓рд┐рдП): рдПрдХ рдЖрдмрдВрдЯрди рдорд╛рди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдкрд░ рдЗрд╕рдХреЗ рдмрдХрд╛рдпрд╛ рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ рдХреЛ рдЕрдорд╛рдиреНрдп рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

    рд╕рднреА рдЧреНрд░рд╛рд╣рдХ рдЗрд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВред

    рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдХреЛрдИ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдХ рдПрд▓рд╛рдпреЗрдЯрд░ рд╕реЗ рдПрдХ рдмреНрд▓реЙрдХ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ (рддреЛ рдЗрд╕реЗ a1 рдХрд╣рддреЗ рд╣реИрдВ) рдФрд░ рдлрд┐рд░ a1 рдПрдХ рдирдИ рдЬрдЧрд╣ (рдЬреИрд╕реЗ vialet a2 = a1) рдкрд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП a2 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрд╕ рдмреНрд▓реЙрдХ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдирд┐ рдмрдиреА рд░рд╣рддреА рд╣реИред

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдПрд▓реЛрдХреЗрдЯрд░ Unpin рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдЕрдЪреНрдЫреА рдкрдХрдбрд╝!

рдЪреВрдБрдХрд┐ Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдЕрднреА рднреА рдЕрд╕реНрдерд┐рд░ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо RFC рдХреЗ рдЗрд╕ рднрд╛рдЧ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдЕрднреА рднреА рдирд┐рдпрдо рдмрджрд▓рдиреЗ рд╣реЛрдВрдЧреЗред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реИред

@gnzlbg рд╣рд╛рдВ, рдореБрдЭреЗ рдЬреЗрдирд░рд┐рдХ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рднрд╛рд░реА рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдирд╣реАрдВ рдХрд┐ рд╡рд╣ рдЬреЛ рдХреБрдЫ рднреА рд╡рд┐рд╡рд░рдг рджреЗрддрд╛ рд╣реИ рд╡рд╣ рд░рд╕реНрдЯ рдореЗрдВ рдЙрд╕реА рддрд░рд╣ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рдкреЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдмрд╛рдж рд╕реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдФрд░ рдореИрдВ рдЕрдЪреНрдЫреА рдкреНрд░рдЧрддрд┐ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдПрд▓реЛрдХреЗрдЯрд░ _must_ Unpin ?

рдпрд╣ рдирд╣реАрдВ рд╣реИ Unpin рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬрдм Pin рдореЗрдВ рд▓рд┐рдкрдЯреЗ рд╣реБрдП рд╣реИрдВ, рдЗрд╕ рдПрдкреАрдЖрдИ рд╕реЗ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдмрдВрдз рдирд╣реАрдВ рд╣реИред

рд▓реЗрдХрд┐рди рдЙрд▓реНрд▓реЗрдЦрд┐рдд рдмрд╛рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Unpin рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

dealloc_array рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓: рдлрд╝рдВрдХреНрд╢рди Result рд╡рд╛рдкрд╕ рдХреНрдпреЛрдВ рдХрд░рддрд╛ рд╣реИ? рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдпрд╣ рджреЛ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

  • n рд╢реВрдиреНрдп рд╣реИ
  • n * size_of::<T>() рд▓рд┐рдП рдХреНрд╖рдорддрд╛ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣

рдкрд╣рд▓реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдорд╛рдорд▓реЗ рд╣реИрдВ (рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛ рдЗрдирдореЗрдВ рд╕реЗ рдЪреБрди рд╕рдХрддрд╛ рд╣реИ):

  • рдЖрд╡рдВрдЯрди Ok рд╢реВрдиреНрдп рдкрд░ n => dealloc_array рднреА Ok рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдЖрд╡рдВрдЯрди Err рд╢реВрдиреНрдп n => рдкрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдХреЛрдИ рд╕рдВрдХреЗрддрдХ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ dealloc_array рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рджреВрд╕рд░рд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

[T; n] рдХрд╛ рд▓реЗрдЖрдЙрдЯ рдореЗрдореЛрд░реА рдХреЗ рдЙрд╕ рдмреНрд▓реЙрдХ рдХреЛ рдлрд┐рдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ, рдХрд┐ рд╣рдореЗрдВ dealloc_array рдХрд╛ рдЖрд╡рдВрдЯрди рдореЗрдВ n рд╕рд╛рде рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред рдпрджрд┐ n рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рддреЛ n T рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реИред рдЕрдиреНрдпрдерд╛, рдЖрд╡рдВрдЯрди рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рднрд▓реЗ рд╣реА usable_size n * size_of::<T>() рд╕реЗ рдЕрдзрд┐рдХ рдореВрд▓реНрдп рджреЗрддрд╛ рд╣реЛ, рдпрд╣ рдЕрднреА рднреА рдорд╛рдиреНрдп рд╣реИред рдЕрдиреНрдпрдерд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рд▓рдХреНрд╖рдг рдмрд╛рдзрд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ:

рдмреНрд▓реЙрдХ рдХрд╛ рдЖрдХрд╛рд░ [use_min, use_max] рдореЗрдВ рдЧрд┐рд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд╣рд╛рдВ:

  • [...]
  • use_max рд╡рд╣ рдХреНрд╖рдорддрд╛ рд╣реИ рдЬреЛ рддрдм (рдпрд╛ рддрдм рд╣реЛрддреА) рд▓реМрдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИ рдЬрдм (рдпрджрд┐) рдмреНрд▓реЙрдХ рдХреЛ alloc_excess рдпрд╛ realloc_excess рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ред

рдпрд╣ рдХреЗрд╡рд▓ рдзрд╛рд░рдг рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП unsafe impl рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдкрд╣рд▓реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдорд╛рдорд▓реЗ рд╣реИрдВ (рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛ рдЗрдирдореЗрдВ рд╕реЗ рдЪреБрди рд╕рдХрддрд╛ рд╣реИ):

  • рдЖрд╡рдВрдЯрди Ok рдкрд░ n

рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдХрд╣рд╛рдВ рд╕реЗ рдорд┐рд▓реА?

рдбреЙрдХреНрд╕ рдореЗрдВ рд╕рднреА Alloc::alloc_ рд╡рд┐рдзрд┐рдпрд╛рдБ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреА рд╣реИрдВ рдХрд┐ рд╢реВрдиреНрдп рдЖрдХрд╛рд░ рдХреЗ рдЖрд╡рдВрдЯрди рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЙрдирдХреЗ "рд╕реБрд░рдХреНрд╖рд╛" рдЦрдВрдб рдХреЗ рддрд╣рдд рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред

core::alloc::Alloc (рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рднрд╛рдЧреЛрдВ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рдЧрдпрд╛) рдХреЗ

рд╢реВрдиреНрдп-рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдХреЗ рд▓реЗрдЖрдЙрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдиреЛрдЯ: Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдХрдИ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЬреЛ рдЖрд╡рдВрдЯрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЧреИрд░-рд╢реВрдиреНрдп рдЖрдХрд╛рд░ рдХреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдЕрдиреНрдпрдерд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

  • рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреБрдЫ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЖрд╡рдВрдЯрди рд╡рд┐рдзрд┐рдпрд╛рдВ ( alloc_one , alloc_array ) рд╢реВрдиреНрдп-рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЙрдирдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреА рд╣реИрдВ : рдЗрд╕реЗ Err рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛ рдкрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ Ok рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ред
  • рдпрджрд┐ рдХреЛрдИ Alloc рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ Ok рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирддрд╛ рд╣реИ (рдпрд╛рдиреА рдкреЙрдЗрдВрдЯрд░ рд╢реВрдиреНрдп рдЖрдХрд╛рд░ рдХреЗ рджреБрд░реНрдЧрдо рдмреНрд▓реЙрдХ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ) рддреЛ рдЙрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЛ "рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд" рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕реЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдкрд░, рд╕рднреА рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЖрдмрдВрдЯрд┐рдд рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд▓реЗрддреА рд╣реИрдВ, рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрди рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рд╡рд╛рд▓реЗ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

  • рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рдПрдХ рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдХрд╛ рд╕реВрдЪрдХ рдПрдХ рдЖрдмрдВрдЯрдХ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЙрд╕ рдЖрдмрдВрдЯрдХ рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╕реВрдЪрдХ рдЕрдкрдиреЗ рдбреАрд▓-рдбреМрд▓ рдФрд░ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрддрд┐ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╡рд╛рдкрд╕ рдмрд╣ рд░рд╣рд╛ рд╣реИ ред

рддреЛ dealloc_array рдХреА рддреНрд░реБрдЯрд┐ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрджрд┐рдЧреНрдз рд╣реИ:

/// # Safety
///
/// * the layout of `[T; n]` must *fit* that block of memory.
///
/// # Errors
///
/// Returning `Err` indicates that either `[T; n]` or the given
/// memory block does not meet allocator's size or alignment
/// constraints.

рдпрджрд┐ [T; N] рдЖрд╡рдВрдЯрди рдЖрдХрд╛рд░ рдпрд╛ рд╕рдВрд░реЗрдЦрдг рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ AFAICT рдпрд╣ рдЖрд╡рдВрдЯрди рдХреА рд╕реНрдореГрддрд┐ рдХреЗ рдмреНрд▓реЙрдХ рдХреЛ рдлрд┐рдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ (рд╕реБрд░рдХреНрд╖рд╛ рдЦрдВрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░)ред

рдЕрдиреНрдп рддреНрд░реБрдЯрд┐ рд╕реНрдерд┐рддрд┐ рдпрд╣ рд╣реИ "рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдкрд░ рд╣рдореЗрд╢рд╛ Err рд░рд┐рдЯрд░реНрди рдорд┐рд▓рддрд╛ рд╣реИред" рдЬреЛ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рдпрд╣ рдмрддрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдЙрдкрдпреЛрдЧреА рддреНрд░реБрдЯрд┐ рд╕реНрдерд┐рддрд┐ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╕реЗ рдПрдХ рд╕рд╛рде рдЖрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рдЕрдВрдХрдЧрдгрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реИрдк рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП 4 4 4


core::alloc::Alloc (рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рднрд╛рдЧреЛрдВ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛):

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВред рдореБрдЭреЗ рдпрд╣ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрддрдиреЗ рд╕рд╛рд░реЗ рддрд░реАрдХреЗ (рдЬреИрд╕реЗ Alloc::alloc ) рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдХрд╛ рдЖрд╡рдВрдЯрди рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде Alloc::alloc_array(0) рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдХреБрдЫ рдЕрд░реНрдереЛрдВ рдореЗрдВ Alloc::alloc_array(0) рдПрдХ рд▓рд┐рдЯрдорд╕ рдЯреЗрд╕реНрдЯ рд╣реИ рдЬреЛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдПрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдХреЗ рдЖрд╡рдВрдЯрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдпрджрд┐ [T; N] рдЖрд╡рдВрдЯрди рдЖрдХрд╛рд░ рдпрд╛ рд╕рдВрд░реЗрдЦрдг рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ AFAICT рдпрд╣ рдЖрд╡рдВрдЯрди рдХреА рд╕реНрдореГрддрд┐ рдХреЗ рдмреНрд▓реЙрдХ рдХреЛ рдлрд┐рдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ (рд╕реБрд░рдХреНрд╖рд╛ рдЦрдВрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░)ред

рд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмреЗрдорд╛рдиреА рд╣реИред рдпрд╛ рддреЛ рд╣рдореЗрдВ рд╕реБрд░рдХреНрд╖рд╛ рдХреНрд▓реЙрдЬрд╝ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рддреНрд░реБрдЯрд┐ рд╕реНрдерд┐рддрд┐ рдХреА, рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ рдХреА рдирд╣реАрдВред

рдЕрдиреНрдп рддреНрд░реБрдЯрд┐ рд╕реНрдерд┐рддрд┐ рдпрд╣ рд╣реИ "рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдкрд░ рд╣рдореЗрд╢рд╛ Err ред" рдЬреЛ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рдпрд╣ рдмрддрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдЙрдкрдпреЛрдЧреА рддреНрд░реБрдЯрд┐ рд╕реНрдерд┐рддрд┐ рд╣реИред

IMO, рдпрд╣ рдКрдкрд░ рдХреЗ рд╕рдорд╛рди рд╕реБрд░рдХреНрд╖рд╛ рдХреНрд▓реЙрдЬ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИ; рдЕрдЧрд░ [T; N] рдХреА рдХреНрд╖рдорддрд╛ рдУрд╡рд░рдлреНрд▓реЛ рд╣реЛ рдЬрд╛рдПрдЧреА, рддреЛ рдпрд╣ рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рдЯ рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж @pnkfelix рдЗрд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдХреБрдЫ рдЕрд░реНрдереЛрдВ рдореЗрдВ Alloc::alloc_array(1) рдПрдХ рд▓рд┐рдЯрдорд╕ рдЯреЗрд╕реНрдЯ рд╣реИ рдЬреЛ рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдПрдХ рдПрд▓реЛрдХреЗрдЯ рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдХреЗ рдЖрд╡рдВрдЯрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм Alloc::alloc_array(0) ?

IMO, рдпрд╣ рдКрдкрд░ рдХреЗ рд╕рдорд╛рди рд╕реБрд░рдХреНрд╖рд╛ рдХреНрд▓реЙрдЬ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИ; рдЕрдЧрд░ [T; N] рдХреА рдХреНрд╖рдорддрд╛ рдУрд╡рд░рдлреНрд▓реЛ рд╣реЛ рдЬрд╛рдПрдЧреА, рддреЛ рдпрд╣ _fit_ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ рдХреЛ рд╣рдЯрд╛ рджреЗрдирд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╕реНрдЯрдо рдЖрд╡рдВрдЯрди рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдЬрдм рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдП рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд▓рд┐рдП Err рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВ, рддреЛ рдХрд┐рд╕реА рдХреЛ рди рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрддрдорд╛рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред allocatorsред

рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм Alloc::alloc_array(0) ?

рд╣рд╛рдБ рдХреНрд╖рдорд╛ рдХрд░реЗрдВред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╕реНрдЯрдо рдЖрд╡рдВрдЯрди рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдЬрдм рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд▓рд┐рдП Err рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВ, рддреЛ рдХрд┐рд╕реА рдХреЛ рди рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрддрдорд╛рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред allocatorsред

рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ, рд▓реЗрдХрд┐рди рд▓рд╛рдЧреВ рдХрд░рдиреЗ Alloc рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдПрдХ unsafe impl рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕реБрд░рдХреНрд╖рд╛ рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ https://github.com/rust-lang/rust/issues/32838#issuecomment -+рекрем,ренреж,репрей,релреирен ред

рдПрдХ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ API Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдпрд╛ Alloc рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред @ рдЬрдВрдЧ-рд▓рдВрдЧ / рдкрд░рд┐рд╡рд╛рдж, рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ https://github.com/rust-lang/rust/issues/42774 рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕реЗ рдЦреБрд▓рд╛ рд░рдЦрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ

рд╕рд░рд▓ рдкреГрд╖реНрдарднреВрдорд┐ рдкреНрд░рд╢реНрди: ZST рдХреЗ рд╕рд╛рде рд▓рдЪреАрд▓реЗрдкрди рдХреЗ рдкреАрдЫреЗ рдкреНрд░реЗрд░рдгрд╛ рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдПрдХ ZST рд╣реИ, рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрд╡рдВрдЯрди (рдПрдХ рд╕реНрдерд┐рд░ рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдФрд░ рдбреАрд▓рдХреНрд▓реЛрд▓реЗрд╢рди рджреЛрдиреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП:

  • рдпрд╣ рд╣рдореЗрд╢рд╛ ZSTs рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛ рддрдХ рд╣реИ, рдФрд░ рд╡реЗ ZST рдХреЗ рд▓рд┐рдП Err рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ
  • рдпрд╣ рд╣рдореЗрд╢рд╛ ZB рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП UB рд╣реИ, рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рд░ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИ
  • рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ alloc_inner рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдХреЙрд▓рд░реНрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ alloc рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рд╢реЙрд░реНрдЯ рд╕рд░реНрдХрд┐рдЯрд┐рдВрдЧ рдХрд░рддреА рд╣реИ; alloc рдХреЛ ZST рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди alloc_inner рдХреЛ ZST рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХреБрд▓реЗрдЯрд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ - рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ - рдХреНрд░рдо рдореЗрдВ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмреЙрдпрд▓рд░)

рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореМрдЬреВрджрд╛ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд▓рдЪреАрд▓рд╛рдкрди рд╣реИ?

рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореМрдЬреВрджрд╛ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд▓рдЪреАрд▓рд╛рдкрди рд╣реИ?

рдпрд╣ рдПрдХ рд╡реНрдпрд╛рдкрд╛рд░ рд╣реИред рддрд░реНрдХ рд╕реЗ, рдПрд▓реЛрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ ZST рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдЯ-рдЗрди рд╕рдорд░реНрдерди рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рдПрд▓реЛрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрдерд╛рд╕рдВрднрд╡ рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХреЗред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдПрд▓реЛрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдПрд▓реЛрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЛ рд╣рд░ рдПрдкреАрдЖрдИ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ ZST рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ ZST рдХреИрд╕реЗ рд╣реИрдВ (рдпрд╛ рдпрджрд┐ рдпрд╣ "рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░рд┐рднрд╛рд╖рд┐рдд" рд╣реИ) рд╕рдВрднрд╛рд▓рд╛ рд╣реИ рдпрд╣ рдмрддрд╛рдХрд░ рдПрдкреАрдЖрдИ рдХреЗ рдбреЙрдХреНрд╕ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИред

рд╕реА ++ рдПрд▓рд╛рдЯреЗрдЯрд░ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рди рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдФрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдерд╛, рдмрд▓реНрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдард┐рди рднреА рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдПрдкреАрдЖрдИ рдореЗрдВ рдХреИрд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ZST рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛, рдФрд░ рдХрдЪреНрдЪреА рдореЗрдореЛрд░реА рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ / рдбреАрд▓ рдХрд░рдирд╛ рджреЛ рдСрд░реНрдереЛрдЧреЛрдирд▓ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрд▓реЛрдХ рдЯреНрд░реЗрд▓ рдПрдкреАрдЖрдИ рдХреЛ рдХреЗрд╡рд▓ рд╕рдВрднрд╛рд▓ рдХрд░ рдирд╣реАрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдПрдмреЙрдХ рдЬреИрд╕реЗ рд▓рд┐рдмрд╕реНрдЯ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдЧреНрд░рд╣ рдкрд░ ZSTs, рдЬреИрд╕реЗ, рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдПрд▓реЛрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕реЗ рдмрд╛рд╣рд░ рд▓реЗ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рдЬрдм рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╢рд╛рдпрдж RFC рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ std :: heap рдореЗрдВ рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рд╕рдм рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ZST рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛, рдФрд░ рдХрдЪреНрдЪреА рдореЗрдореЛрд░реА рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ / рдбреАрд▓ рдХрд░рдирд╛ рджреЛ рдСрд░реНрдереЛрдЧреЛрдирд▓ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрд▓реЛрдХ рдЯреНрд░реЗрд▓ рдПрдкреАрдЖрдИ рдХреЛ рдХреЗрд╡рд▓ рд╕рдВрднрд╛рд▓ рдХрд░ рдирд╣реАрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдкреАрдЖрдИ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп ZSTs рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП? IMO, рдПрдХ "рдЕрд╕рдорд░реНрдерд┐рдд" рддреНрд░реБрдЯрд┐ рд░рдирдЯрд╛рдЗрдо рдХреЗ рджреМрд░рд╛рди рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЙрд▓рд░реНрд╕ рдХрд╛ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рдПрдХ рдХрдордмреИрдХ рдкрде рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдорд╛рдирдирд╛ тАЛтАЛрд╣реЛрдЧрд╛ рдХрд┐ ZST рд╡реИрд╕реЗ рднреА рдЕрд╕рдорд░реНрдерд┐рдд рд╣реИрдВред рдХреНрд▓реАрдирд░ рдХреЛ рдПрдкреАрдЖрдИ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдФрд░ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╡реЗ _never_ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред

рдХреНрдпрд╛ ZST рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП alloc рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдпрд╛ рд╕рд┐рд░реНрдл if size_of::<T>() == 0 рдЪреЗрдХ?

рдХреНрдпрд╛ ZST рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП alloc рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдпрд╛ рд╕рд┐рд░реНрдл if size_of::<T>() == 0 рдЪреЗрдХ?

рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП; рдЙрдкрдпреБрдХреНрдд рдХреЛрдб рдкрде рдХреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдкреАрдЖрдИ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп ZSTs рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП?

рдореЗрд░реЗ рд▓рд┐рдП, рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдзрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдХреЗ рдЖрд╡рдВрдЯрди рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рддреЛ Alloc рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ Layout рдЙрдиреНрд╣реЗрдВ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдПрдХ рдЕрдиреНрдп Safety рдХреНрд▓реЙрдЬ рдХреЛ рд╕рднреА Alloc рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдпрджрд┐ Layout рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдо рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ Layout s рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ Alloc рдХреЛ рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдХреЗ рдЖрд╡рдВрдЯрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдХрд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ рдбрд╛рдЙрдирд╕рд╛рдЗрдб рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, HashMap рдЬреИрд╕реЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ Layout рдХрдИ Layout s рд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЬрдмрдХрд┐ рдЕрдВрддрд┐рдо Layout рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдордзреНрдпрд╡рд░реНрддреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ HashSet )ред рддреЛ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП "рдХреБрдЫ рдФрд░" (рдЬреИрд╕реЗ LayoutBuilder рдкреНрд░рдХрд╛рд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЕрдкрдиреЗ рдЕрдВрддрд┐рдо Layout s рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ "рдЧреИрд░-рд╢реВрдиреНрдп-рдЖрдХрд╛рд░" рдЪреЗрдХ (рдпрд╛ рдЙрдкрдпреЛрдЧ) рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдПрдХ _unchecked ) рд╡рд┐рдзрд┐ рдЬрдм рдореЗрдВ рдХрдирд╡рд░реНрдЯ Layout ред

рдХреНрдпрд╛ ZST рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдпрд╛ рдмрд╕ рдЕрдЧрд░ size_of ::() == 0 рдЪреЗрдХ?

рд╣рдо рдЕрднреА рддрдХ ZST рдкрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЕрднреА рд╕рднреА рдХреЛрдб size_of::<T>() == 0 ред

рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдПрдХ рдЕрдиреНрдп Safety рдХреНрд▓реЙрдЬ рдХреЛ рд╕рднреА Alloc рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдпрджрд┐ Layout рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред

рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рдВрдХрд▓рди-рд╕рдордп рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ debug_assert рдХрд┐ рд▓реЗрдЖрдЙрдЯ рдЧреИрд░-рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рд╣реИ, 99% рдмрдЧреНрд╕ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВрдиреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдкрд░ рдХреЛрдИ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЦреЗрдж рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдХрд╛рдордирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдЙрд╕рдХреЗ рдЖрд╡рдВрдЯрди рдХреЗ рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛред рдЗрд╕рдореЗрдВ рдЖрд╡рдВрдЯрди рдбрд┐рдЬрд╛рдЗрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рддрдм рд╢рд╛рдпрдж рд╣рдорд╛рд░реЗ рдкрд╛рд╕ C ++ рдХреЗ рд╕рдорд╛рди рд╣реА рдореБрджреНрджреЗ рд╣реЛрдВрдЧреЗ рдФрд░ рдпрд╣ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдПрдкреАрдЖрдИ рд╣реИред

рд▓реЗрдХрд┐рди рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдХрд╛рдордирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдЙрд╕рдХреЗ рдЖрд╡рдВрдЯрди рдХреЗ рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛред рдЯреА

рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?

@gnzblg @brson рдЖрдЬ рдореЗрд░реЗ рдкрд╛рд╕ рдЬрд╛рдирдиреЗ рдпреЛрдЧреНрдп рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдпреЛрдЧреНрдп _ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдерд╛ред

рдореИрдВ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬрд┐рд╕реЗ рддреАрди рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдПрдХ рдзрд╛рдЧрд╛ рд╕реНрдерд╛рдиреАрдп рдПрдХ, рдПрдХ рддрд╛рд▓реЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ, рдФрд░ рдПрдХ рдХреЙрд░рдЯрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд┐ рдореИрдВ рдПрдХ рдХреЛрд░рдЯрд╛рдЗрди рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдбрд╛рдпрдирд╛рдорд┐рдХ рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ рдХреА рд░рд╛рд╢рд┐ (рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ, рддреГрддреАрдп рдкрдХреНрд╖ рдХреЛрдб рдореЗрдВ) *ред

рд╕рдВрднрд╡рддрдГ рдпрд╣ рдЬрд╛рдирдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдПрдХ рдРрд╕рд╛ рдореВрд▓реНрдп рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдХрд┐ рдереНрд░реЗрдбреНрд╕ (рдЬреИрд╕реЗ рдЖрд░реНрдХ) рдмрдирд╛рдо рдПрдХ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрд╛ рдпрд╣ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рд╣реИред рдлрд┐рд▓рд╣рд╛рд▓ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реНрд╡рд┐рдЪ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдЖрд╡рдВрдЯрди рдХрд░рдирд╛ рд╣реИ (realloc рдпрд╛ рдореБрдлреНрдд рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ; рд╣рдо рд╕рд┐рд░реНрдл рдЙрд╕рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдПрдбреНрд░реЗрд╕ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ)ред

* [рдпрд╣ рднреА рдореБрдЭреЗ NUMA рд╕реНрдерд╛рдиреАрдп рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рднреА рд╕рдВрднрд╡ рд╣реЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд▓реЙрдХрд┐рдВрдЧ рдХреЗ, рдФрд░, рдХреБрд▓ рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ рдХреЛ рдХреИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 1 рдХреЛрд░ 1 рдереНрд░реЗрдб рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде]ред

@raphaelcohn

рдореИрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА (рдпрд╛) GlobalAlloc trait рдкрд░ рд▓рд╛рдЧреВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ Alloc trait рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ рдЬреЛ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреА рд╣реИрдВ (рдЬреИрд╕реЗ alloc_array<T>(1) рдПрдХ рдПрдХрд▓ T alloc_array<T>(1) рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ T рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрд╡рдВрдЯрди рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╕рдордп рдкреНрд░рдХрд╛рд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЖрд╡рдВрдЯрди рдХреЛ рджреЗрдЦреЗрдВ рдЬреЛ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рддрд░реНрдХ рдирд╣реАрдВ рд╕реБрдирд╛ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдмрд╕ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдПрдкреАрдЖрдИ, рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдиреЗ рдХрд╛ рд╡рд┐рд░реЛрдз рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рдирдирд╛ рднреА рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдХрд┐ Alloc рд╕реЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬ рдХреЛ рдЖрдк рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЛ рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред

AFAICT, рдЙрд╕ рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рджрд┐рд▓рдЪрд╕реНрдк рдкреНрд░рдХрд╛рд░ Box рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реАрдзреЗ T рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИред рдХрд╛рдлреА рдореЗрдВ рдЕрдиреНрдп рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ std рдПрдХ рдЖрд╡рдВрдЯрд┐рдд рдХрднреА рдирд╣реАрдВ T , рд▓реЗрдХрд┐рди рдХреБрдЫ рдирд┐рдЬреА рдЖрдВрддрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдХрд┐ рдЕрдкрдиреЗ рд╕рдВрднрд╛рдЬрдХ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдкрддрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Rc рдФрд░ Arc (InternalRefCounts, T) , List / BTreeSet рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ / Vec / Deque / ... T s рдХреА рд╕рд░рдгрд┐рдпрд╛рдБ рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди T s рд╕реНрд╡рдпрдВ, рдЖрджрд┐ рдирд╣реАрдВред

Box рдФрд░ Vec рд╣рдо рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрдд рддрд░реАрдХреЛрдВ рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ BoxAlloc рдФрд░ ArrayAlloc рдХрдВрдмрд▓ рдХреЗ рд╕рд╛рде Alloc рд▓рд┐рдП рдирд┐рд╣рд┐рддрд╛рд░реНрде - рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдпрджрд┐ рд╡реЗ рдХрднреА рднреА рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд╣рдорд▓рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВ, рдЕрдкрд╣рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рдЬреНрдЮред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ MyAllocBox рдФрд░ MyAllocVec рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЬреЛ рдЖрдкрдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдк рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рджреЛрд╣рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ?

рдЬреИрд╕рд╛ рдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдбрдмреНрд▓реНрдпреВрдЬреА рдХреЗ рд▓рд┐рдП рдПрдХ

рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд @TimDiekmann! рдореИрдВ рдЙрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЪрд░реНрдЪрд╛ рд╕реВрддреНрд░ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдЗрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред

рдпрд╣ рдЕрднреА рднреА рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ #[unstable] рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрд┐рдВрджреБ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рддрдм рддрдХ рдмрдВрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕реНрдерд┐рд░ рдпрд╛ рдкрджрд╛рд╡рдирдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред (рдпрд╛ рд╣рдо рдХрд┐рд╕реА рднрд┐рдиреНрди рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред)

рдЧрд┐рдЯ рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рд╣рд╛рдБ рдЕрд╕реНрдерд┐рд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЦреБрд▓рд╛ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдорд╛рдирд╛ред рдУрдкреА рдХреЛ рдПрдХ рдиреЛрдЯрд┐рд╕ рдФрд░ рд▓рд┐рдВрдХ рднреА рдЬреЛрдбрд╝рд╛ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

cuviper picture cuviper  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

wthrowe picture wthrowe  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

pedrohjordao picture pedrohjordao  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tikue picture tikue  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

SharplEr picture SharplEr  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ