ð¢ãã®æ©èœã«ã¯å°çšã®ã¯ãŒãã³ã°ã°ã«ãŒãããããŸããã³ã¡ã³ããæžå¿µäºé ãã¯ãŒãã³ã°ã°ã«ãŒãã®ãªããžããªã«éä¿¡ããŠãã ããã
å ã®æçš¿ïŒ
FCPã®ææ¡ïŒ https ïŒ
FCPãã§ãã¯ããã¯ã¹ïŒ https ïŒ
rust-lang / rfcsïŒ1398ããã³std::heap
ã¢ãžã¥ãŒã«ã®è¿œè·¡ã®åé¡ã
struct Layout
ã trait Allocator
ãããã³alloc
ã¯ã¬ãŒãã®ããã©ã«ãå®è£
ïŒhttps://github.com/rust-lang/rust/pull/42313ïŒalloc
ã¯ã¬ãŒãã«äŸåããŸããã Layout
/ Allocator
ã¯libcore
ãŸã...ïŒ ïŒhttps://github.com/rust-lang/rust/pull/42313ïŒLayout
ã§ïŒå¿
èŠã«å¿ããŠoverflowing_addãšoverflowing_mulã«åãæ¿ããå¯èœæ§ããããŸãïŒãrealloc_in_place
ãgrow_in_place
ãšshrink_in_place
ã«çœ®ãæãããã©ããã決å®ããŸãïŒã³ã¡ã³ãïŒïŒhttps://github.com/rust-lang/rust/pull/42313ïŒfn dealloc
æäŸãããã¢ã©ã€ã¡ã³ãã®èŠä»¶ã決å®ããŸãã ïŒã¢ãã±ãŒã¿ãŒrfcãšã°ããŒãã«ã¢ãã±ãŒã¿ãŒrfcããã³ãã¬ã€ãAlloc
PRã«é¢ãã説æãåç
§ããŠãã ãããïŒalign
ãå²ãåœãŠè§£é€ããå¿
èŠããããŸããïŒ jemallocã®ãããªã¢ãã±ãŒã¿ãŒã¯ãããå¿
èŠãšããªããšããæžå¿µãæèµ·ãããŠããããããå¿
èŠãšããã¢ãã±ãŒã¿ãŒãæ³åããããšã¯å°é£ã§ãã ïŒããå€ãã®è°è«ïŒã @ruudaãš@rkruppeã¯ããããŸã§ã®ãšããæãå€ãã®èããæã£ãŠããããã«èŠããŸããAllocErr
ãError
ã«ããå¿
èŠããããŸããïŒ ïŒã³ã¡ã³ãïŒusable_size
ããžãã¹ã§ã¯ãããšãã°ã (size, align)
å²ãåœãŠãå Žåã size...usable_size(size, align)
ç¯å²ã®ã©ããã®ãµã€ãºã§å²ãåœãŠã解é€ããå¿
èŠãããããšãèš±å¯ãããå ŽåããããŸãã jemallocã¯ããã§å®å
šã«åé¡ãªãããã§ãïŒå²ãåœãŠãæ£ç¢ºãªsize
å²ãåœãŠã解é€ããå¿
èŠã¯ãããŸããïŒãããã«ããã Vec
ãéå°ãªå®¹éã®jemallocãèªç¶ã«å©çšã§ããããã«ãªããŸããå²ãåœãŠãè¡ããšãã«ãããäžããŸãã ïŒå®éã«ãããè¡ãããšããã®æ±ºå®ã«ããããçŽäº€ããŠããŸãããç§ãã¡ã¯Vec
æš©éãäžããŠããã ãã§ãïŒã ãããŸã§ã®ãšããã @ Gankroã¯ãã@alexcrichtonã¯ããé©åãã®å®çŸ©ã«ãããããã¯https://github.com/rust-lang/rust/pull/42313ã§è§£æ±ºããããšèããŠããŸãïŒalloc_system
ã¯ã巚倧ãªé
眮ã§ãã°ããããŸãïŒããšãã°ã 1 << 32
ïŒ https://github.com/rust-lang/rust/issues/30170ïŒ43217Layout
ã¯fn stride(&self)
ã¡ãœãããæäŸããå¿
èŠããããŸããïŒ ïŒhttps://github.com/rust-lang/rfcs/issues/1397ãhttps://github.com/rust-lang/rust/issues/17027ãåç
§ããŠãã ããïŒAllocator::owns
ïŒ https://github.com/rust-lang/rust/issues/44302https://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 {
// ...
}
æ®å¿µãªãããRFCã®è°è«ã§ããã«ã€ããŠèšåããã®ã«ååãªæ³šæãæã£ãŠããŸããã§ãããã realloc_in_place
ã2ã€ã®é¢æ°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
æ¹åããããšã ãã§ãã ãã ãã usable_size
ã«å¯Ÿãããã§ãã¯ã¯åŒãç¶ãå®è¡ããããããããã©ã«ãã®ããã©ãŒãã³ã¹realloc
ã¯åœ±é¿ãåããŸããã
å¥ã®åé¡ïŒ fn realloc_in_place
ã®ããã¥ã¡ã³ãã«ã¯ãOkãè¿ãããå Žåã ptr
new_layout
ãé©åãããããšãä¿èšŒãããŠãããšæžãããŠããŸãã
ç§ã«ãšã£ãŠããã¯ãæå®ãããã¢ãã¬ã¹ã®é
眮ãnew_layout
ã«ãã£ãŠæ瀺ãããå¶çŽãšäžèŽããããšã確èªããå¿
èŠãããããšãæå³ããŸãã
ãã ããåºã«ãªãfn reallocate_inplace
é¢æ°ã®ä»æ§ã¯ã_it_ããã®ãããªãã§ãã¯ãå®è¡ããããšãæå³ãããšã¯æããŸããã
fn realloc_in_place
䜿çšã«é£ã³èŸŒãã ã¯ã©ã€ã¢ã³ãã¯ãããèªäœãã¢ã©ã€ã¡ã³ããæ©èœããããšãä¿èšŒããã®ã劥åœã ãšæãããŸãïŒå®éã«ã¯ãç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ã©ãã§ãåãã¢ã©ã€ã¡ã³ããå¿
èŠã«ãªããšæããŸã...ïŒããã§ã fn realloc_in_place
ã®å®è£
ã¯ãäžããããptr
ãnew_layout
ãšäºææ§ãããããšã確èªããããšã§æ¬åœã«è² æ
ããããããã¹ãã§ããããïŒ ïŒãã®å Žåã¯ïŒãã®èŠä»¶ãåŒã³åºãå
ã«ããã·ã¥ããã¯ããæ¹ãããããè¯ãã§ããã...
@gereeterããªãã¯è¯ãç¹ãäœããŸãã åé¡ã®èª¬æã«èç©ããŠãããã§ãã¯ãªã¹ãã«ããããè¿œå ããŸãã
ïŒãã®æç¹ã§ã #[may_dangle]
ãµããŒããé»è»ã«ä¹ã£ãŠbeta
ãã£ãã«ã«å
¥ãã®ãåŸ
ã£ãŠããŸããããã«ãããã¢ãã±ãŒã¿ãŒçµ±åã®äžéšãšããŠstdã³ã¬ã¯ã·ã§ã³ã«äœ¿çšã§ããããã«ãªããŸãïŒ
ç§ã¯RustãåããŠäœ¿çšããã®ã§ããããä»ã®å Žæã§è°è«ãããŠããå Žåã¯ã容赊ãã ããã
ãªããžã§ã¯ãåºæã®ã¢ãã±ãŒã¿ããµããŒãããæ¹æ³ã«ã€ããŠäœãèãã¯ãããŸããïŒ ã¹ã©ãã¢ãã±ãŒã¿ããã¬ãžã³ã¢ãã±ãŒã¿ãªã©ã®äžéšã®ã¢ãã±ãŒã¿ã¯ç¹å®ã®ã¿ã€ãã«ãã€ã³ããããæ°ãããªããžã§ã¯ãã®æ§ç¯ãã解æŸããããæ§ç¯ãªããžã§ã¯ãã®ãã£ãã·ã¥ïŒå®éã«åé€ããã®ã§ã¯ãªãïŒãæ§ç¯æžã¿ã®ãã£ãã·ã¥ãªããžã§ã¯ãã®è¿åŽãããã³å¿ èŠã«å¿ããŠãåºã«ãªãã¡ã¢ãªãåºã«ãªãã¢ãã±ãŒã¿ã«è§£æŸããåã«ãªããžã§ã¯ããããããããŸãã
çŸåšããã®ææ¡ã«ã¯ObjectAllocator<T>
ã«æ²¿ã£ããã®ã¯äœãå«ãŸããŠããŸããããéåžžã«åœ¹ç«ã¡ãŸãã ç¹ã«ãç§ã¯ãã¬ãžã³ã¢ãã±ãŒã¿ãŒãªããžã§ã¯ããã£ãã·ã³ã°ã¬ã€ã€ãŒïŒäžèšã®ãªã³ã¯ïŒã®å®è£
ã«åãââçµãã§ããŸãããããã¯Allocator
ãã©ããããŠããã£ãã·ã³ã°ã§ãªããžã§ã¯ããæ§ç¯ããã³ããããããäœæ¥ã®ã¿ãè¡ãããšãã§ããŸãã¬ã€ã€ãŒèªäœãããã§ä»ã®ãªããžã§ã¯ãã¢ãã±ãŒã¿ãŒïŒã¹ã©ãã¢ãã±ãŒã¿ãŒãªã©ïŒãã©ããããŠãæ¬åœã«æ±çšã®ãã£ãã·ã³ã°ã¬ã€ã€ãŒã«ããããšãã§ããã°çŽ æŽããããšæããŸãã
ãªããžã§ã¯ãã¢ãã±ãŒã¿ã®ã¿ã€ããŸãã¯ç¹æ§ã¯ããã®ææ¡ã®ã©ãã«åœãŠã¯ãŸããŸããïŒ ããã¯å°æ¥ã®RFCã®ããã«æ®ãããŸããïŒ ä»ã«äœããããŸããïŒ
ããã«ã€ããŠã¯ãŸã è°è«ãããŠããªããšæããŸãã
ç¬èªã®ObjectAllocator<T>
èšè¿°ããŠããã impl<T: Allocator, U> ObjectAllocator<U> for T { .. }
ãå®è¡ãããšããã¹ãŠã®éåžžã®ã¢ãã±ãŒã¿ãŒããã¹ãŠã®ãªããžã§ã¯ãã®ãªããžã§ã¯ãåºæã®ã¢ãã±ãŒã¿ãŒãšããŠæ©èœã§ããããã«ãªããŸãã
å°æ¥ã®äœæ¥ã¯ãåçŽãªole 'ïŒæ±çšïŒã¢ãã±ãŒã¿ãŒã§ã¯ãªããããŒãã«ç¹æ§ã䜿çšããããã«ã³ã¬ã¯ã·ã§ã³ãå€æŽããããšã§ãã
@pnkfelix
ïŒãã®æç¹ã§ãïŒ[may_dangle]ãµããŒããåè»ãããŒã¿ãã£ãã«ã«ä¹ããã®ãåŸ ã£ãŠããŸããããã«ãããã¢ãã±ãŒã¿ãŒçµ±åã®äžéšãšããŠstdã³ã¬ã¯ã·ã§ã³ã«äœ¿çšã§ããããã«ãªããŸãïŒ
ç§ã¯ãããèµ·ãã£ããšæããŸããïŒ
@ Ericson2314ãããèªåã§æžãããšã¯å®éšç®çã®ãªãã·ã§ã³ã§ãããçžäºéçšæ§ã®èŠ³ç¹ããæšæºåããæ¹ãã¯ããã«ã¡ãªããããããšæããŸãïŒããšãã°ãã¹ã©ãã¢ãã±ãŒã¿ãŒãå®è£
ããäºå®ã§ãããç§ã®ã³ãŒãã®ãµãŒãããŒãã£ãŠãŒã¶ãŒãç§ã®éèªã®ãã£ãã·ã¥ã¬ã€ã€ãŒã§èª°ã_else's_ã¹ã©ãã¢ãã±ãŒã¿ãŒã䜿çšã§ããã°çŽ æŽãããã§ãïŒã ç§ã®è³ªåã¯ãåã«ObjectAllocator<T>
ç¹æ§ãŸãã¯ãã®ãããªãã®ãè°è«ãã䟡å€ããããã©ããã§ãã å¥ã®RFCã«æé©ãªããã§ããïŒ ç§ã¯ãåäžã®RFCã«ã©ãã ãå±ãããããããŠãã€å¥ã
ã®RFCã«å±ãããã«ã€ããŠã®ã¬ã€ãã©ã€ã³ã«ããŸã粟éããŠããŸãã...
@joshlf
ãªããžã§ã¯ãã¢ãã±ãŒã¿ã®ã¿ã€ããŸãã¯ç¹æ§ã¯ããã®ææ¡ã®ã©ãã«åœãŠã¯ãŸããŸããïŒ ããã¯å°æ¥ã®RFCã®ããã«æ®ãããŸããïŒ ä»ã«äœããããŸããïŒ
ã¯ããããã¯å¥ã®RFCã«ãªããŸãã
ç§ã¯ãåäžã®RFCã«ã©ãã ãå±ãããããããŠãã€å¥ã ã®RFCã«å±ãããã«ã€ããŠã®ã¬ã€ãã©ã€ã³ã«ããŸã粟éããŠããŸãã...
ããã¯RFCèªäœã®ç¯å²ã«äŸåããŸããRFCèªäœã¯ãããæžãã人ã«ãã£ãŠæ±ºå®ããããã£ãŒãããã¯ã¯å šå¡ããäžããããŸãã
ãããå®éã«ã¯ãããã¯ãã§ã«åãå ¥ããããŠãããã®RFCã®è¿œè·¡ã®åé¡ã§ãããããæ¡åŒµæ©èœãèšèšå€æŽã«ã€ããŠèããããšã¯ããã®ã¹ã¬ããã«ã¯åœãŠã¯ãŸããŸããã RFCãªããžããªã§æ°ãããã®ãéãå¿ èŠããããŸãã
@joshlfããã ObjectAllocator<T>
ã¯ç¹æ§ã ãšæã£ãŠããŸããã ç§ã¯ãç¹å®ã®ã¢ãã±ãŒã¿ãŒã§ã¯ãªããç¹æ§ã®ãããã¿ã€ããäœæããããšãæå³ããŸããã ã¯ãã @ steveklabnikãèšãããã«ããã®ç¹æ§ã¯ç¬èªã®RFCã«
@steveklabnikããä»ã®è°è«ã¯ä»ã®å Žæã§ããè¯ãã§ãããã ãããã @ joshlfã¯ãåãå ¥ããããŠãããå®è£ ãããŠããªãAPIèšèšã®ãããŸã§äºæããŠããªãã£ãæ¬ é¥ãæããã«ããªãããã«ããã®åé¡ãæèµ·ããŠããŸããã ãã®æå³ã§ãããã¯ãã®ã¹ã¬ããã®ä»¥åã®æçš¿ãšäžèŽããŸãã
@ Ericson2314ããããããããªãã®æå³ããããšã ãšæããŸããã ç§ãã¡ã¯åãããŒãžã«ãããšæããŸã:)
@steveklabnikããã§ããã èªåã®å®è£ ãããã£ãŠãRFCãæåºããã®ã¯ããããè¯ãèãã®ããã«æããå Žåã§ãã
@joshlfã«ã¹ã¿ã ã¢ãã±ãŒã¿ãã³ã³ãã€ã©ãŸãã¯æšæºã©ã€ãã©ãªã«å ¥ãçç±ã¯äœããããŸããã ãã®RFCããªãªãŒã¹ããããšãä»»æã®çš®é¡ã®å²ãåœãŠãè¡ãç¬èªã®ã¯ã¬ãŒããç°¡åã«å ¬éã§ããŸãïŒjemallocã®ãããªæ¬æ Œçãªã¢ãã±ãŒã¿ãŒã§ããã«ã¹ã¿ã å®è£ ã§ããŸãïŒïŒã
@alexregããã¯ãç¹å®ã®ã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒã«é¢ãããã®ã§ã¯ãªããç¹å®ã®ã¿ã€ãã§ãã©ã¡ããªãã¯ã§ãããã¹ãŠã®ã¢ãã±ãŒã¿ãŒã®ã¿ã€ããæå®ããç¹æ§ã§ãã ãããã£ãŠãRFC 1398ãäœã¬ãã«ã®ã¢ãã±ãŒã¿ãŒã®ã¿ã€ãã§ãããã¬ã€ãïŒ Allocator
ïŒãå®çŸ©ããã®ãšåãããã«ãã¢ãã±ãŒã¿ãŒã®ã¿ã€ãã§ãããã¬ã€ãïŒ ObjectAllocator<T>
ïŒã«ã€ããŠè³ªåããŠããŸããã¿ã€ãT
ãªããžã§ã¯ããå²ãåœãŠ/å²ãåœãŠè§£é€ããã³æ§ç¯/ããããã§ããŸãã
@alexregã«ã¹ã¿ã ãªããžã§ã¯ãåºæã®ã¢ãã±ãŒã¿ã§æšæºã©ã€ãã©ãªã³ã¬ã¯ã·ã§ã³ã䜿çšããããšã«ã€ããŠã®ç§ã®åæã®ãã€ã³ããåç §ããŠãã ããã
ãã¡ããã§ããããããæšæºã©ã€ãã©ãªã«å±ããââãã©ããã¯ããããŸããã æ©èœæ§ã䜿ãããããæãªãããšãªããç°¡åã«å¥ã®ã¯ã¬ãŒãã«å ¥ãããšãã§ããŸãã
2017幎1æ4æ¥ã«ã¯ãååŸ9æ59åã§ããžã§ã·ã¥ã¢Liebow-Feeser [email protected]æžããŸããïŒ
@alexreg https://github.com/alexregããã¯ãç¹å®ã®ã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒã«é¢ãããã®ã§ã¯ãªããç¹å®ã®ã¿ã€ãã§ãã©ã¡ããªãã¯ã§ãããã¹ãŠã®ã¢ãã±ãŒã¿ãŒã®ã¿ã€ããæå®ããç¹æ§ã§ãã ãããã£ãŠãRFC 1398ãäœã¬ãã«ã®ã¢ãã±ãŒã¿ãŒã®ã¿ã€ãã§ãããã¬ã€ãïŒã¢ãã±ãŒã¿ãŒïŒãå®çŸ©ããŠããããã«ãç§ã¯ãã¬ã€ãïŒObjectAllocatorïŒã«ã€ããŠè³ªåããŠããŸãã
ïŒããã¯ãã¿ã€ãTã®ãªããžã§ã¯ããå²ãåœãŠ/å²ãåœãŠè§£é€ããã³æ§ç¯/ããããã§ããã¢ãã±ãŒã¿ã®ã¿ã€ãã§ãã â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHub https://github.com/rust-lang/rust/issues/32838#issuecomment-270499064ã§è¡šç€ºããããã¹ã¬ããããã¥ãŒãããŸãhttps://github.com/notifications/unsubscribe-auth/ AAEF3IhyyPhFgu1EGHr_GM_Evsr0SRzIks5rPBZGgaJpZM4IDYUN ã
ä»»æã®ã«ã¹ã¿ã ã¢ãã±ãŒã¿ã§æšæºã©ã€ãã©ãªã³ã¬ã¯ã·ã§ã³ïŒããŒãã«å²ãåœãŠãããå€ïŒã䜿çšããããšæããŸãã ã€ãŸãããªããžã§ã¯ãåºæã®ãã®ã«éå®ãããŸããã
2017幎1æ4æ¥ã«ã¯ãååŸ10æ01ã§ããžã§ã³ã»ãšãªã¯ãœã³ã®[email protected]ã¯æžããŸããïŒ
@alexreghttps ïŒ//github.com/alexregã«ã¹ã¿ã ãªããžã§ã¯ãåºæã®ã¢ãã±ãŒã¿ãŒã§æšæºã©ã€ãã©ãªã³ã¬ã¯ã·ã§ã³ã䜿çšããããšã«ã€ããŠã®ç§ã®åæã®ãã€ã³ããåç §ããŠ
â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHub https://github.com/rust-lang/rust/issues/32838#issuecomment-270499628ã§è¡šç€ºããããã¹ã¬ããããã¥ãŒãããŠãã ããhttps://github.com/notifications/unsubscribe-auth/ AAEF3CrjYIXqcv8Aqvb4VTyPcajJozICks5rPBbOgaJpZM4IDYUN ã
ãã¡ããã§ããããããæšæºã©ã€ãã©ãªã«å±ããââãã©ããã¯ããããŸããã æ©èœæ§ã䜿ãããããæãªãããšãªããç°¡åã«å¥ã®ã¯ã¬ãŒãã«å ¥ãããšãã§ããŸãã
ã¯ãããã ããæšæºã©ã€ãã©ãªã®æ©èœã«äŸåããããå ŽåããããŸãïŒ @ Ericson2314ãææ¡ãããã®ãªã©ïŒã
ä»»æã®ã«ã¹ã¿ã ã¢ãã±ãŒã¿ã§æšæºã©ã€ãã©ãªã³ã¬ã¯ã·ã§ã³ïŒããŒãã«å²ãåœãŠãããå€ïŒã䜿çšããããšæããŸãã ã€ãŸãããªããžã§ã¯ãåºæã®ãã®ã«éå®ãããŸããã
çæ³çã«ã¯ãäž¡æ¹ã®ã¿ã€ãã®ã¢ãã±ãŒã¿ãŒãåãå ¥ããå¿ èŠããããŸãã ãªããžã§ã¯ãåºæã®ãã£ãã·ã¥ã䜿çšããããšã«ã¯ãéåžžã«å€§ããªå©ç¹ããããŸãã ããšãã°ãã¹ã©ãã®å²ãåœãŠãšãã¬ãžã³ã®ãã£ãã·ã¥ã®äž¡æ¹ã§ãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸããèå³ãããå Žåã¯ãäžèšã®ãªã³ã¯å ã®è«æãã芧ãã ããã
ãããããªããžã§ã¯ãã¢ãã±ãŒã¿ãŒãã¬ã€ãã¯ãåã«äžè¬çãªã¢ãã±ãŒã¿ãŒãã¬ã€ãã®ãµããã¬ã€ãã§ããå¯èœæ§ããããŸãã ç§ã«é¢ããéããããã¯ãããšåããããç°¡åã§ãã 確ãã«ãç¹å®ã®ã¿ã€ãã®ã¢ãã±ãŒã¿ãŒã¯æ±çšã¢ãã±ãŒã¿ãŒãããå¹ççã§ãããã³ã³ãã€ã©ãŒãæšæºãããã«ã€ããŠå®éã«ç¥ãå¿ èŠã¯ãããŸããïŒãŸãã¯å®éã«ç¥ãå¿ èŠããããŸãïŒã
2017幎1æ4æ¥ã«ã¯ã22ïŒ13ã§ããžã§ã·ã¥ã¢Liebow-Feeser [email protected]æžããŸããïŒ
ãã¡ããã§ããããããæšæºã©ã€ãã©ãªã«å±ããââãã©ããã¯ããããŸããã æ©èœæ§ã䜿ãããããæãªãããšãªããç°¡åã«å¥ã®ã¯ã¬ãŒãã«å ¥ãããšãã§ããŸãã
ã¯ãããã ããæšæºã©ã€ãã©ãªã®æ©èœã«äŸåããããå ŽåããããŸãïŒ @ Ericson2314 https://github.com/Ericson2314ã®ææ¡ãªã©ïŒã
æšæºã©ã€ãã©ãªã³ã¬ã¯ã·ã§ã³ïŒããŒãã«å²ãåœãŠãããå€ïŒãä»»æã®ã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒã§äœ¿çšããããšæããŸãã ã€ãŸãããªããžã§ã¯ãåºæã®ãã®ã«éå®ãããŸããã
çæ³çã«ã¯ãäž¡æ¹ã®ã¿ã€ãã®ã¢ãã±ãŒã¿ãŒãåãå ¥ããå¿ èŠããããŸãã ãªããžã§ã¯ãåºæã®ãã£ãã·ã¥ã䜿çšããããšã«ã¯ãéåžžã«å€§ããªå©ç¹ããããŸãã ããšãã°ãã¹ã©ãã®å²ãåœãŠãšãã¬ãžã³ã®ãã£ãã·ã¥ã®äž¡æ¹ã§ãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸããèå³ãããå Žåã¯ãäžèšã®ãªã³ã¯å ã®è«æãã芧ãã ããã
â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHub https://github.com/rust-lang/rust/issues/32838#issuecomment-270502231ã§è¡šç€ºããããã¹ã¬ããããã¥ãŒãããŸãhttps://github.com/notifications/unsubscribe-auth/ AAEF3L9F9r_0T5evOtt7Es92vw6gBxR9ks5rPBl9gaJpZM4IDYUN ã
ãããããªããžã§ã¯ãã¢ãã±ãŒã¿ãŒãã¬ã€ãã¯ãåã«äžè¬çãªã¢ãã±ãŒã¿ãŒãã¬ã€ãã®ãµããã¬ã€ãã§ããå¯èœæ§ããããŸãã ç§ã«é¢ããéããããã¯ãããšåããããç°¡åã§ãã 確ãã«ãç¹å®ã®ã¿ã€ãã®ã¢ãã±ãŒã¿ãŒã¯æ±çšã¢ãã±ãŒã¿ãŒãããå¹ççã§ãããã³ã³ãã€ã©ãŒãæšæºãããã«ã€ããŠå®éã«ç¥ãå¿ èŠã¯ãããŸããïŒãŸãã¯å®éã«ç¥ãå¿ èŠããããŸãïŒã
ãããåé¡ã¯ã»ãã³ãã£ã¯ã¹ãç°ãªãããšã§ãã Allocator
ã¯ãçã®ãã€ãBLOBãå²ãåœãŠãŠè§£æŸããŸãã äžæ¹ã ObjectAllocator<T>
ããã§ã«æ§ç¯ããããªããžã§ã¯ããå²ãåœãŠããããã®ãªããžã§ã¯ããåé€ãã圹å²ãæãããŸãïŒæ°ããå²ãåœãŠããããªããžã§ã¯ããæ§ç¯ããããã«åŸã§é
åžãããå¯èœæ§ã®ããæ§ç¯ããããªããžã§ã¯ãããã£ãã·ã¥ã§ããããšãå«ãïŒ ãããã¯é«äŸ¡ã§ãïŒã ç¹æ§ã¯æ¬¡ã®ããã«ãªããŸãã
trait ObjectAllocator<T> {
fn alloc() -> T;
fn free(t T);
}
ããã¯Allocator
ãšäºææ§ããããŸããããã®ã¡ãœããã¯ãçã®ãã€ã³ã¿ãŒãåŠçããåã®æŠå¿µããããŸããã ããã«ã Allocator
ã®å Žåãæåã«è§£æŸããããªããžã§ã¯ããdrop
ããã®ã¯åŒã³åºãå
ã®è²¬ä»»ã§ãã ããã¯éåžžã«éèŠã§ã-ã¿ã€ãT
ç¥ã£ãŠãããšã ObjectAllocator<T>
ã¯T
ã®drop
ã¡ãœãããåŒã³åºããªã©ã®ããšãã§ããŸãã free(t)
ã¯t
ãfree
ã«ç§»åããåŒã³åºãå
ã¯æåã«t
ããããã§ããŸãã-代ããã«ObjectAllocator<T>
ã®è²¬ä»»ã§ãã åºæ¬çã«ãããã2ã€ã®ç¹æ§ã¯äºãã«äºææ§ããããŸããã
ããããªãã»ã©ã ãã®ææ¡ã«ã¯ãã§ã«ãã®ãããªãã®ãã€ãŸããã€ãã¬ãã«ã®ãäžäœã¬ãã«ãã®ã¢ãã±ãŒã¿ãå«ãŸããŠãããšæããŸããã ãã®å Žåãå®å šã«å ¬æ£ãªææ¡ã§ãïŒ
2017幎1æ4æ¥ã«ã¯ãååŸ09æ29åã§ããžã§ã·ã¥ã¢Liebow-Feeser [email protected]æžããŸããïŒ
ãããããªããžã§ã¯ãã¢ãã±ãŒã¿ãŒãã¬ã€ãã¯ãåã«äžè¬çãªã¢ãã±ãŒã¿ãŒãã¬ã€ãã®ãµããã¬ã€ãã§ããå¯èœæ§ããããŸãã ç§ã«é¢ããéããããã¯ãããšåããããç°¡åã§ãã 確ãã«ãç¹å®ã®ã¿ã€ãã®ã¢ãã±ãŒã¿ãŒã¯æ±çšã¢ãã±ãŒã¿ãŒãããå¹ççã§ãããã³ã³ãã€ã©ãŒãæšæºãããã«ã€ããŠå®éã«ç¥ãå¿ èŠã¯ãããŸããïŒãŸãã¯å®éã«ç¥ãå¿ èŠããããŸãïŒã
ãããåé¡ã¯ã»ãã³ãã£ã¯ã¹ãç°ãªãããšã§ãã ã¢ãã±ãŒã¿ã¯ãçã®ãã€ãBLOBãå²ãåœãŠãŠè§£æŸããŸãã ObjectAllocator
äžæ¹ãã¯ããã§ã«æ§ç¯ããããªããžã§ã¯ããå²ãåœãŠããããã®ãªããžã§ã¯ããåé€ãã責任ããããŸãïŒæ°ããå²ãåœãŠããããªããžã§ã¯ããæ§ç¯ããããã«åŸã§é åžãããå¯èœæ§ã®ããæ§ç¯ããããªããžã§ã¯ãããã£ãã·ã¥ã§ããããšãå«ãïŒã ç¹æ§ã¯æ¬¡ã®ããã«ãªããŸãã ç¹æ§ObjectAllocator
{{
fn allocïŒïŒ-> T;
fn freeïŒt TïŒ;
}
ããã¯ãã¡ãœãããrawãã€ã³ã¿ãŒãåŠçããåã®æŠå¿µããªãAllocatorãšã¯äºææ§ããããŸããã ããã«ãã¢ãã±ãŒã¿ãŒã§ã¯ã解æŸãããŠãããªããžã§ã¯ããæåã«ããããããã®ã¯åŒã³åºãå ã®è²¬ä»»ã§ãã ããã¯éåžžã«éèŠã§ã-ã¿ã€ãTã«ã€ããŠç¥ã£ãŠãããšãObjectAllocatorãèš±å¯ãããŸãTã®dropã¡ãœããã®åŒã³åºããªã©ãè¡ãã«ã¯ãfreeïŒtïŒãtãfreeã«ç§»åãããããåŒã³åºãå ã¯æåã«tãããããã§ããŸããã代ããã«ObjectAllocatorã§ãã ã®è²¬ä»»ã åºæ¬çã«ãããã2ã€ã®ç¹æ§ã¯äºãã«äºææ§ããããŸããã â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHub https://github.com/rust-lang/rust/issues/32838#issuecomment-270505704ã§è¡šç€ºããããã¹ã¬ããããã¥ãŒãããŠãã ããhttps://github.com/notifications/unsubscribe-auth/ AAEF3GViJBefuk8IWgPauPyL5tV78Fn5ks5rPB08gaJpZM4IDYUN ã
@alexregãããããã ãç§ãããæãã§ãã:)ãŸã-å¥ã®RFCãåŸ ããªããã°ãªããªãã ããã
ã¯ãããã®RFCãããã¯ã¹ã¿ãŒãããŠãã ãããç§ã¯ãããããããã®ãµããŒããåŸããšç¢ºä¿¡ããŠããŸãïŒ ãããŠã説æã«æè¬ããŸãïŒç§ã¯ãã®RFCã®è©³çŽ°ã«ãŸã£ããè¿œãã€ããŠããªãïŒã
2017幎1æ5æ¥ã«ã¯ã0ïŒ53ã§ããžã§ã·ã¥ã¢Liebow-Feeser [email protected]æžããŸããïŒ
@alexreg https://github.com/alexregãããããã ãšæã£ãŠãã:)ãŸã-å¥ã®RFCãåŸ ããªããã°ãªããªãã ããã
â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHub https://github.com/rust-lang/rust/issues/32838#issuecomment-270531535ã§è¡šç€ºããããã¹ã¬ããããã¥ãŒãããŠãã ããhttps://github.com/notifications/unsubscribe-auth/ AAEF3MQQeXhTliU5CBsoheBFL26Ee9WUks5rPD8RgaJpZM4IDYUN ã
ã«ã¹ã¿ã ã¢ãã±ãŒã¿ããã¹ãããããã®ã¯ã¬ãŒãã圹ç«ã¡ãŸãã
æãããªäœããæ¬ ããŠããå Žåã¯èš±ããŠãã ããããã ãããã®RFCã§èª¬æãããŠããLayout
ç¹æ§ãã Copy
ãšClone
ãå®è£
ããªãçç±ããããŸãã PODïŒ
äœãæãã€ããªãã
ããã»ã¹ã®åŸåã§ãããåãäžããŠç³ãèš³ãããŸããã...
ã¡ãœããã§ã¯ãªãé¢æ°ã§ããdealloc
ãããªé¢æ°ã®ãµããŒããè¿œå ãã䟡å€ãããã§ããããã ã¢ã€ãã¢ã¯ãã¢ã©ã€ã³ã¡ã³ãã䜿çšããŠãã¡ã¢ãªå
ã®èŠªã¢ãã±ãŒã¿ãã©ãã«ãããããã€ã³ã¿ããæšæž¬ã§ããããã«ããããšã§ãããããã£ãŠãæ瀺çãªã¢ãã±ãŒã¿åç
§ãå¿
èŠãšããã«è§£æŸã§ããŸãã
ããã¯ãã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒã䜿çšããããŒã¿æ§é ã«ãšã£ãŠå€§ããªã¡ãªããã«ãªãå¯èœæ§ããããŸãã ããã«ãããã¢ãã±ãŒã¿ãŒèªäœãžã®åç
§ãä¿æããã®ã§ã¯ãªããé©åãªdealloc
é¢æ°ãåŒã³åºãããšãã§ããããã«ãã¢ãã±ãŒã¿ãŒã®_type_ã§ãã©ã¡ããªãã¯ã§ããå¿
èŠãããã ãã§ãã ããšãã°ã Box
ãæçµçã«ã«ã¹ã¿ã ã¢ãã±ãŒã¿ããµããŒãããããã«å€æŽãããå Žåãåç
§ãæ ŒçŽããããã«2ã¯ãŒãã«å±éããå¿
èŠã¯ãªãã1ã¯ãŒãïŒãã€ã³ã¿ã®ã¿ïŒã®ãŸãŸã«ããããšãã§ããŸããã¢ãã±ãŒã¿ãŒã«ãã
é¢é£ãã泚èšãšããŠãã°ããŒãã«ã¢ãã±ãŒã¿ãèš±å¯ããããã«éã¡ãœããalloc
é¢æ°ããµããŒãããããšã圹ç«ã€å ŽåããããŸãã ããã¯ãã¡ãœãã以å€ã®dealloc
é¢æ°ã§ããŸãæ§æãããŸã-ã°ããŒãã«ã¢ãã±ãŒã¿ãŒã®å Žåãã®éçã€ã³ã¹ã¿ã³ã¹ã¯1ã€ãããªããããã¢ãã±ãŒã¿ãŒãžã®ãã€ã³ã¿ãŒæšè«ãè¡ãå¿
èŠã¯ãããŸãããããã°ã©ã å
šäœã®ã¢ãã±ãŒã¿ã
@joshlfçŸåšã®èšèšã§ã¯ãã¢ãã±ãŒã¿ãïŒãŒããµã€ãºã®ïŒãŠãããã¿ã€ãã«ããã ãã§ãããå®çŸã§ããŸãstruct MyAlloc;
ã€ãŸãã Allocator
ç¹æ§ãå®è£
ããŸãã
åç
§ãæ ŒçŽãããããŸã£ããæ ŒçŽããªããã¯ãåžžã«ãã¢ãã±ãŒã¿ã®å€ã«ããæ ŒçŽãããäžè¬çã§ã¯ãã
çŽæ¥åã蟌ãŸããåã«ãåœãŠã¯ãŸãããšãããããŸããããããŒã¿æ§é ã代ããã«åç §ãä¿æããããšã決å®ããå Žåã¯ã©ãã§ããããã ãŒããµã€ãºã®åãžã®åç §ã¯ãŒãã¹ããŒã¹ãå æããŸããïŒ ã€ãŸããç§ãæã£ãŠããå ŽåïŒ
struct Foo()
struct Blah{
foo: &Foo,
}
Blah
ãµã€ãºã¯ãŒãã§ããïŒ
å®éã«ã¯ããããå¯èœã§ãã£ãŠããã¢ãã±ãŒã¿ã®ãµã€ãºããŒãã«ããããªãå ŽåããããŸãã ããšãã°ã_from_ãå²ãåœãŠããŒã以å€ã®ãµã€ãºã®ã¢ãã±ãŒã¿ãããããå
ã®ã¢ãã±ãŒã¿ãç¥ããªããŠããªããžã§ã¯ãã解æŸããæ©èœããããšããŸãã ããã¯ã Box
åèªã ãã䜿çšãããã®ã«åœ¹ç«ã¡ãŸãã Box::new_from_allocator
ãããªãã®ããããåŒæ°ãšããŠã¢ãã±ãŒã¿ãŒãåãå¿
èŠããããŸã-ãããŠããã¯ãŒã以å€ã®ãµã€ãºã®ã¢ãã±ãŒã¿ãŒã§ããå¯èœæ§ããããŸã-ããããã¢ãã±ãŒã¿ãŒãå
ã®ã¢ãã±ãŒã¿ãŒåç
§ãªãã§è§£æŸããµããŒãããå Žåãè¿ãããBox<T>
ã¯ãå
ã®Box::new_from_allocator
åŒã³åºãã§æž¡ãããã¢ãã±ãŒã¿ãŒãžã®åç
§ã®ä¿åãåé¿ã§ããŸãã
ããšãã°ãå²ãåœãŠå ã®ãµã€ãºããŒã以å€ã®ã¢ãã±ãŒã¿ãããããå ã®ã¢ãã±ãŒã¿ãç¥ããªããŠããªããžã§ã¯ãã解æŸããæ©èœããããšããŸãã
åºæ¬çã«ãã®çç±ãããã¢ãã±ãŒã¿ãŒãšããã±ãŒã¿ãŒã®ç¹æ§ãå¥ã ã«ïŒ2ã€ãæ¥ç¶ããã¢ãœã·ãšãŒãã¿ã€ãã§ïŒå æ°å解ããããšãææ¡ããŠããã®ã¯ãã£ãšæã®ããšã§ãã
ã³ã³ãã€ã©ãŒã¯ããããã®ã¢ãã±ãŒã¿ãŒã䜿çšããŠå²ãåœãŠãæé©åããããšãèš±å¯ãããã¹ãã§ããïŒ
ã³ã³ãã€ã©ãŒã¯ããããã®ã¢ãã±ãŒã¿ãŒã䜿çšããŠå²ãåœãŠãæé©åããããšãèš±å¯ãããã¹ãã§ããïŒ
@Zoxcã©ãããæå³ã§ããïŒ
åºæ¬çã«ãã®çç±ãããã¢ãã±ãŒã¿ãŒãšããã±ãŒã¿ãŒã®ç¹æ§ãå¥ã ã«ïŒ2ã€ãæ¥ç¶ããã¢ãœã·ãšãŒãã¿ã€ãã§ïŒå æ°å解ããããšãææ¡ããŠããã®ã¯ãã£ãšæã®ããšã§ãã
åŸäžã®ããã«ããã®ã¹ããŒãã¡ã³ããæ確ã«ããŸãããïŒãªãã©ã€ã³ã§@ Ericson2314ã«è©±ããŸããïŒïŒã¢ã€ãã¢ã¯ã 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>
ãµã€ãºã¯1ã¯ãŒãã§ãã
ããããã€çéžãããã«ã€ããŠã®ã¿ã€ã ã©ã€ã³ã¯ãããŸããïŒ ç§ã¯ããã€ãã®ã¢ãã±ãŒã¿ãŒã®ãã®ã«åãçµãã§ããŸãããããŠãã®ãã®ãç§ãæ§ç¯ããããã«ããã«ãã£ããããã®ã«ãšæããŸãã
èå³ãããã°ãããã«ããã€ãã®ãµã€ã¯ã«ã貞ããŠããã ããã°å¹žãã§ãããç§ã¯Rustã«æ¯èŒçæ £ããŠããªãã®ã§ãåå¿è ã®ã³ãŒããã³ãŒãã¬ãã¥ãŒããå¿ èŠããããšããç¹ã§ã¡ã³ããã®äœæ¥ãå¢ããå¯èœæ§ããããŸãã 誰ãã®ã€ãŸå ãèžãã ããªããã人ã®ããã«ãã£ãšä»äºãããããªãã
ããŠãæè¿ãã¢ãã±ãŒã¿ã®ç¶æ ãè©äŸ¡ããããã«äŒããŸãããããã«ãããã€ãã®è¯ããã¥ãŒã¹ããããšæããŸãã ãããã®APIã®ãµããŒãã¯ãŸã libstdã«äžéžããŠããªãããã§ããã誰ãããã€ã§ãäžéžããããšã«æºè¶³ããŠããŸãã
ç§ãã¡ãè°è«ããããšã®1ã€ã¯ãæšè«ã®åé¡ãçºçããå¯èœæ§ãããããããã¹ãŠã®libstdã¿ã€ããåãæ¿ããã®ã¯å°ãææå°æ©ãããããªããšããããšã§ãããããã«ããããããã Allocator
ç¹æ§ãšLayout
ãçéžãããã®ã¯è¯ãèãã®ããã§ãã std::heap
ã¢ãžã¥ãŒã«ãå
¥åããŸãã
@joshlfããã§æäŒãããã®ãªããããã¯å€§æè¿ã ãšæããŸãïŒ æåã®éšåã¯ããã®RFCããæšæºã©ã€ãã©ãªã«åºæ¬çãªå/ç¹æ§ãå°å ¥ããå¯èœæ§ããããŸãããã®åŸãlibstdã®ã³ã¬ã¯ã·ã§ã³ã®å®éšãšè©Šçšãéå§ã§ããŸãã
@alexcrichtonãªã³ã¯ãå£ããŠãããšæããŸããïŒ ãããæããŸãã
ç§ãã¡ãè°è«ããããšã®1ã€ã¯ããã¹ãŠã®libstdã¿ã€ããåãæ¿ããããšã¯ãæšè«ã®åé¡ã®å¯èœæ§ããããããå°ãææå°æ©ãããããªããšããããšã§ãã
ãã¬ã€ããè¿œå ããããšã¯è¯ãæåã®ã¹ãããã§ãããããã䜿çšããããã«æ¢åã®APIããªãã¡ã¯ã¿ãªã³ã°ããªããšãããŸã䜿çšãããŸããã https://github.com/rust-lang/rust/issues/27336#issuecomment -300721558ã§ããã¡ãµãŒãã®èåŸã«ããæšæ ãããã«ãªãã¡ã¯ã¿ãªã³ã°ã§ããããšãææ¡ãstd
æ°ããã¿ã€ãã®ã©ãããŒãè¿œå ããŸãã ããã®ã¯é¢åã§ãããé²æ©ãéããããšãã§ããŸãã
@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);
}
ãããã£ãŠãã¢ãã±ãŒã¿ãšãªããžã§ã¯ãã¢ãã±ãŒã¿ã®äž¡æ¹ãåæã«å®éšããããšã¯æçšã§ãããšæããŸãã ãã ããããããã®ããã®é©åãªå Žæã§ãããã©ããããŸãã¯å¥ã®RFCãŸãã¯å°ãªããšãå¥ã®PRãå¿ èŠãã©ããã¯ããããŸããã
ãããã°ããŒãã«ã¢ãã±ãŒã¿ãŒã«é¢ããæ å ±ãããããã«ãªã³ã¯@joshlfã¯ããªããèããŠããããšã§ããïŒ
@alexcrichtonã¯ã libstd
ã®ã©ã®ã³ã¬ã¯ã·ã§ã³ã«ãçµ±åãããŠããªããŠãã Allocator
ç¹æ§ãšLayout
ã¿ã€ããæäŸããPRãæãã§ããããã§ãã
ãããæ£ããç解ããã°ããã®ããã®PRãç«ãŠãããšãã§ããŸãã å°ãªããšãRawVec
ãšVec
ãããã¿ã€ããšã®çµ±åãè©Šã¿ç¶ããŠããã®ã§ãããããŠããŸããã§ããã ïŒãã®æç¹ã§RawVec
å®äºããŸãããã Drain
ãIntoIter
ãªã©ãä»ã«ãå€ãã®æ§é ãæ§ç¯ãããŠããããã Vec
ã¯å°ãé£ããã§ãã IntoIter
ãªã©...ïŒ
å®éãç§ã®çŸåšã®ãã©ã³ãã¯å®éã«ãã«ããããå¯èœæ§ãããããã§ãïŒãããŠã RawVec
ãšã®çµ±åã®ããã®1ã€ã®ãã¹ãã«åæ ŒããŸããïŒã®ã§ãå
ã«é²ãã§æçš¿ããŸããïŒïŒ42313
@hawkwã¯å°ããŸããïŒ
æãããªäœããæ¬ ããŠããå Žåã¯èš±ããŠãã ããããã ãããã®RFCã§èª¬æãããŠããã¬ã€ã¢ãŠãç¹æ§ãPODã§ãããããã³ããŒãšã¯ããŒã³ãå®è£ ããªãçç±ã¯ãããŸããïŒ
ç§ãäœã£ãçç±ã¯Layout
å®è£
ã®ã¿ãClone
ãªãCopy
ç§ã¯ããå€ãã®æ§é ãè¿œå ããå¯èœæ§éãããŸãŸã«ãããã£ããšããããšã§ãLayout
ã¿ã€ããã ç¹ã«ãç§ã¯ãŸã æã£ãŠããããšããŠããããšã«èå³ãLayout
ãããæ§ç¯ããããã«äœ¿çšãããä»»æã®ã¿ã€ãã®æ§é ã远跡ããããšãããšïŒã®äŸãã°16-é
åstruct { x: u8, y: [char; 215] }
ã¢ãã±ãŒã¿ããããªãã·ã§ã³ãæã€ããšã«ãªããããšãããïŒçŸåšã®ã³ã³ãã³ããã©ã®ã¿ã€ãããæ§æãããŠããããã¬ããŒãããã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³ã«ãŒãã³ãå
¬éããŸãã
ããã¯ã»ãŒç¢ºå®ã«ãªãã·ã§ã³æ©èœã§ããå¿
èŠããããŸããã€ãŸããéçºè
ã«åãè±å¯ãªLayout
ã³ã³ã¹ãã©ã¯ã¿ãŒã®äœ¿çšã匷å¶ããããšã«å察ããŠããããã§ãã ãããã£ãŠããã®åœ¢åŒã®ã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³ã«ã¯ãã¿ã€ãæ
å ±ãæããªãå²ãåœãŠãåŠçããããã«ããäžæãªã¡ã¢ãªãããã¯ãã«ããŽãªã®ãããªãã®ãå«ããå¿
èŠããããŸãã
ããããããã«ããããããããã®ãããªæ©èœãã Layout
Copy
å®è£
ãããããšãéžæããªãã£ãäž»ãªçç±Copy
å®è£
ã¯ã Layout
èªäœã«å¯Ÿããææå°æ©ãªå¶çŽã«ãªããšèããŸããã
@alexcrichton @pnkfelix
@pnkfelixããããã«ããŒããŠããããã§ããã®PRã
çŸåšã Allocator::oom
ã®çœ²åã¯æ¬¡ã®ãšããã§ãã
fn oom(&mut self, _: AllocErr) -> ! {
unsafe { ::core::intrinsics::abort() }
}
ããã¯ãããç§ã®æ³šæã«æã£ãŠæ¥ãGeckoã¯å°ãªããšãOOMäžã«ãå²ãåœãŠãµã€ãºãç¥ãã®ã奜ããšããããšãããã©ããã OOMãçºçããŠããçç±ãšããŠOption<Layout>
ãããªã³ã³ããã¹ããè¿œå ããããã«å®å®åãããšãã«ããããèæ
®ããããšæããããããŸããã
@alexcrichton
è€æ°ã®oom_xxx
ããªã¢ã³ãããŸãã¯ç°ãªãåŒæ°ã¿ã€ãã®åæåã䜿çšãã䟡å€ããããŸããïŒ å€±æããå¯èœæ§ã®ããã¡ãœããã«ã¯ããã€ãã®ç°ãªãã·ã°ããã£ãããïŒããšãã°ã alloc
ã¯ã¬ã€ã¢ãŠããåãã realloc
ã¯ãã€ã³ã¿ãå
ã®ã¬ã€ã¢ãŠããæ°ããã¬ã€ã¢ãŠããåããŸããªã©ïŒã oom
ãããªã¡ãœãããããããã¹ãŠã«ã€ããŠç¥ãããå Žåã§ãã
@joshlfããã¯æ¬åœã§ããã¯ããããããããæçšãã©ããã¯
ããã§ã®å®å®åã®ãã€ã³ãã¯ãã fn dealloc
æäŸãããã¢ã©ã€ã¡ã³ãã®èŠä»¶ã決å®ãããããšã§ããããWindowsã§ã®dealloc
ã®çŸåšã®å®è£
ã§ã¯ã align
ã䜿çšããŠæ£ããç¡æã @ruudaããªãã¯ãã®äºå®ã«èå³ããããããããŸããã
ããã§ã®å®å®åã®ãã€ã³ãã¯ãã
fn dealloc
æäŸãããã¢ã©ã€ã¡ã³ãã®èŠä»¶ã決å®ãããããšã§ããããWindowsã§ã®dealloc
ã®çŸåšã®å®è£ ã§ã¯ãalign
ã䜿çšããŠæ£ããç¡æã
ã¯ãããããç§ãæåã«ããã«ééããæ¹æ³ã ãšæããŸãã ãã®ãããç§ã®ããã°ã©ã ã¯Windowsã§ã¯ã©ãã·ã¥ããŸããã HeapAlloc
ã¯é
眮ã®ä¿èšŒãè¡ããªãããã allocate
ã¯ãã倧ããªé åãå²ãåœãŠãå
ã®ãã€ã³ã¿ãŒãããããŒã«æ ŒçŽããŸãããæé©åãšããŠãé
眮èŠä»¶ãæºããããå Žåã¯ãããåé¿ããŸãã ãã®æé©åã倱ãããšãªãã HeapAlloc
ãç¡æã§ã¢ã©ã€ã¡ã³ããå¿
èŠãšããªãã¢ã©ã€ã¡ã³ã察å¿ã¢ãã±ãŒã¿ã«å€æããæ¹æ³ãããã®ã ãããã
@ruuda
HeapAlloc
ã¯ã¢ã©ã€ã¡ã³ããä¿èšŒããªããã
32ãããã®å Žåã¯8ãã€ãã64ãããã®å Žåã¯16ãã€ãã®æå°ã¢ã©ã€ã¡ã³ãä¿èšŒãæäŸããŸãããããããé«ãã¢ã©ã€ã¡ã³ããä¿èšŒããæ¹æ³ã¯æäŸããŸããã
Windowsäžã®CRTã«ãã£ãŠæäŸããã_aligned_malloc
ã¯ãããé«ãã¢ã©ã€ã¡ã³ãã®å²ãåœãŠãæäŸã§ããŸãããç¹ã«ã free
ã¯éæ³ã§ããããã _aligned_free
ãšãã¢ã«ããå¿
èŠãmalloc
ãŸãã¯_aligned_malloc
ã©ã¡ãã§è¡ããããããããªãå Žåã¯ãWindowsã§alloc_system
ã䜿çšãããŠããã®ãšåãé£åã«é¥ã£ãŠããŸãã deallocate
ã®é
眮ãç¥ã£ãŠããŸãã CRTã¯ã free
ãšçµã¿åãããããšãã§ããæšæºã®aligned_alloc
é¢æ°ãæäŸããŠããªããããMicrosoftã§ãããã®åé¡ã解決ã§ããŸããã§ããã ïŒããã¯C11é¢æ°ã§ãããMicrosoftã¯C11ããµããŒãããŠããªããããããã¯åŒ±ãè°è«ã§ããïŒ
deallocate
ã¯ãäœçœ®åããã®ã¿ãèæ
®ããŠãäœçœ®åããããªãŒããŒã¢ã©ã€ã³ãããŠãããã©ãããèªèããŸããå®éã®å€èªäœã¯é¢ä¿ãããŸããã çã«ã¢ã©ã€ã¡ã³ãã«äŸåããªãdeallocate
ãå¿
èŠãªå Žåã¯ããã¹ãŠã®å²ãåœãŠããªãŒããŒã¢ã©ã€ã¡ã³ããšããŠæ±ãããšãã§ããŸãããå°ããªå²ãåœãŠã§ã¯å€ãã®ã¡ã¢ãªã浪費ããŸãã
@alexcrichtonã¯æžããïŒ
çŸåšã
Allocator::oom
ã®çœ²åã¯æ¬¡ã®ãšããã§ããfn oom(&mut self, _: AllocErr) -> ! { unsafe { ::core::intrinsics::abort() } }
ããã¯ãããç§ã®æ³šæã«æã£ãŠæ¥ãGeckoã¯å°ãªããšãOOMäžã«ãå²ãåœãŠãµã€ãºãç¥ãã®ã奜ããšããããšãããã©ããã OOMãçºçããŠããçç±ãšããŠ
Option<Layout>
ãããªã³ã³ããã¹ããè¿œå ããããã«å®å®åãããšãã«ããããèæ ®ããããšæããããããŸããã
AllocErr
Layout
ã¯ã AllocErr::Exhausted
ããªã¢ã³ãã®Layout
ãæ¢ã«å«ãŸããŠããŸãã Layout
ãAllocErr::Unsupported
ããªã¢ã³ãã«è¿œå ããããšãã§ããŸããããã¯ãã¯ã©ã€ã¢ã³ãã®æåŸ
ã®èŠ³ç¹ããæãç°¡åã ãšæããŸãã ïŒ AllocErr
åæåèªäœã®åŽé¢ãåçŽã«å¢ãããšããæ¬ ç¹ããããŸãããããã«ã€ããŠå¿é
ããå¿
èŠã¯ãªããããããŸãã...ïŒ
ãããå¿ èŠãªã®ã¯ããã ãã ãšæããŸãã@ pnkfelixã®ä¿®æ£ã«æè¬ããŸãã
https://github.com/rust-lang/rust/pull/42727ãçéžããåŸã«ãªãã®ã§ãäžè¬çã«std::heap
ã®è¿œè·¡åé¡ã®ããã«ãã®åé¡ã®è»¢çšãéå§ããŸãã ããã«è³æããŠãä»ã®ããã€ãã®é¢é£ããåé¡ãéããŸãã
ã³ã¬ã¯ã·ã§ã³ãå€æããããã®è¿œè·¡ã®åé¡ã¯ãããŸããïŒ PRãçµ±åãããã®ã§ã
https://github.com/rust-lang/rust/issues/42774ãéããŠã Alloc
stdã³ã¬ã¯ã·ã§ã³ãžã®çµ±åã远跡ããŸããã std::heap
ã¢ãžã¥ãŒã«ã®æåã®ãã¹ãšã¯å¥ã®å®å®åã®è»éã«ä¹ã£ãŠããå¯èœæ§ãé«ããlibsããŒã ã§ã®æŽå²çãªè°è«ããããŸãã
ã¢ãã±ãŒã¿ãŒé¢é£ã®åé¡ã確èªããŠãããšãã«ããã°ããåã«https://github.com/rust-lang/rust/issues/30170ã«ãåºããããŸããã OSXã·ã¹ãã ã¢ãã±ãŒã¿ã¯ã¢ã©ã€ã¡ã³ããé«ããã°ãå€ãããã§ãããã®ããã°ã©ã ãjemallocã§å®è¡ãããšãå°ãªããšãLinuxã§ã®å²ãåœãŠè§£é€äžã«ã»ã°ãã©ãŒã«ããçºçããŸãã å®å®åäžã«æ€èšãã䟡å€ããããŸãïŒ
ãŒããµã€ãºã®å²ãåœãŠãèŠæ±ãããé 眮ãšäžèŽããå¿ èŠããããã©ãããšããç¹å®ã®è³ªåãè°è«ããå ŽæãšããŠãïŒ42794ãéããŸããã
ïŒãŸãããŒããµã€ãºã®å²ãåœãŠã¯ãŠãŒã¶ãŒã¢ãã±ãŒã¿ãŒã§ã¯éæ³ã§ãïŒïŒ
alloc::heap::allocate
é¢æ°ãšãã®ä»²éãNightlyã§ãªããªã£ãã®ã§ããã®æ°ããAPIã䜿çšããããã«ServoãæŽæ°ããŸããã ããã¯å·®åã®äžéšã§ãïŒ
-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;
人éå·¥åŠã¯è¯ããªããšæããŸãã 1ã€ã®ã¢ã€ãã ã®ã€ã³ããŒããã2ã€ã®ç°ãªãã¢ãžã¥ãŒã«ããã®3ã€ã®ã¢ã€ãã ã®ã€ã³ããŒãã«ç§»è¡ããŸããã
allocator.alloc(Layout::from_size_align(âŠ))
䟿å©ãªæ¹æ³ãããã®ã¯çã«ããªã£ãŠããŸããïŒ<Heap as Alloc>::_
ã¡ãœãããç¡æã®é¢æ°ãŸãã¯åºæã®ã¡ãœãããšããŠå©çšã§ããããã«ããããšã¯çã«ããªã£ãŠããŸããïŒ ïŒã€ã³ããŒãããã¢ã€ãã ã1ã€å°ãªãããã«ã¯ã Alloc
ç¹æ§ã䜿çšããŸããïŒãããã¯ã Alloc
ç¹æ§ãåå¥æ²ã«å«ãŸããŠããå¯èœæ§ããããŸããããããšããŠãŒã¹ã±ãŒã¹ã®ããããããã®ã§ããããã
@SimonSapin IMOã¯ããã®ãããªäœã¬ãã«APIã®äººéå·¥åŠãæé©åããããšã«ããŸã
@SimonSapin
人éå·¥åŠã¯è¯ããªããšæããŸãã 1ã€ã®ã¢ã€ãã ã®ã€ã³ããŒããã2ã€ã®ç°ãªãã¢ãžã¥ãŒã«ããã®3ã€ã®ã¢ã€ãã ã®ã€ã³ããŒãã«ç§»è¡ããŸããã
ç§ã¯èªåã®ã³ãŒãããŒã¹ãšãŸã£ããåãæèŠãæã£ãŠããŸãã-ä»ã¯ããªãäžæ Œå¥œã§ãã
allocator.alloc(Layout::from_size_align(âŠ))?
䟿å©ãªæ¹æ³ãããã®ã¯çã«ããªã£ãŠããŸãã
Alloc
ç¹æ§ã§ããããããšãHeap
ã§ããïŒ ããã§èæ
®ãã¹ãããšã®1ã€ã¯ã3çªç®ã®ãšã©ãŒæ¡ä»¶ãããããšã§ãã Layout::from_size_align
ã¯Option
è¿ããããå²ãåœãŠæã«çºçããå¯èœæ§ã®ããéåžžã®ãšã©ãŒã«å ããŠNone
ãè¿ãå¯èœæ§ããããŸãã ã
ãããã¯ã
Alloc
ç¹æ§ãåå¥æ²ã«å«ãŸããŠããå¯èœæ§ããããŸããããããšããŠãŒã¹ã±ãŒã¹ã®ããããããŸããïŒ
IMOã¯ããã®ãããªäœã¬ãã«APIã®äººéå·¥åŠãæé©åããããšã«ããŸãæå³ããããŸããã
ãã¬ãªã¥ãŒããå ¥ããã«ã¯ããããäœã¬ãã«ã§ããããšã«åæããŸãããããã§ã人éå·¥åŠãæé©åããããšã«ã¯äŸ¡å€ããããšæããŸãïŒå°ãªããšããå©å·±çã«-ããã¯æ¬åœã«åä»ãªãªãã¡ã¯ã¿ãªã³ã°ã§ããðïŒã
@SimonSapin以åã«OOMãæ±ã£ãããšããããŸãããïŒ ãŸãã std
ã3ã€ã®ã¿ã€ããã¹ãŠãstd::heap
ã¢ãžã¥ãŒã«ã§äœ¿çšã§ããŸãïŒãããã¯1ã€ã®ã¢ãžã¥ãŒã«ã«å«ãŸããŠããã¯ãã§ãïŒã ãŸãã以åã¯ãµã€ãºãããµããã±ãŒã¹ã«å¯Ÿå¿ããŠããŸããã§ãããïŒ ãŸãã¯ãŒããµã€ãºã®ã¿ã€ãïŒ
以åã«OOMãæ±ã£ãããšããããŸãããïŒ
ãããååšããå Žåã alloc::heap::allocate
é¢æ°ã¯Result
ãªãã§ãã€ã³ã¿ãŒãè¿ããOOMåŠçã«éžæè¢ãæ®ããŸããã§ããã ããã»ã¹ãäžæ¢ãããšæããŸãã ã¹ã¬ããããããã¯ã«ããããã«.unwrap()
ãè¿œå ããŸããã
ãããã¯1ã€ã®ã¢ãžã¥ãŒã«ã«ããã¯ãã§ã
heap.rs
ã«pub use allocator::*;
ãå«ãŸããŠããããšãããããŸãã ããããrustdocããŒãžã«ãªã¹ããããŠããimplã§Heap
Alloc
ãã¯ãªãã¯ãããšã alloc::allocator::Alloc
ã«éãããŸããã
æ®ãã«ã€ããŠã¯ãç§ã¯ããã調ã¹ãŠããŸããã ç§ã¯äœå¹Žãåã«æžããã倧éã®ã³ãŒããæ°ããã³ã³ãã€ã©ã«ç§»æ€ããŠããŸãã ãããã¯ãCã©ã€ãã©ãªã§ããFreeTypeã®ã³ãŒã«ããã¯ã ãšæããŸãã
alloc :: heap :: alllocateé¢æ°ãååšããå Žåãçµæãªãã§ãã€ã³ã¿ãŒãè¿ããOOMåŠçã«éžæè¢ãæ®ããŸããã§ããã
ããã¯ããªãã«éžæè¢ãäžããŸããã è¿ããããã€ã³ã¿ãŒã¯ãããŒãã¢ãã±ãŒã¿ãŒãå²ãåœãŠã«å€±æããããšã瀺ãnullãã€ã³ã¿ãŒã§ããå¯èœæ§ããããŸãã ãããã Result
ã«åãæ¿ããŠã人ã
ããã®ã±ãŒã¹ãåŠçããããšãå¿ããªãããã«ããããšããšãŠãããããæãçç±ã§ãã
ãŸãããã¶ãFreeTypeãnullãã§ãã¯ãããŠããŸã£ãã®ãããããŸããããç§ã«ã¯ããããŸããã ãšã«ãããã¯ããçµæãè¿ãããšã¯è¯ãããšã§ãã
ïŒ30170ãšïŒ43097ãèãããšããŠãŒã¶ãŒãã¢ã©ã€ã¡ã³ããèŠæ±ããªã倧ããªã¢ã©ã€ã¡ã³ãã§OSXã®åé¡ã解決ããããšæããŸã> = 1 << 32
ã
ããã匷å¶ãã1ã€ã®éåžžã«ç°¡åãªæ¹æ³ïŒå€æŽLayout
ã€ã³ã¿ãŒãã§ãŒã¹ã®ã§ã align
ã§è¡šãããu32
ã®ä»£ããã«usize
ã
@alexcrichtonããã«ã€ããŠèãããããŸããïŒ ãããè¡ãPRãäœæããå¿ èŠããããŸããïŒ
@pnkfelix Layout::from_size_align
ã¯ãŸã usize
ãåãã u32
ãªãŒããŒãããŒã§ãšã©ãŒãè¿ããŸãããïŒ
@SimonSapinéçãªåææ¡ä»¶ããå€> = 1 << 32
ãæž¡ãããšãå®å
šã§ãªãå Žåã usize
æŽåãç¶ç¶ãââãçç±ã¯äœã§ããïŒ
çãããäžéšã®ã¢ãã±ãŒã¿ã¯ã¢ã©ã€ã¡ã³ã> = 1 << 32
ãµããŒãããŠããå¯èœæ§ããããŸããã®å ŽåãçŸç¶ã«æ»ããç§ã®ææ¡ã¯ç¡èŠããŠããŸããŸããã ç§ã®ææ¡ã®ãã€ã³ãã¯åºæ¬çã«ãã®ãããªã³ã¡ã³ããžã®ã+1ãã§ã
std::mem::align_of
ã¯usize
è¿ããã
@SimonSapinãããå€ãè¯ãå®å®ããAPIã®...ããæ¯ãã€ãã
@pnkfelixã1 << 32
å¶éããããš
@rfcbotfcpããŒãž
ããããŸããããã®ç¹æ§ãšãã®ã¿ã€ãã¯ãã°ããã®éçŒãä»ããããŠãããéå§ä»¥æ¥ãæšæºã³ã¬ã¯ã·ã§ã³ã®åºç€ãšãªãå®è£ ã§ããããŸãã ç§ã¯ãç¹ã«ä¿å®çãªæ°èŠæ ªåŒå ¬éããå§ããããšãææ¡ããŸããã€ãŸãã次ã®ã€ã³ã¿ãŒãã§ãŒã¹ã®ã¿ãå®å®ãããããšã§ãã
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
ã alloc_zeroed
ãããã³dealloc
ã¡ãœããã®ã¿ãå®å®ãããŸãã ããã«ãããã«ã¹ã¿ã ã°ããŒãã«ã¢ãã±ãŒã¿ãå®çŸ©ãããšãããä»æ¥ã®æãå·®ãè¿«ã£ãåé¡ã解決ããããšæããŸããError
ã¿ã€ããåé€ããŠãçã®ãã€ã³ã¿ãŒã®ã¿ã䜿çšããããã«ããŸããu8
ã¿ã€ããvoid
Layout
ã¿ã€ãã®ç°¡ç¥çãdealloc
ãšã¢ã©ã€ã³ã¡ã³ãïŒæ£ç¢ºãªã¢ã©ã€ã³ã¡ã³ãïŒé©åïŒäžæïŒïŒãã©ãããããªã©ã®æªè§£æ±ºã®è³ªåããŸã ãããŸãããAPIã§ã¯ãªãå¯èœæ§ãé«ããããFCPäžã«ãããã解決ã§ããããšãæãã§ããŸã-ç Žå£çãªå€åã
äœããå®å®ãããããã«+1ïŒ
AllocErr
ååãError
ããã€ã³ã¿ãŒãã§ã€ã¹ãããå°ãä¿å®çã«ããŸãã
ããã«ãããã¢ãã±ãŒã¿ãUnsupported
ãæå®ãããªãã·ã§ã³ããªããªããŸããïŒ ç§ãããããããŒãããŠããäœãã«ãã£ãšããŒãããå±éºãåããŠãç§ã¯ïŒ44557ããŸã åé¡ã§ãããšæããŸãã
Layout
Layout
ããããã€ãã®ã¡ãœãããåé€ããããã§ãã é€å€ãããã®ãå®éã«åé€ããã€ããã§ãããããããšãäžå®å®ãªãŸãŸã«ããŠããã€ããã§ãããïŒ
impl Error { pub fn oom() -> Self; }
ããã¯ä»æ¥ã®AllocErr::Exhausted
ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§ããïŒ ãããããªããããã¯Layout
ãã©ã¡ãŒã¿ãæã€ã¹ãã§ã¯ãããŸãããïŒ
ããŒã ã¡ã³ããŒã®@alexcrichtonã¯ããããããŒãžããããšãææ¡ããŸããã 次ã®ã¹ãããã¯ãã¿ã°ä»ããããæ®ãã®ããŒã ã«ããã¬ãã¥ãŒã§ãã
æžå¿µäºé ïŒ
ãããã®ã¬ãã¥ãŒã¢ãã³ã³ã»ã³ãµã¹ã«éãããšãããã¯æçµã³ã¡ã³ãæéã«å ¥ããŸãã ãã®ããã»ã¹ã®ã©ã®æç¹ã§ãæèµ·ãããŠããªã倧ããªåé¡ãèŠã€ããå Žåã¯ã声ãäžããŠãã ããã
ã¿ã°ä»ããããããŒã ã¡ã³ããŒãç§ã«äžããããšãã§ããã³ãã³ãã«ã€ããŠã¯ããã®ããã¥ã¡ã³ããåç §ããŠãã ããã
ç§ã¯ãã®ä»äºã®ããã€ããå®å®ãããããšã«æ¬åœã«è奮ããŠããŸãïŒ
1ã€ã®è³ªåïŒäžèšã®ã¹ã¬ããã§ã @ joshlfãš@ Ericson2314ã¯ã alloc
å Žåã«æé©åããããã«ã Alloc
ãšDealloc
ç¹æ§ãåé¢ããå¯èœæ§ã«ã€ããŠèå³æ·±ãç¹ãæèµ·ããŸããã alloc
ã¯ããã€ãã®ããŒã¿ãå¿
èŠã§ããã dealloc
ã¯è¿œå æ
å ±ãå¿
èŠãšããªãããã Dealloc
ã¿ã€ãã®ãµã€ãºããŒãã«ããããšãã§ããŸãã
ãã®è³ªåã¯è§£æ±ºãããŸãããïŒ 2ã€ã®ç¹æ§ãåé¢ããããšã®æ¬ ç¹ã¯äœã§ããïŒ
@joshlf
ããã«ãããã¢ãã±ãŒã¿ããµããŒããããŠããªãããšãæå®ãããªãã·ã§ã³ããªããªããŸããïŒ
ã¯ããããããããã¯ãã®ãããªæäœãå®å®ãããã³ã§ããã«ãµããŒããããªãããšãæå³ããŸãããäžå®å®ãªãã³ã§ããããµããŒããç¶ããããšãã§ããŸãã
é€å€ãããã®ãå®éã«åé€ããã€ããã§ãããããããšãäžå®å®ãªãŸãŸã«ããŠããã€ããã§ãããïŒ
確ãã«ïŒ ããã§ããå®å®ããAPIè¡šé¢ç©ãææ¡ããŠããã ãã§ãããä»ã®ãã¹ãŠã®ã¡ãœããã¯äžå®å®ãªãŸãŸã«ããŠããããšãã§ããŸãã æéã®çµéãšãšãã«ãããå€ãã®æ©èœãå®å®ããç¶ããããšãã§ããŸãã ã§ããã ãä¿å®çã«å§ããã®ãæåã ãšæããŸãã
@SimonSapin
ããã¯ãä»æ¥ã®AllocErr :: Exhaustedã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§ããïŒ ãããããªããããã¯ã¬ã€ã¢ãŠããã©ã¡ãŒã¿ãæã€ã¹ãã§ã¯ãããŸãããïŒ
ããè¯ãç¹ïŒ æ¬åœã«å¿
èŠãªå Žåã¯Error
ããŒããµã€ãºã®ã¿ã€ãã«ããå¯èœæ§ãæ®ãããã£ãã®ã§ããããã¡ãããã¬ã€ã¢ãŠãã®ååŸæ¹æ³ãäžå®å®ã«ä¿ã¡ãå¿
èŠã«å¿ããŠå®å®ãããããšãã§ããŸãã ãããšããã¬ã€ã¢ãŠããç¶æããError
ãæåã®ãã¹ã§å®å®ãããå¿
èŠããããšæããŸããïŒ
@cramertj
ç§ã¯ãŸã ãã®ãããªè³ªå/æžå¿µãå人çã«èŠãããšããããŸããã§ãããïŒç§ã¯ãããèŠéãããšæããŸãïŒïŒãç§ã¯ããã䟡å€ããããšå人çã«ã¯èŠãŸããã§ããã ããšãã°ãã³ã¬ã¯ã·ã§ã³ã«Alloc + Dealloc
ãšå
¥åããå¿
èŠãããããã2ã€ã®ç¹æ§ã¯äžè¬ã«å®åæã®2åã«ãªããŸãã ãã®ãããªç¹æ®ãªçšéã§ã¯ãä»ã®ãã¹ãŠã®ãŠãŒã¶ãŒãæçµçã«äœ¿çšããã€ã³ã¿ãŒãã§ã€ã¹ã«å人çã«éç¥ããããªããšæããŸãã
@cramertj @alexcrichton
ç§ã¯ãŸã ãã®ãããªè³ªå/æžå¿µãå人çã«èŠãããšããããŸããã§ãããïŒç§ã¯ãããèŠéãããšæããŸãïŒïŒãç§ã¯ããã䟡å€ããããšå人çã«ã¯èŠãŸããã§ããã
äžè¬çã«ã1ã€ã®æçœãªäŸå€ãé€ããŠããã¯äŸ¡å€ããªãããšã«åæããŸãïŒ Box
ã Box<T, A: Alloc>
ã¯ãçŸåšã®Alloc
å®çŸ©ãèãããšãå°ãªããšã2ã¯ãŒãã®å€§ããã§ããå¿
èŠããããŸãïŒãã§ã«æã£ãŠãããã€ã³ã¿ãŒãšãå°ãªããšãAlloc
ãžã®åç
§ïŒ ïŒã°ããŒãã«ã·ã³ã°ã«ãã³ïŒZSTãšããŠå®è£
å¯èœïŒã®å Žåãé€ããŸãã ãã®ãããªäžè¬çã§åºæ¬çãªã¿ã€ããæ ŒçŽããããã«å¿
èŠãªã¹ããŒã¹ã§ã®2åïŒãŸãã¯ãã以äžïŒã®ççºãç§ã«ã¯é¢ä¿ããŠããŸãã
@alexcrichton
ä»ã®ããã«ã誰ããããšãã°ã³ã¬ã¯ã·ã§ã³ã«Alloc + Deallocãšå ¥åããå¿ èŠããããŸã
次ã®ãããªãã®ãè¿œå ã§ããŸãã
trait Allocator: Alloc + Dealloc {}
impl<T> Allocator for T where T: Alloc + Dealloc {}
ãã®ãããªäžè¬çã§åºæ¬çãªã¿ã€ããæ ŒçŽããããã«å¿ èŠãªã¹ããŒã¹ã§ã®2åïŒãŸãã¯ãã以äžïŒã®ççº
ããã»ã¹ã°ããŒãã«ã§ã¯ãªãã«ã¹ã¿ã ã¢ãã±ãŒã¿ã䜿çšããå Žåã®ã¿ã std::heap::Heap
ïŒããã©ã«ãïŒã¯ãŒããµã€ãºã§ãã
ãããšããæåã®ãã¹ã§ã¬ã€ã¢ãŠãä¿åãšã©ãŒãå®å®ãããå¿ èŠããããšæããŸããïŒ
@alexcrichtonãã®ææ¡ãããæåã®ãã¹ããªãããã§ããã®ãç§ã¯æ¬åœã«ç解ããŠããŸããã Vec
æªçšããããšã§ãã§ã«å®è¡ã§ãã以äžã®ããšã¯ã»ãšãã©ãªããããšãã°https://crates.io/crates/jemallocatorã䜿çšããã«ã¯ååã§ã¯ãããŸãã
å šäœãå®å®ãããããã«ãŸã 解決ããå¿ èŠããããã®ã¯äœã§ããïŒ
ããã»ã¹ã°ããŒãã«ã§ã¯ãªãã«ã¹ã¿ã ã¢ãã±ãŒã¿ã䜿çšããå Žåã®ã¿ã std :: heap :: 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.7åã«ãªããŸãã ããã¯ç§ã«ã¯ããªãæªãããã«æããŸãããããŠãããã®çš®é¡ã®ã¢ããªã±ãŒã·ã§ã³ã¯Alloc
ç¹æ§ã«ãããšããå
šäœçãªãã€ã³ãã®ãããªãã®ã§ãã
@cramertj
次ã®ãããªãã®ãè¿œå ã§ããŸãã
ãŸããå®éã®ç¹æ§ãšã€ãªã¢ã¹ãçšæããŸã:) https://github.com/rust-lang/rust/issues/41517
@glaebhoerlãããã§ããŸã å®è£
ããªãã®ã§ãå®å®åã¯ãŸã Allocator
æåå®è£
ãç¡å¹ã«ãããšãç¹æ§ã«åãæ¿ããããšãã§ãããšæããŸã-ãšã€ãªã¢ã¹ã¯éæ¹åã«-äºææ§ããããŸã;ïŒ
@joshlf
ãã®ãããªäžè¬çã§åºæ¬çãªã¿ã€ããæ ŒçŽããããã«å¿ èŠãªã¹ããŒã¹ã§ã®2åïŒãŸãã¯ãã以äžïŒã®ççºãç§ã«ã¯é¢ä¿ããŠããŸãã
ä»æ¥ã®ãã¹ãŠã®å®è£ ã¯ããµã€ãºããŒãã®åãããã€ã³ã¿ã倧ããã ãã ãšæããŸãããïŒ äžéšã®pointer-size-typesããŒããµã€ãºã«ããããšãã§ããæé©åã¯ãããŸãããïŒ ïŒãŸãã¯ãã®ãããªãã®ïŒïŒ
@cramertj
次ã®ãããªãã®ãè¿œå ã§ããŸãã
確ãã«ïŒ ãã ãã1ã€ã®ç¹æ§ã3ã€ã«ããŸããã éå»ã«ãç§ãã¡ã¯ãã®ãããªç¹æ§ã§çŽ æŽãããçµéšãããããšããããŸããã ããšãã°ã Box<Both>
ã¯Box<OnlyOneTrait>
ãã£ã¹ããããŸããã èšèªæ©èœãããããã¹ãŠãã¹ã ãŒãºã«ããã®ãåŸ
ã€ããšãã§ãããšç¢ºä¿¡ããŠããŸãããããããããããã¯é ãéã®ãã®ããã§ãã
@SimonSapin
å šäœãå®å®ãããããã«ãŸã 解決ããå¿ èŠããããã®ã¯äœã§ããïŒ
ç¥ããŸããã è°è«ãå°ãªããªãããã«ã絶察ã«å°ãããã®ããå§ãããã£ãã®ã§ãã
ä»æ¥ã®ãã¹ãŠã®å®è£ ã¯ããµã€ãºããŒãã®åãããã€ã³ã¿ã倧ããã ãã ãšæããŸãããïŒ äžéšã®pointer-size-typesããŒããµã€ãºã«ããããšãã§ããæé©åã¯ãããŸãããïŒ ïŒãŸãã¯ãã®ãããªãã®ïŒïŒ
ãããã¢ã€ãã¢ã¯ãããªãã®ã¿ã€ãã®ã¢ãã±ãŒã¿ãŒããå²ãåœãŠããããªããžã§ã¯ããžã®ãã€ã³ã¿ãŒãäžããããã°ããããã©ã®ã€ã³ã¹ã¿ã³ã¹ããæ¥ãã®ããç解ã§ãããšããããšã§ãïŒäŸãã°ãã€ã³ã©ã€ã³ã¡ã¿ããŒã¿ã䜿çšããŠïŒã ãããã£ãŠãå²ãåœãŠã解é€ããå¿ èŠãããå¯äžã®æ å ±ã¯ãã©ã³ã¿ã€ã æ å ±ã§ã¯ãªããã¿ã€ãæ å ±ã§ãã
å²ãåœãŠè§£é€ã®èª¿æŽã«æ»ãã«ã¯ã2ã€ã®æ¹æ³ããããŸãã
ææ¡ã©ããã«å®å®ãããŸãïŒå²ãåœãŠè§£é€ã®èª¿æŽãè¡ããŸãïŒã Layout
ãå«ãŸããŠããªãéããæåã§å²ãåœãŠãããã¡ã¢ãªã®æææš©ãè²æž¡ããããšã¯äžå¯èœã§ãã ç¹ã«ã Vec
ã Box
ã String
ãŸãã¯ãã®ä»ã®std
ã³ã³ããããå¿
èŠä»¥äžã«å³å¯ã«é
眮ããŠæ§ç¯ããããšã¯ã§ããŸããïŒããšãã°ãããã¯ã¹åãããèŠçŽ ããã£ãã·ã¥ã©ã€ã³ã«ãŸãããã®ã¯æãŸãããããŸããïŒãåŸã§æåã§å解ããŠå²ãåœãŠã解é€ããå¿
èŠã¯ãããŸããïŒããã¯åžžã«ãªãã·ã§ã³ã§ãããšã¯éããŸããïŒã äžå¯èœãªããšã®å¥ã®äŸã¯ãsimdæäœã䜿çšããŠVec
ãåãããããé
ãããšã§ãã
å²ãåœãŠè§£é€æã«èª¿æŽãå¿
èŠãšãããWindowsã®HeapAlloc
ããŒã¹ã®alloc_system
ããå°ããªå²ãåœãŠã®æé©åãåé€ããŸãã åžžã«é
眮ãä¿åããŠãã ããã @alexcrichton ãããªãããã®ã³ãŒããã³ããããããããããªãããã«çœ®ãããã®ãèŠããŠããŸããïŒ å®éã®ã¢ããªã±ãŒã·ã§ã³ã§ããªãã®éã®ã¡ã¢ãªãç¯çŽã§ãããšãã蚌æ ã¯ãããŸããïŒ ïŒãã€ã¯ããã³ãããŒã¯ã䜿çšãããšãå²ãåœãŠãµã€ãºã«å¿ããŠã©ã¡ãã®æ¹æ³ã§ãçµæãåºãããšãã§ããŸãâãšã«ããHeapAlloc
ããµã€ãºãåãäžããŠããå Žåãé€ããŸããïŒ
ãããã«ãããããã¯éåžžã«é£ãããã¬ãŒããªãã§ãã ã¡ã¢ãªãšããã©ãŒãã³ã¹ãžã®åœ±é¿ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¿ã€ãã«å€§ããäŸåããã©ã¡ããæé©åãããã¯ã¢ããªã±ãŒã·ã§ã³åºæã§ãã
ç§ãã¡ã¯å®éã«ã¯JustFineïŒTMïŒãããããªããšæããŸãã Alloc
ããã¥ã¡ã³ãã®åŒçšïŒ
äžéšã®æ¹æ³ã§ã¯ãã¬ã€ã¢ãŠããã¡ã¢ãªãããã¯ã«é©åããå¿ èŠããããŸãã
ã¬ã€ã¢ãŠããã¡ã¢ãªãããã¯ã«ãé©åããããšã¯ãïŒãŸãã¯
åçã«ãã¡ã¢ãªãããã¯ãã¬ã€ã¢ãŠãã«ãé©åãããããã«ã¯ïŒ
次ã®2ã€ã®æ¡ä»¶ãæºããããŠããå¿ èŠããããŸãã
ãããã¯ã®éå§ã¢ãã¬ã¹ã¯
layout.align()
æããå¿ èŠããããŸãããããã¯ã®ãµã€ãºã¯
[use_min, use_max]
ç¯å²å ã«ããå¿ èŠããããŸããããã§ã
use_min
ã¯self.usable_size(layout).0
ã§ããã
use_max
ã¯ã以åã®ïŒãŸãã¯ä»¥åã®ïŒå®¹éã§ãã
ïŒifïŒãžã®åŒã³åºããä»ããŠãããã¯ãå²ãåœãŠããããšãã«è¿ãããŸã
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
ïŒåããµã€ãºã®ïŒã¬ã€ã¢ãŠãã§å²ãåœãŠããããªããžã§ã¯ãã«é©åããŸãã
ãããæå³ããã®ã¯ãç¹å®ã®ã¿ã€ãã«å¿ èŠãªæå°ã¢ã©ã€ã¡ã³ãããã倧ããã¢ã©ã€ã¡ã³ãã§å²ãåœãŠãŠãããä»ã®ã³ãŒããæå°ã¢ã©ã€ã¡ã³ãã§å²ãåœãŠã解é€ã§ããããã«ããå¿ èŠããããšããããšã§ããããã§æ©èœããã¯ãã§ãã
äžéšã®pointer-size-typesããŒããµã€ãºã«ããããšãã§ããæé©åã¯ãããŸãããïŒ ïŒãŸãã¯ãã®ãããªãã®ïŒïŒ
æè¿ããã«é¢ããRFCããããäºææ§ã®æžå¿µã®ããã«å®è¡ã§ããå¯èœæ§ã¯éåžžã«äœãããã§ãïŒ https ïŒ
ããšãã°ã
Box<Both>
ã¯Box<OnlyOneTrait>
ãã£ã¹ããããŸããã èšèªæ©èœãããããã¹ãŠãã¹ã ãŒãºã«ããã®ãåŸ ã€ããšãã§ãããšç¢ºä¿¡ããŠããŸãããããããããããã¯é ãéã®ãã®ããã§ãã
äžæ¹ããã¬ã€ããªããžã§ã¯ãã®ã¢ãããã£ã¹ãã¯è°è«ã®äœå°ãªãæãŸããããã§ãããã»ãšãã©ã®å Žåããããå®è£ ããããã®åªå/垯åå¹ /æå¿åã®åé¡ã§ãã æè¿ã¹ã¬ããããããŸããïŒ https ïŒ
@ruudaç§ã¯ãã®alloc_system
å®è£
ãæåã«æžãã人ã§ããã alexcrichtonã¯ã <time period>
ã®åªããã¢ãã±ãŒã¿ãŒãªãã¡ã¯ã¿ãªã³ã°äžã«ããã移åããã ãã§ãã
çŸåšã®å®è£
ã§ã¯ãç¹å®ã®ã¡ã¢ãªãããã¯ãå²ãåœãŠãã®ãšåãé
眮ã§å²ãåœãŠã解é€alloc_system
ãå€æŽããããŸã§ã誰ããåŸããªããã°ãªããªãçŸåšã®çŸå®ã§ãã
Windowsã§ã®å²ãåœãŠã§ã¯ãåžžã«MEMORY_ALLOCATION_ALIGNMENT
åæ°ã䜿çšãããŸãïŒãã ãããã€ãã«å²ãåœãŠããµã€ãºã¯èšæ¶ãããŠããŸãïŒã MEMORY_ALLOCATION_ALIGNMENT
ã¯ã32ãããã§ã¯8ã64ãããã§ã¯16ã§ãã ãªãŒããŒã¢ã©ã€ã³ãããã¿ã€ãã®å Žåãã¢ã©ã€ã³ã¡ã³ããMEMORY_ALLOCATION_ALIGNMENT
ãã倧ããããã alloc_system
ã«ãã£ãŠçãããªãŒããŒãããã¯äžè²«ããŠæå®ãããã¢ã©ã€ã³ã¡ã³ãã®éã«ãªãã64ãã€ãã®ã¢ã©ã€ã³ãããå²ãåœãŠã«ã¯64ãã€ãã®ãªãŒããŒãããããããŸãã
ãã®ãªãŒããŒã¢ã©ã€ã³ãããããªãã¯ããã¹ãŠã®å²ãåœãŠã«æ¡åŒµããããšã«ããå ŽåïŒå²ãåœãŠæã«æå®ããã®ãšåãã¢ã©ã€ã³ã¡ã³ãã§å²ãåœãŠã解é€ããèŠä»¶ããªããªããŸãïŒãããå€ãã®å²ãåœãŠã«ãªãŒããŒããããçºçããŸãã ã¢ã©ã€ã³ã¡ã³ããMEMORY_ALLOCATION_ALIGNMENT
ãšåãã§ããå²ãåœãŠã§ã¯ã MEMORY_ALLOCATION_ALIGNMENT
ãã€ãã®äžå®ã®ãªãŒããŒããããçºçããŸãã ã¢ã©ã€ã³ã¡ã³ããMEMORY_ALLOCATION_ALIGNMENT
æªæºã®å²ãåœãŠã§ã¯ãçŽååã®æéã§MEMORY_ALLOCATION_ALIGNMENT
ãã€ãã®ãªãŒããŒããããçºçããŸãã MEMORY_ALLOCATION_ALIGNMENT
åãäžããããå²ãåœãŠã®ãµã€ãºããå²ãåœãŠã®ãµã€ãºã«ãã€ã³ã¿ãŒã®ãµã€ãºãå ãããã®ä»¥äžã®å ŽåããªãŒããŒãããã¯ãããŸããããã以å€ã®å Žåã¯ãªãŒããŒãããããããŸãã å²ãåœãŠã®99.99ïŒ
ããªãŒããŒã¢ã©ã€ã³ãããªãããšãèãããšãããããã¹ãŠã®å²ãåœãŠã«ãã®ãããªãªãŒããŒããããæ¬åœã«çºçãããã§ããïŒ
@ruuda
å人çã«ã¯ãä»æ¥ã®Windowsã§ã®alloc_system
ã®å®è£
ã¯ã Vec
ãããªå¥ã®ã³ã³ãããŒãžã®å²ãåœãŠã®æææš©ãæŸæ£ããæ©èœããã倧ããªã¡ãªããããããšæããŠããŸãã AFAIKã§ãããåžžã«ã¢ã©ã€ã¡ã³ããããã£ã³ã°ããå²ãåœãŠè§£é€ã«ã¢ã©ã€ã¡ã³ããå¿
èŠãšããªãããšã®åœ±é¿ã枬å®ããããŒã¿ã¯ãããŸããã
@joshlf
Windowsã®alloc_system
ã¯ãå²ãåœãŠã§æž¡ãããã®ãšåãé
眮ãå²ãåœãŠè§£é€ã«æž¡ãããããšã«äŸåããŠãããããã³ã¡ã³ãã¯ééã£ãŠãããšæããŸãã
å²ãåœãŠã®99.99ïŒ ããªãŒããŒã¢ã©ã€ã³ãããªãããšãèãããšãããããã¹ãŠã®å²ãåœãŠã«ãã®ãããªãªãŒããŒããããæ¬åœã«çºçãããã§ããïŒ
ãªãŒããŒãããã倧ãããã©ãããããã³ã¡ã¢ãªãŸãã¯ããã©ãŒãã³ã¹ãæé©åãããã©ããã¯ãã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠç°ãªããŸãã ç§ã®çæã¯ãã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã§ã©ã¡ããåé¡ãªããšããããšã§ãããå°æ°ã®å°æ°æŽŸãã¡ã¢ãªã«æ·±ãé¢å¿ãæã£ãŠãããå®éã«ã¯ãããã®äœåãªãã€ããè²·ãäœè£ã¯ãããŸããã ãããŠãå¥ã®å°æ°æŽŸã¯ã¢ã©ã€ã¡ã³ããå¶åŸ¡ããå¿ èŠãããã圌ãã¯æ¬åœã«ãããå¿ èŠãšããŠããŸãã
@alexcrichton
Windowsã®
alloc_system
ã¯ãå²ãåœãŠã§æž¡ãããã®ãšåãé 眮ãå²ãåœãŠè§£é€ã«æž¡ãããããšã«äŸåããŠãããããã³ã¡ã³ãã¯ééã£ãŠãããšæããŸãã
ããã¯ãWindowsã®alloc_system
ãå®éã«Alloc
ãã¬ã€ããé©åã«å®è£
ããŠããªãããšãæå³ããŸãããïŒãããã£ãŠã Alloc
ãã¬ã€ãã®èŠä»¶ãå€æŽããå¿
èŠããããããããŸããïŒã
@ retep998
ç§ãããªãã®ã³ã¡ã³ããæ£ããèªãã§ããå Žåãå¥ã®é 眮ã§å²ãåœãŠã解é€ã§ããå¿ èŠããããã©ããã«é¢ä¿ãªãããã¹ãŠã®å²ãåœãŠã«ãã®é 眮ã®ãªãŒããŒããããååšããŸãããïŒ ã€ãŸãã64ãã€ãã®ã¢ã©ã€ã³ã¡ã³ãã§64ãã€ããå²ãåœãŠã64ãã€ãã®ã¢ã©ã€ã³ã¡ã³ãã§ãå²ãåœãŠã解é€ããå Žåã説æãããªãŒããŒãããã¯äŸç¶ãšããŠååšããŸãã ãããã£ãŠãéåžžããã倧ããé 眮ãèŠæ±ããæ©èœã§ãããããããŸããŸãªé 眮ãå²ãåœãŠè§£é€ã§ããæ©èœã§ã¯ãããŸããã
@joshlf alloc_system
ã«ãã£ãŠåŒãèµ·ãããããªãŒããŒãããã¯ãçŸåšãéåžžããã倧ããé
眮ãèŠæ±ããããšã«ãããã®ã§ãã é
眮ãMEMORY_ALLOCATION_ALIGNMENT
以äžã®å Žåã alloc_system
ã«ãããªãŒããŒãããã¯ãããŸããã
ãã ããç°ãªãé 眮ã§ã®å²ãåœãŠè§£é€ãèš±å¯ããããã«å®è£ ãå€æŽããå Žåãé 眮ã«é¢ä¿ãªãããªãŒããŒãããã¯ã»ãŒãã¹ãŠã®å²ãåœãŠã«é©çšãããŸãã
ãããåãã£ã; çã«ããªã£ãŠããŸãã
ããŒããšïŒããŒãã®äž¡æ¹ã«Allocãå®è£ ããããšã®æå³ã¯äœã§ããïŒ ã©ã®ãããªå Žåã«ããŠãŒã¶ãŒã¯ãããã®implã®1ã€ãšä»ã®implã䜿çšããŸããïŒ
ããã¯ã *mut u8
ããäœã§ããã€ã³ã¿ããæå³ããæåã®æšæºã©ã€ãã©ãªAPIã§ããïŒ String :: from_raw_partsããããŸãããããã¯å®éã«ã¯ãã€ããžã®ãã€ã³ã¿ãæå³ããŸãã ç§ã¯ãäœã§ããã€ã³ã¿ããæå³ãã*mut u8
ãã¡ã³ã§ã¯ãããŸããã ä»ã®ãªãã·ã§ã³ã¯äœã§ããïŒ äžéæïŒOPAQUEïŒåãžã®ãã€ã³ã¿ã®æ¹ãæå³ããããããããŸããã
@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
ã䜿çšããå Žåãèªåèªèº«ãåºå®ããŸãããïŒ èšãæããã°ããããå®å®ãããã°ãå°æ¥ããããæ£ãããããæ©äŒã¯ãããŸããã
ãŸããå°æ¥RFC 2040ã®ãããªæé©åãè¡ãå Žåã«åããŠã *mut ()
ã¯ç§ã«ã¯å°ãå±éºã«æããŸãã
*mut u8
ã®äž»ãªå©ç¹ã¯ããã€ããªãã»ããã§.offsetã䜿çšãããšéåžžã«äŸ¿å©ãªããšã§ãã
æ¬åœã§ãããç°¡åã«let ptr = (foo as *mut u8)
ãå®è¡ããŠãããéœæ°ãªæ¹æ³ã§é²ãããšãã§ããŸãã 説åŸåã®ãã代æ¿æ¡ãããå Žåãããã¯APIã§*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);
// ...
}
ãã¶ãé ãããŸãããïŒ
@joshlfç§ã¯ãããã«ã€ããŠPRãéããŠããã®ãèŠããšæããŸãããæ®ãã®æªç¥æ°ã¯DynSized
ã§ãã
ããã¯ããªããžã§ã¯ãã®ãããªæ§é äœããã¯ã§æ©èœããŸããïŒ æ¬¡ã®ãããªNode<T>
ãšããŸãã
struct Node<T> {
size: u32,
data: T,
// followed by `size` bytes
}
ããã³å€åïŒ
struct V {
a: u32,
b: bool,
}
ããã§ã 1åã®å²ãåœãŠã§ãµã€ãº7ã®æååã䜿çšããŠNode<V>
ãå²ãåœãŠãããšæããŸãã çæ³çã«ã¯ããµã€ãº16ã®å²ãåœãŠã4ã«æããŠãããã«ãã¹ãŠãåããããšæããŸãã4ã¯u32
ã5ã¯V
ã7ã¯æååãã€ãã§ãã ãããæ©èœããã®ã¯ã V
ã®æåŸã®ã¡ã³ããŒã®é
眮ã1ã§ãããæååãã€ãã«ãé
眮1ãããããã§ãã
ããã¯ãã¹ãã¬ãŒãžãžã®æžã蟌ã¿ã¯æªå®çŸ©ã®åäœã§ãããããã¿ã€ããäžèšã®ããã«æ§æãããŠããå Žåãããã¯C / C ++ã§ã¯èš±å¯ãããªãããšã«æ³šæããŠãã ããã ããã¯C / C ++æšæºã®ç©Žã§ãããæ®å¿µãªããä¿®æ£ã§ããªããšæããŸãã ãããå£ããŠããçç±ã詳ãã説æã§ããŸããã代ããã«Rustã«çŠç¹ãåœãŠãŸãããã ããã¯æ©èœããŸããïŒ :-)
Node<V>
æ§é èªäœã®ãµã€ãºãšé
眮ã«é¢ããŠã¯ãRustã³ã³ãã€ã©ã®æ°ãŸããã«ããªãæ
£ããŠããŸãã Rustã¯ãã¹ã¿ãã¯ãããŒããåç
§ã®èåŸãªã©ã Node<V>
ãªããžã§ã¯ããæ³å®ããŠæé©åãè¡ãå¯èœæ§ããããããRustãå¿
èŠãšãããµã€ãºãŸãã¯é
眮ãããå°ãããµã€ãºãŸãã¯é
眮ã§å²ãåœãŠãã®ã¯UBïŒæªå®çŸ©ã®åäœïŒã§ãã -ã³ã³ãã€ã«æã«äºæ³ããããã®ãšäžèŽãããµã€ãºãšé
眮ãæã£ãŠããŸãã
å®éã«ã¯ãçãã¯æ®å¿µãªããããŒã®ããã§ãããã®ããã°ã©ã ãå®è¡ãããšãããå°ãªããšãRust Playgroundã§ã¯ã Node<V>
ã®ãµã€ãºã12ãé
眮ã4ã§ããããšãããããŸãããã€ãŸãã Node<V>
ã¯ãå°ãªããšã12ãã€ããªãã»ããããå¿
èŠããããŸãã Node<V>
å
ã®data.b
ãã£ãŒã«ãã®ãªãã»ããã¯8ãã€ãã®ããã«èŠããŸããããã¯ããã€ã9ã11ãæ«å°Ÿã®ããã£ã³ã°ã§ããããšãæå³ããŸãã æ®å¿µãªããããããã®ããã£ã³ã°ãã€ãã¯ããæå³ã§ã䜿çšãããŠããŸãããããã³ã³ãã€ã©ã¯ããããNode<V>
äžéšãšããŠæ±ããïŒæãéèŠãªããšãšããŠãæžã蟌ã¿ãå«ããŠïŒå¥œããªããšãè¡ãæš©å©ãçä¿ããŸãã Node<V>
ã«å²ãåœãŠããšãããã«äœåãªããŒã¿ããªã¹ããããšãããšãäžæžããããå¯èœæ§ãããããšãæå³ããŸãïŒã
ïŒæ³šïŒRustã³ã³ãã€ã©ãŒãããã¯ãããŠãããšã¯æããªãã¿ã€ããããã¯ããããã®ãšããŠæ±ãããšã¯ã§ããŸããããã ããäœããããã¯ãããŠããããšãRustã³ã³ãã€ã©ãŒã«äŒããããšãã§ããŸããããã«ãããã¿ã€ãã®ã¬ã€ã¢ãŠããå€æŽãããŸãïŒããã£ã³ã°ãåé€ãããŸãïŒã repr(packed)
ïŒ
ãã ããäž¡æ¹ãåãRustã¿ã€ãã®äžéšã«ããã«æ¬¡ã
ã«ãªããžã§ã¯ããã¬ã€ã¢ãŠãããããšã«é¢ããŠã¯ããããæå¹ã§ãããšã»ãŒ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 ïŒ ç§ã®ãŠãŒã¹ã±ãŒã¹ã®TLDRã¯ããµã€ãº16ã®Node<V>
ãååŸã§ãããšãããã®ã§ãããVãrepr(packed)
å Žåã«éããŸãã ãã以å€ã®å Žåãç§ãã§ããæåã®æ¹æ³ã¯ãµã€ãº19ïŒ12 + 7ïŒã§ãã
@SimonSapinããããªã; è©ŠããŠã¿ãŸãã
æ¬åœã«ãã®ã¹ã¬ããã«è¿œãã€ããããç§ã¯ãŸã äœãå®å®åã«å¯ŸããŠæ»ãã§ã»ããããŠããŸããã§ããã é£ããåé¡ã®å®è£ ã¯ãŸã é²ãã§ããŸããã
ç§ã¯éå»æ°ã¶æã®ããã«éã®ããã«å°ãæéãæã£ãŠããããæéã§ããã䞻匵ããŠããïŒç§ã¯åºæ¬çãªåœ¢è³ªã®ãã¶ã€ã³ã¯ããããã®ãœãªã¥ãŒã·ã§ã³ã«åœ±é¿ãäžãããšæããŸãã ããã§ãå®å šã«èªåã®äž»åŒµãããæéããããšã¯æããªãã®ã§ãæåã«å°ãªããšãããããã¹ãŠã®å®å šãªè§£æ±ºçãæžããŠãããããšãé¡ã£ãŠããŸãïŒå³å¯ïŒæ£ãã䜿çšæ³ã匷å¶ããïŒãæè»æ§ã¯äžå¯èœã§ãããšèª°ããç§ã«ééã£ãŠããããšã蚌æããŸããããã³çŸåšã®ç¹æ§ã§äººéå·¥åŠçã ãŸãã¯ãäžéšã®ãã§ãã¯ããã¯ã¹ããªã³ã«ããŸãã
ReïŒ @ Ericson2314ã®ã³ã¡ã³ã
ãã®èŠç¹ãš@alexcrichtonã®äœããå®å®ãããããšããé¡æãšã®å¯Ÿç«ã«é¢é£ãã質åã¯ãæå°éã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®å®ãããããšã§ã©ãã ãã®å©çãåŸãããããšããããšã ãšæããŸãã ç¹ã«ã Alloc
ã¡ãœãããçŽæ¥åŒã³åºãæ¶è²»è
ã¯ã»ãšãã©ããªãããïŒã»ãšãã©ã®ã³ã¬ã¯ã·ã§ã³ã§ãããããããBox
ãŸãã¯ä»ã®åæ§ã®ã³ã³ããã䜿çšããŸãïŒãæ¬åœã®åé¡ã¯æ¬¡ã®ããã«ãªããŸãã Alloc
ã¡ãœãããçŽæ¥åŒã³åºããŠããŸãããïŒ æ£çŽãªãšãããç§ãèããããšãã§ããå¯äžã®æ·±å»ãªãŠãŒã¹ã±ãŒã¹ã¯ãã¢ãã±ãŒã¿ãŒå€åã³ã¬ã¯ã·ã§ã³ïŒã¯ããã«å¹
åºããŠãŒã¶ãŒã»ããã«ãã£ãŠäœ¿çšãããå¯èœæ§ãé«ãïŒãžã®éãéãããšã§ãããããã¯ïŒ27336ã§ãããã¯ãããŠããããã§ãã解決ãããŠããŸãã ç§ãèŠéããŠããä»ã®å€§ããªäœ¿çšäŸããããããããŸãããããã®è¿
éãªåæã«åºã¥ããŠãåŸã§æé©ã§ã¯ãªããšããããããããªãèšèšã«ç§ãã¡ãéã蟌ãããšããç ç²ãæã£ãŠãããããªå©ç¹ããæããªããããå®å®åããé¢ããåŸåããããŸãã
@joshlfã䜿çšãããšã
ããŒãè¯ãç¹ã Alloc
ãå®å®ãããããšãªããã°ããŒãã«ã¢ãã±ãŒã¿ã®æå®ãå®å®ãããããšã¯å¯èœã§ããããïŒ ã€ãŸãã Alloc
ãå®è£
ããã³ãŒãã¯äžå®å®ã§ããå¿
èŠããããŸãããããã¯ããããç¬èªã®ã¯ã¬ãŒãã«ã«ãã»ã«åããããã®ã¢ãã±ãŒã¿ãŒãã°ããŒãã«ã¢ãã±ãŒã¿ãŒãšããŠããŒã¯ããã¡ã«ããºã èªäœã¯å®å®ããŠããŸãã ãããšããå®å®/äžå®å®ãšå®å®ã³ã³ãã€ã©/å€éã³ã³ãã€ã©ãã©ã®ããã«çžäºäœçšãããã誀解ããŠããŸããïŒ
ãã@joshlfã¯ã httpsïŒ //github.com/rust-lang/rust/issues/42774#issuecomment -317279035ã«ããããã«ãïŒ27336ãæ°ãæ£ãããã®ã§ããããšãèŠããŠãããŠä»ã®åé¡ã«ééããã ãããšç¢ºä¿¡ããŠããŸã---ååšããç¹æ§ã®åé¡ããããç§ãä»ããã«ã€ããŠã®äœæ¥ãéå§ããããã«åãããçç±ã§ãã ïŒ27336以éã®äºæž¬ãããå ç©ã«ã€ããŠè°è«ãããããããã¹ãŠã®äººãèŠãããšãã§ããããã«ãªã£ããããããã®åé¡ã«ã€ããŠè°è«ããæ¹ãã¯ããã«ç°¡åã§ãã
@joshlfãã ããã°ããŒãã«ã¢ãã±ãŒã¿ãå®çŸ©ããã¯ã¬ãŒããå®å®ããã³ã³ãã€ã©ã§ã³ã³ãã€ã«ããããšã¯ã§ããŸããã
@sfacklerãããããã ãç§ãæããŠãã誀解ãããïŒP
usize
ã¯ïŒå²ãåœãŠãããè¿œå ãµã€ãºã®ããã«ïŒèŠæ±ãããå²ãåœãŠã®ãµã€ãºã§ã¯excess
ã§ã¯ãªãã total
ãããååExcess(ptr, usize)
ã¯å°ãæ··ä¹±ããŸããå²ãåœãŠã®total
ãµã€ãºã
IMO Total
ã Real
ã Usable
ããŸãã¯ãµã€ãºãå²ãåœãŠã®åèšãµã€ãºãŸãã¯å®éã®ãµã€ãºã§ããããšã瀺ãååã¯ãç§ãèŠã€ãããè¶
éããããåªããŠããŸã誀解ãæãã åãããšã_excess
ã¡ãœããã«ãåœãŠã¯ãŸããŸãã
äžèšã®@gnzlbgã«åæããŸãããã¬ãŒã³ãªïŒptrãusizeïŒã¿ãã«ã§ååã ãšæããŸãã
ãã ãã Excess
ã¯ãæåã®ãã¹ã§å®å®åããããšã¯ææ¡ãããŠããªãããšã«æ³šæããŠãã ããã
æžå¿µãæã£ãŠãã人ãããredditã«é¢ããè°è«ã®ããã«ãã®ã¹ã¬ãããæçš¿ããŸããïŒ https ïŒ
ä»æ¥@ rust-lang / libsãšããã«è©±ãåã£ãåŸãå®å®åã®ææ¡ã«ããã€ãã®èª¿æŽãå ããããšæããŸãã
alloc_zeroed
ãè¿œå ããŸãããã以å€ã®å Žåã¯ã alloc
ãšåãã·ã°ããã£ãæã¡ãŸããextern { type void; }
ãµããŒãã䜿çšããŠAPIã§*mut u8
ã*mut void
ãã @ dtolnayã®æžå¿µã解決ãããšã³ã·ã¹ãã å
šäœã§c_void
ãçµ±åããæ¹æ³ãæäŸããŸããalloc
ã®æ»ãå€ã®åã*mut void
ã«å€æŽãã Result
ãšError
åé€ããŸãããããæãè«è°ãåŒãã§ããã®ã¯æåŸã®ç¹ãªã®ã§ãããã«ã€ããŠã詳ãã説æããããšæããŸãã ããã¯ä»æ¥ã®libsããŒã ãšã®è©±ãåãããçãŸãããã®ã§ãç¹ã«ïŒaïŒ Result
ããŒã¹ã®ã€ã³ã¿ãŒãã§ãŒã¹ã®ABIã®å¹çããã€ã³ã¿ãŒãè¿ããã®ãããäœããïŒbïŒä»æ¥ã®ãæ¬çªãã¢ãã±ãŒã¿ãŒãã»ãšãã©ãªãããšãäžå¿ã«å±éãããŸãããããã¯ãã OOM'dã以äžã®ãã®ãåŠã¶èœåãæäŸããŸãã ããã©ãŒãã³ã¹ã®ããã«ãã»ãšãã©ã®å Žåãã€ã³ã©ã€ã³åãªã©ã§çŽã«æžãããšãã§ããŸããã Error
ã¯äœåãªãã€ããŒãã§ãããæäžå±€ã§åé€ããã®ã¯å°é£ã§ãã
ãšã©ãŒã®ãã€ããŒããè¿ãããã®èãæ¹ã¯ãã¢ãã±ãŒã¿ãŒãå®è£ åºæã®ã€ã³ããã¹ãã¯ã·ã§ã³ãæäŸããŠãå²ãåœãŠã倱æããçç±ãç¥ãããšãã§ãããšããããšã§ããããã§ãªãå Žåãã»ãšãã©ãã¹ãŠã®ã³ã³ã·ã¥ãŒããŒã¯ãå²ãåœãŠãæåããã倱æããããç¥ãã ãã§æžã¿ãŸãã ããã«ãããã¯å®éã«ã¯ããã»ã©é »ç¹ã«åŒã³åºãããªãéåžžã«äœã¬ãã«ã®APIã§ããããšãæå³ãããŠããŸãïŒä»£ããã«ãç©äºãããŸããŸãšããåä»ãAPIã代ããã«åŒã³åºãå¿ èŠããããŸãïŒã ãã®æå³ã§ããã®å Žæã§æã䜿ãããã人éå·¥åŠã«åºã¥ããAPIã䜿çšããããšã¯éèŠã§ã¯ãããŸããããããã©ãŒãã³ã¹ãç ç²ã«ããããšãªããŠãŒã¹ã±ãŒã¹ãæå¹ã«ããããšãããéèŠã§ãã
*mut u8
ã®äž»ãªå©ç¹ã¯ããã€ããªãã»ããã§.offset
ã䜿çšãããšéåžžã«äŸ¿å©ãªããšã§ãã
libsããŒãã£ã³ã°ã§ã¯ã T: Sized
ã«å¯ŸããŠå®çŸ©ãããŠããæ¢åã®offset
ãšç«¶åããªãimpl *mut void { fn offset }
ãææ¡ããŸããã byte_offset
ãŸãã
*mut void
ããã³byte_offset
ã䜿çšããå Žå*mut void
+1ã externã¿ã€ãæ©èœã®å®å®åã«åé¡ãçºçããã®ã§ããããããããšãå®çŸ©ã®ã¿ãäžå®å®ã§ããïŒliballocã¯å
éšã§äžå®å®ãªããšãå®è¡ã§ããïŒã䜿çšã§ã¯ãªãããïŒããšãã°ã let a: *mut void = ...
isnïŒããã®åé¡ãåé¿ã§ããŸããïŒäžå®å®ã§ã¯ãªãïŒïŒ
ã¯ããexternã¿ã€ãã®å®å®åããããã¯ããå¿
èŠã¯ãããŸããã externã¿ã€ãã®ãµããŒããåé€ãããå Žåã§ããããã«å¯ŸããŠå®çŸ©ããvoid
ã¯ãåžžã«éæ³ã®ã¿ã€ãã®ææªã®ã±ãŒã¹ã«ãªãå¯èœæ§ããããŸãã
Alloc
ãšDealloc
ãå¥ã
ã®ç¹æ§ã«ããã¹ããã©ããã«ã€ããŠãlibsäŒè°ã§ããã«è°è«ããããŸãããïŒ
ç¹ã«è§ŠããŸããã§ããããç¹ã«ãããåŸãªãçç±ããªãéããå è¡æè¡ããéžè±ããã¹ãã§ã¯ãªããšäžè¬çã«æããŠããŸããã ç¹ã«ãC ++ã®ã¢ãã±ãŒã¿ãŒã®æŠå¿µã«ã¯åæ§ã®åå²ã¯ãããŸããã
ãã®å Žåããããé©åãªæ¯èŒã§ãããã©ããã¯ããããŸããã C ++ã§ã¯ããã¹ãŠãæ瀺çã«è§£æŸããããããç¬èªã®ã¢ãã±ãŒã¿ãŒã®ã³ããŒïŒãŸãã¯åç
§ïŒãæ ŒçŽããå¿
èŠãããBox
çžåœãããã®ã¯ãããŸããã ãããç§ãã¡ã«ãšã£ãŠå€§ããªãµã€ãºã®ççºãåŒãèµ·ããåå ã§ãã
std::unique_ptr
ã¯ããDeleterãã§ã¯äžè¬çã§ãã
@joshlf unique_ptr
ã¯Box
ã«çžåœãã vector
ã¯Vec
ã«çžåœãã unordered_map
ã¯HashMap
çžåœããŸã
@cramertjãããèå³æ·±ãããšã«ãç§ã¯ã³ã¬ã¯ã·ã§ã³ã®çš®é¡ã ããèŠãŠããŸããã ãã®æã¯ãããããã¹ãããšã®ããã§ãã åŸã§ãã©ã³ã±ããimplãä»ããŠãã€ã§ãè¿œå ã§ããŸããããããåé¿ããæ¹ãããããã¯ãªãŒã³ã§ãã
å æ¬çå®è£ ã¢ãããŒãã¯ãå®éã«ã¯ããã¯ãªãŒã³ãªå ŽåããããŸãã
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)
}
}
ã»ãšãã©ã®ãŠãŒã¹ã±ãŒã¹ã§å¿é ããå¿ èŠã®ããç¹æ§ã1ã€å°ãªããªããŸãã
- allocã®æ»ãå€ã®åã* mut voidã«å€æŽããçµæãšãšã©ãŒãåé€ããŸã
ããããæãè«è°ãåŒãã§ããã®ã¯æåŸã®ç¹ãªã®ã§ãããã«ã€ããŠã詳ãã説æããããšæããŸãã ããã¯ä»æ¥ã®libsããŒã ãšã®è©±ãåãããçãŸãããã®ã§ãç¹ã«ïŒaïŒçµæããŒã¹ã®ã€ã³ã¿ãŒãã§ãŒã¹ã®ABIã®å¹çããã€ã³ã¿ãŒãè¿ãã€ã³ã¿ãŒãã§ãŒã¹ãããäœããïŒbïŒä»æ¥ã®ãæ¬çªãã¢ãã±ãŒã¿ãŒãåŠç¿æ©èœãæäŸããŠããªãããšãäžå¿ã«å±éãããŸããã ãããã¯ãã OOM'dã以äžã®ãã®ã ããã©ãŒãã³ã¹ã®ããã«ãã»ãšãã©ã®å Žåãã€ã³ã©ã€ã³åãªã©ã䜿çšããŠçŽã§èŠãããšãã§ããŸããããšã©ãŒã¯ãæäžå±€ã§åé€ããã®ãé£ããäœåãªãã€ããŒãã§ããããšã«å€ããã¯ãããŸããã
ããã«ãããnullããã§ãã¯ããã«è¿ããããã€ã³ã¿ãéåžžã«ç°¡åã«äœ¿çšã§ããããã«ãªãã®ã§ã¯ãªãããšå¿é
ããŠããŸãã Result<NonZeroPtr<void>, AllocErr>
ãè¿ãã AllocErr
ãŒããµã€ãºã«ããããšã§ããã®ãªã¹ã¯ãè¿œå ããã«ãªãŒããŒããããåãé€ãããšãã§ããããã§ãã
ïŒ NonZeroPtr
ã¯ãhttpsïŒ//github.com/rust-lang/rust/issues/27730#issuecomment-316236397ã§ææ¡ãããŠããããã«ã ptr::Shared
ãšptr::Unique
ãããŒãžãããã®ã§ããïŒ
@SimonSapinã®ãããªResult<NonZeroPtr<void>, AllocErr>
ãããªãã®ã¯ãå®å®åããããã«3ã€ã®ã¿ã€ããå¿
èŠãšããŸãããããã¯ãã¹ãŠçæ°ãããã®ã§ãããæŽå²çã«å®å®åã®ããã«ããªãèŠããã§ãããã®ããããŸãã void
ãããªãã®ã¯å¿
é ã§ã¯ãªããïŒç§ã®æèŠã§ã¯ïŒæã£ãŠãããšäŸ¿å©ã§ãã
ãnullããã§ãã¯ããã«ç°¡åã«äœ¿çšã§ãããããšã«åæããŸããããããéåžžã«äœã¬ãã«ã®APIã§ãããé »ç¹ã«äœ¿çšããããšãæå³ããŠããªããããåŒã³åºãå ã®äººéå·¥åŠã«åãããŠæé©åããå¿ èŠã¯ãªããšæããŸãã
ãŸãã Result<NonZeroPtr<void>, AllocErr>
ãããªããè€éãªæ»ãå€ã®åãæã€å¯èœæ§ã®ããäœã¬ãã«ã®alloc
äžã«ã alloc_one
ãããªé«ã¬ãã«ã®æœè±¡åãæ§ç¯ããããšãã§ããŸãã
AllocErr
ã¯å®éã«ã¯åœ¹ã«ç«ããªãããšã«åæããŸããã Option<NonZeroPtr<void>>
ã©ãã§ããããã ãªãŒããŒããããªãã§èª€ã£ãŠèª€çšããããšãäžå¯èœãªAPIã¯ãRustãCãšåºå¥ãããã®ã®1ã€ã§ãããCã¹ã¿ã€ã«ã®nullãã€ã³ã¿ãŒã«æ»ãããšã¯ç§ã«ãšã£ãŠäžæ©åŸéããããã«æããŸãã ãé »ç¹ã«äœ¿çšããããšãæå³ããŠããªãéåžžã«äœã¬ãã«ã®APIãã§ãããšèšãããšã¯ãéåžžã«äœã¬ãã«ã§ããŸã䜿çšãããŠããªããããäžè¬çã§ãªããã€ã¯ãã³ã³ãããŒã©ãŒã¢ãŒããã¯ãã£ã®ã¡ã¢ãªã®å®å
šæ§ãæ°ã«ããã¹ãã§ã¯ãªããšèšããããªãã®ã§ãã
ãã®é¢æ°ã®æ»ãå€ã®åã«é¢ä¿ãªããã¢ãã±ãŒã¿ãšã®ãã¹ãŠã®å¯Ÿè©±ã«ã¯å®å
šã§ãªãã³ãŒããå«ãŸããŸãã äœã¬ãã«ã®å²ãåœãŠAPIã¯ãæ»ãå€ã®åãOption<NonZeroPtr<void>>
ã*mut void
ãã«é¢ä¿ãªã誀çšãããå¯èœæ§ããããŸãã
ç¹ã«Alloc::alloc
ã¯ãäœã¬ãã«ã§é »ç¹ã«äœ¿çšãããããšãæå³ããŠããªãAPIã§ãã Alloc::alloc_one<T>
ãAlloc::alloc_array<T>
ãããªã¡ãœããã¯ãããé »ç¹ã«äœ¿çšããããããè¯ããæ»ãå€ã®åãæã€ä»£æ¿æ段ã§ãã
ã¹ããŒããã«AllocError
ã¯äŸ¡å€ããããŸããããErrorãå®è£
ãã allocation failure
Display
ãæã€ãŒããµã€ãºã®åãããã°äŸ¿å©ã§ãã ç§ãã¡ãè¡ãå Žåã¯NonZeroPtr<void>
ã«ãŒãããç§ã¯èŠResult<NonZeroPtr<void>, AllocError>
ããã奜ãŸãããšOption<NonZeroPtr<void>>
ã
å®å®åãæ¥ãçç±ïŒïŒ !! Result<NonZeroPtr<void>, AllocErr>
ã¯ãã¯ã©ã€ã¢ã³ãã䜿çšããã®ã«ééããªãåªããŠããŸããããããéåžžã«äœã¬ãã«ã®APIãã§ãããåªããŠããå¿
èŠã¯ãªããšããã®ã¯ãæ°ã®ãããããã«éå¿çã§ãããã¹ãŠã®ã¬ãã«ã®ã³ãŒãã¯ãå¯èœãªéãå®å
šã§ä¿å®å¯èœã§ããåžžã«ç·šéãããŠããªãïŒãããã£ãŠã人ã
ã®çæèšæ¶ã«ããŒãžã³ã°ãããŠããªãïŒãããŸããªã³ãŒãã¯ãªãããã§ãïŒ
ããã«ãç§ã確ãã«æãã§ããããŠãŒã¶ãŒäœæã®allocate-polymorphicã³ã¬ã¯ã·ã§ã³ãããå Žåãããã¯ã¢ãã±ãŒã¿ãŒãçŽæ¥äœ¿çšããããªãè€éãªã³ãŒãã®ãªãŒãã³éã§ãã
åããã¢ã¯ã·ã§ã³ãéçšäžãããªãŒããŒã¹ã®ã³ã¬ã¯ã·ã§ã³ããšã«1åã ãã¢ãã¢ã¯ã¿ãŒãåç
§/ã¯ããŒã³ããããšã»ãŒç¢ºå®ã«èããŠããŸãã ããã¯ãç Žæ£ãããåã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒããã¯ã¹ã«ã¢ãã±ãŒã¿ãŒãæž¡ãããšãæå³ããŸãã ããããç·åœ¢åã䜿çšããã«Rustã§ãããè¡ãæåã®æ¹æ³ã«ã€ããŠã¯æªè§£æ±ºã®åé¡ã§ãã 以åã®ã³ã¡ã³ããšã¯ç°ãªãããã®ããã®ã³ã¬ã¯ã·ã§ã³ã®å®è£
ã«ã¯å®å
šã§ãªãã³ãŒããå«ãŸããŠããŠãåé¡ãããŸãããçæ³çãªãŠãŒã¹ã±ãŒã¹ã§ã¯ãåå²ã¢ãã±ãŒã¿ãŒãšãã¢ãã±ãŒã¿ãŒã®ç¹æ§ã®å®è£
ã§ã¯ãªãã Box
ã®å®è£
ãå€æŽãããããã§ãã ã€ãŸããçŽç·æ§ã劚ããããšãªããå®å®ããé²æ©ãéããããšãã§ããŸãã
@sfacklerãã¢ãã±ãŒã¿ãŒãã¢ãã±ãŒã¿ãŒã«æ¥ç¶ããããã€ãã®é¢é£ã¿ã€ããå¿ èŠã ãšæããŸãã ããããåŸä»ãããããšã¯äžå¯èœãããããŸããã
@ Ericson2314人ã ã¯å®äžçã®å®ç©ã«ã¢ãã±ãŒã¿ãŒã䜿çšãããã®ã§ãå®å®ãããããã®ãã©ãã·ã¥ãããããŸãã ããã¯ç§åŠãããžã§ã¯ãã§ã¯ãããŸããã
ãã®é¢é£ããã¿ã€ãã¯äœã«äœ¿çšãããŸããïŒ
@sfacklerã®äººã ã¯ãŸã æ¯æ©ãã³çãããããšãã§ããŸã/ãããŠãã®çš®ã®é«åºŠãªæ©èœãæ°ã«ããã¿ã€ãã®äººã ã¯ãããå¿«é©ã«è¡ãã¹ãã§ãã [åé¡ãäžå®å®ãªrustcãšäžå®å®ãªRustã§ããå Žåãããã¯ããªã·ãŒã®ä¿®æ£ãå¿ èŠãªå¥ã®åé¡ã§ãã]éã«ãæ°ãã2.0 stdã§ãšã³ã·ã¹ãã ãåå²ãããå Žåãé€ããŠããç²æ«ãªAPIããã€ã¯ããããšã¯ç§ãã¡ãæ°žé ã«åŠšããŸãã
é¢é£ããã¿ã€ãã¯ããã¢ãã±ãŒã¿ãŒãã¢ãã±ãŒã¿ãŒã«é¢é£ä»ããŸãã ãããæ©èœããããã«ã¯ããããããä»ã®ããšãç¥ãå¿ èŠããããŸãã [æ£ããã¿ã€ãã®ééã£ãïŒãïŒã¢ãã±ãŒã¿ãŒã䜿çšãããšããåé¡ã¯ãŸã ãããŸããããã®è§£æ±ºçããªã¢ãŒãã§ææ¡ãã人ã¯èª°ãããªãããšãèªããŸãã]
人ã ãæ¯æ©ãã³çãã§ããã®ãªãããªãç§ãã¡ã¯å®å®ãããã«ããæã£ãŠããã®ã§ããïŒ ã¢ãã±ãŒã¿ãŒAPIãšçŽæ¥å¯Ÿè©±ããŠãã人ã ã®ã»ããã¯ãã°ããŒãã«ã¢ãã±ãŒã¿ãŒã眮ãæãããªã©ããŠãããã®APIãå©çšããã人ã ãããã¯ããã«å°ãªãã§ãã
ãã¢ãã±ãŒã¿ãŒãé¢é£ããã¢ãã±ãŒã¿ãŒã®ã¿ã€ããç¥ãå¿ èŠãããçç±ã瀺ãã³ãŒããèšè¿°ã§ããŸããïŒ C ++ã®ã¢ãã±ãŒã¿APIãåæ§ã®ãããã³ã°ãå¿ èŠãšããªãã®ã¯ãªãã§ããïŒ
人ã ãæ¯æ©ãã³çãã§ããã®ãªãããªãç§ãã¡ã¯å®å®ãããã«ããæã£ãŠããã®ã§ããïŒ
èšèªã®å®å®æ§ã瀺ãããã ãã®ããŒãžã§ã³ã®ãã®ã«å¯ŸããŠäœæããã³ãŒãã¯æ±ºããŠå£ããŸããã æ°ããã³ã³ãã€ã©ãŒã éåžžã«æªããã®ãå¿ èŠãªå Žåã¯æ¯æ©ãã³çãããŸãããã®ä¿èšŒã«å€ããå質ãšèŠãªãããæ©èœã®æåŸã®å埩ãåŸ ã€äŸ¡å€ã¯ãããŸããã
ã¢ãã±ãŒã¿ãŒAPIãšçŽæ¥å¯Ÿè©±ããŠãã人ã ã®ã»ããã¯ãã°ããŒãã«ã¢ãã±ãŒã¿ãŒã眮ãæãããªã©ããŠãããã®APIãå©çšããã人ã ãããã¯ããã«å°ãªãã§ãã
ãã¯ã¯ïŒ ããã¯ãjemallocãããªãŒãã移åãããããªã©ã§ããïŒ ã°ããŒãã«ã¢ãã±ãŒã¿ã®éžæãå¯èœã«ããã²ã©ãããã¯ãå®å®ãããããšãææ¡ãã人ã¯èª°ãããŸãããããŒãèªäœãéçã«ããã ãã§ããïŒ ãããšãç§ã¯ææ¡ãééã£ãŠèªãã ã®ã§ããïŒ
ã°ããŒãã«ã¢ãã±ãŒã¿ã®éžæãå¯èœã«ããã²ã©ãããã¯ã¯å®å®åããããšãææ¡ãããŠããŸããããã¯ãjemallocãããªãŒãã移åã§ããããã«ãããã®ã®ååã§ãã ãã®åé¡ã¯æ®ãã®ååã§ãã
#[global_allocator]
å±æ§ã®å®å®åïŒ https ïŒ
ããã
@ Ericson2314ã°ããŒãã«ã¢ãã±ãŒã¿ãéžæããããã®ã²ã©ãæ¹æ³ã¯äœã ãšæããŸããïŒ
ïŒhttps://github.com/rust-lang/rust/issues/27389#issuecomment-342285805ã§è¿ä¿¡ïŒ
ææ¡ã¯* mutvoidã䜿çšããããã«ä¿®æ£ãããŸããã
@rfcbotã解決ããŸãã* mut u8
@rfcbotã¬ãã¥ãŒ
IRCäžã§ããã€ãã®è°è«ã®åŸãç§ãã¡ã¯å®å®ããã€ããNOT_ARCHIVEDã®_doããšãç解ããäžã§ããããæ¿èªããŠããŸãBox
äžã®æ±çšAlloc
ã代ããã«ããã€ãã®Dealloc
ã§åœ¢è³ªãããã§@sfacklerã«ãã£ãŠææ¡ãããŠããããã«ãé©åãªãã©ã³ã±ããimplã æå³ã誀解ããå Žåã¯ãç¥ãããã ããã
@cramertjæ確ã«ããããã«ãAlloc
å®çŸ©ãç Žããªãããã«ããããšã¯å¯èœã§ããïŒ
@joshlfããã次ã®ããã«ãªããŸãïŒ https ïŒ
ã©ã®ããã«æå®ããŸãDealloc
äžããããã«Alloc
ïŒ ç§ã¯ãã®ãããªãã®ãæ³åããŸããïŒ
pub unsafe trait Alloc {
type Dealloc: Dealloc = Self;
...
}
ããã¯ç§ãã¡ãåä»ãªé åWRThttps ïŒ//github.com/rust-lang/rust/issues/29661ã«çœ®ããšæã
ãããç§ã¯ã®ã»ãæã€æ¹æ³ãªããšæãDealloc
ã®æ¢åã®å®çŸ©ãšã®äžäœäºææ§ãAlloc
ããã©ã«ããæããã«ïŒã€ãŸããé¢é£ããã¿ã€ããæããªããïŒã
ã¢ãã±ãŒã¿ãŒã«å¯Ÿå¿ãããã¢ãã±ãŒã¿ãŒãèªåçã«ååŸã§ããããã«ããå Žåã¯ãé¢é£ä»ããããã¿ã€ãã ãã§ãªãããã¢ãã±ãŒã¿ãŒå€ãçæããé¢æ°ãå¿ èŠã«ãªããŸãã
ããããããã¯å°æ¥ã Alloc
å¥ã®ãµããã¬ã€ãã«æ·»ä»ããããã®ã§åŠçã§ãããšæããŸãã
@sfacklerç解ã§ããŸããã ããªãã®ãã¶ã€ã³ã®äžã§Box::new
ã®çœ²åãæžãåºãããšãã§ããŸããïŒ
ããã¯é 眮æ§æãšãã®ãã¹ãŠãç¡èŠããŠããŸããããããè¡ãããšãã§ãã1ã€ã®æ¹æ³ã¯
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)
}
}
ç¹ã«ãã¿ã€ããç¥ãã ãã§ãªããå®éã«ãã¢ãã±ãŒã¿ãŒã®ã€ã³ã¹ã¿ã³ã¹ãçæã§ããå¿
èŠããããŸãã Alloc
ãBox
ããã©ã¡ãŒã¿ãŒåããŠã代ããã«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
ãDealloc
ãå®è£
ããããã§ã¯ãããŸããã ãããŠãç§ã¯implã®å°éåã¯ãŸã éã®ãã ãšæããŸãããïŒ ã€ãŸããçè«çã«ã¯æ¬¡ã®ãããªããšããããã®ã§ããããŸã ããŸããããªããšæããŸããïŒ
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
ãããã»ã©æçšã§ã¯ãªãããã§ããäžåºŠã«å²ãåœãŠãããšãã§ããã®ã¯1ã€ã ãã§ãããïŒ
é¢é£ããåã®ããã©ã«ãã«ã¯åé¡ããããŸãããïŒ
ãããé¢é£ããåã®ããã©ã«ãã¯ååã«é¢ããŠããã®ã§ããããã«é Œãããšã¯ã§ããªããšæããŸãã
ããã§ãããã£ãšç°¡åã«ããããšãã§ããŸãã
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
ãããã»ã©æçšã§ã¯ãªãããã§ããäžåºŠã«å²ãåœãŠãããšãã§ããã®ã¯1ã€ã ãã§ãããïŒ
ãããè¯ãç¹ã§ãã ããªãã®ä»ã®ã³ã¡ã³ããèãããšããããããšã«ããè«ç¹ã§ãã
deallocator
ã¯self
ã &self
ããŸãã¯&mut self
åãå¿
èŠããããŸããïŒ
ãããã&mut self
ã¯ãä»ã®æ¹æ³ãšäžè²«æ§ãããããã§ãã
ã¯ããŒã³ç¶æ ãªã©ãå¿ èŠãšããªãããã«ãå€ã§èªå·±ãåãããšã奜ãã¢ãã±ãŒã¿ãŒã¯ãããŸããïŒ
self
ãå€ã§ååŸããå Žåã®åé¡ã¯ã Dealloc
ãååŸããŠãããå²ãåœãŠãç¶è¡ã§ããªãããšã§ãã
æ¶ç©ºã®ãã¯ã³ã·ã§ãããã¢ãã±ãŒã¿ãŒãèããŠããŸããããããã©ãã ãæ¬ç©ãã¯ããããŸããã
ãã®ãããªã¢ãã±ãŒã¿ã¯ååšããå¯èœæ§ããããŸããã 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
}
èŠçã ãšã¯æããŸãããããã§èª¬æããŠããå€æŽã¯ååã«å€§ãããããalloc / deallocã®åå²ç¹æ§ã䜿çšããŠé²ããå Žåã¯ãæåã«stdã§è©ŠããŠãããåFCPãå®è¡ããå¿ èŠããããŸãã
ãã®ãããªãã®ãå®è£ ãããã®ãåŸ ã€ã¿ã€ã ã©ã€ã³ã¯äœã§ããïŒ
grow_in_place
ã¡ãœããã¯ããããªãçš®é¡ã®è¶
é容éãè¿ããŸããã çŸåšãã¬ã€ã¢ãŠãã䜿çšããŠusable_size
ãåŒã³åºãããã®ã¬ã€ã¢ãŠãã«_å°ãªããšã_é©åããããã«å²ãåœãŠãæ¡åŒµããŸãããå²ãåœãŠããã®ã¬ã€ã¢ãŠããè¶
ããŠæ¡åŒµãããå ŽåããŠãŒã¶ãŒã¯ç¥ãæ¹æ³ããããŸããã
alloc_excess
ããã³realloc_excess
ã«å¯Ÿããalloc
ããã³realloc
ã¡ãœããã®å©ç¹ãç解ããã®ã«èŠåŽããŠããŸãã
ã¢ãã±ãŒã¿ã¯ãå²ãåœãŠãå®è¡ããããã«é©åãªã¡ã¢ãªãããã¯ãèŠã€ããå¿ èŠããããŸããããã«ã¯ãã¡ã¢ãªãããã¯ã®ãµã€ãºãç¥ãå¿ èŠããããŸãã 次ã«ã¢ãã±ãŒã¿ããã€ã³ã¿ãè¿ãããã¿ãã«ãã¡ã¢ãªãããã¯ã®ãã€ã³ã¿ãšãµã€ãºããããã©ãŒãã³ã¹ã«æž¬å®å¯èœãªéããããããããšã¯ãããŸããã
ãããã£ãŠã alloc
ãšrealloc
ã¯ãAPIãµãŒãã§ã¹ãå¢ããã ãã§ãããã©ãŒãã³ã¹ã®äœãã³ãŒãã®èšè¿°ãä¿é²ããŠããããã§ãã ãªãAPIã«ããããããã®ã§ããïŒ åœŒãã®å©ç¹ã¯äœã§ããïŒ
ç·šéïŒèšãæãããšãAPIã§å²ãåœãŠãããå¯èœæ§ã®ãããã¹ãŠã®é¢æ°ã¯ã Excess
ãè¿ãå¿
èŠããããŸããããã«ãããåºæ¬çã«ãã¹ãŠã®_excess
ã¡ãœãããäžèŠã«ãªããŸãã
éå°ã¯ã倧ãããªãå¯èœæ§ã®ããé
åãå«ããŠãŒã¹ã±ãŒã¹ã§ã®ã¿èå³æ·±ããã®ã§ãã ããšãã°ã Box
ãBTreeMap
ã圹ã«ç«ããªãããé¢é£æ§ããããŸããã è¶
éåãèšç®ããã®ã«ããããã®ã³ã¹ãããããå¯èœæ§ãããã確ãã«ãã£ãšè€éãªAPIãããã®ã§ãè¶
é容éãæ°ã«ããªãã³ãŒãããããæ¯æãããšã匷å¶ãããã¹ãã§ã¯ãªãããã«æããŸãã
è¶ éåãèšç®ããã«ã¯ãããããã®ã³ã¹ãããããå ŽåããããŸãã
äŸãæããŠããã ããŸããïŒ ã¡ã¢ãªãå²ãåœãŠãããšã¯ã§ããããå®éã«å²ãåœãŠãããŠããã¡ã¢ãªã®éãããããªãã¢ãã±ãŒã¿ã¯ããããŸããããŸããæ³åãã§ããŸããïŒ Excess
ãšã¯ïŒå²ãåœãŠãããã¡ã¢ãªã®å®éã®éã§ããååãå€æŽããŸãïŒã
ãããå°ãç©è°ãéžããããããªãå¯äžã®äžè¬çã«äœ¿çšãããAlloc
atorã¯ãPOSIX malloc
ãããã¯ãåžžã«Excess
å
éšã§èšç®ããŸãããCã®äžéšãšããŠå
¬éããŸããã APIã ãã ããèŠæ±ããããµã€ãºãExcess
ãšããŠè¿ãããšã¯åé¡ãªãã移æ€å¯èœã§ãåçŽã§ããŸã£ããè²»çšããããããPOSIX malloc
ã䜿çšãããã¹ãŠã®äººããšã«ãããã§ã«æ³å®ããŠããããšã§ãã
jemalloc
ãšåºæ¬çã«ä»ã®Alloc
atorã¯ãã³ã¹ãããããã«Excess
ãè¿ãAPIãæäŸããããããããã®ã¢ãã±ãŒã¿ãŒã®å Žåã Excess
è¿ãããšã¯ãŒãã§ããã³ã¹ããã
è¶ éåãèšç®ããã®ã«ããããã®ã³ã¹ãããããå¯èœæ§ãããã確ãã«ãã£ãšè€éãªAPIãããã®ã§ãè¶ é容éãæ°ã«ããªãã³ãŒãããããæ¯æãããšã匷å¶ãããã¹ãã§ã¯ãªãããã«æããŸãã
çŸåšã誰ããã¡ã¢ãªãå²ãåœãŠãããã®2ã€ã®APIãæã€ã¢ãã±ãŒã¿ãã¬ã€ãã®äŸ¡æ Œããã§ã«æ¯æã£ãŠããŸãã 1ãæ§ç¯ããããšãã§ããŸãããªããExcess
ã®äžã«-less API Excess
-full one`ããéã¯çã§ã¯ãããŸããã ã ããç§ã¯ãªãããããã®ããã«è¡ãããªãã®ã ãããïŒ
Alloc
ç¹æ§ã¡ãœããã¯åžžã«Excess
è¿ããŸãAlloc
ã䜿çšããã®ã«åå泚æããŠãããã2ïŒäœ¿çšããªããã¹ãŠã®ãŠãŒã¶ãŒã«å¯ŸããŠã Alloc
ã¡ãœããããExcess
ãåé€ããExcessLessAlloc
ç¹æ§ãè¿œå ããŸããçŸåšå²ãåœãŠãããŠããå®éã®ã¡ã¢ãªéã«æ³šæããŠãã ããïŒç§ã«ã¯ãããã®ããã«èŠããŸããããã®ãããªAPIããããšäŸ¿å©ã ãšæããŸãïŒExcess
ãªãã®ã¡ãœããã®é«éãã¹ã䜿çšããŠAlloc
atorãå®è£
ããæ¹æ³ãçºèŠããå Žåããã€ã§ãExcessLessAlloc
ã«ã¹ã¿ã å®è£
ãæäŸã§ããŸããFWIW Alloc
äžã«å¿
èŠãªãã®ãå®è£
ã§ããªãããããã®ã¹ã¬ããã«åã³ã¢ã¯ã»ã¹ããŸããã 以åã«grow_in_place_excess
ãæ¬ èœããŠãããšè¿°ã¹ãŸãããã alloc_zeroed_excess
ãæ¬ èœããŠããããïŒãããŠèª°ãä»ã«äœãç¥ã£ãŠãããïŒãåã³è¡ãè©°ãŸããŸããã
ããã§ã®å®å®åããæåã«Excess
-fullAPIã®å®å®åã«çŠç¹ãåãããã°ãã£ãšå¿«é©ã«ãªããŸãã ãã®APIããã¹ãŠã®çšéã§æã人éå·¥åŠçã§ã¯ãªãå Žåã§ãããã®ãããªAPIã¯å°ãªããšããã¹ãŠã®çšéãèš±å¯ããŸããããã¯ãèšèšã«æ¬ é¥ããªãããšã瀺ãããã«å¿
èŠãªæ¡ä»¶ã§ãã
äŸãæããŠããã ããŸããïŒ ã¡ã¢ãªãå²ãåœãŠãããšã¯ã§ããããå®éã«å²ãåœãŠãããŠããã¡ã¢ãªã®éãããããªãã¢ãã±ãŒã¿ã¯ããããŸããããŸããæ³åãã§ããŸããïŒ
Excess
ãšã¯ïŒå²ãåœãŠãããã¡ã¢ãªã®å®éã®éã§ããååãå€æŽããŸãïŒã
ä»æ¥ã®ã»ãšãã©ã®ã¢ãã±ãŒã¿ã¯ãµã€ãºã¯ã©ã¹ã䜿çšããŸããåãµã€ãºã¯ã©ã¹ã¯ç¹å®ã®åºå®ãµã€ãºã®ãªããžã§ã¯ãã®ã¿ãå²ãåœãŠãç¹å®ã®ãµã€ãºã¯ã©ã¹ã«é©åããªãå²ãåœãŠèŠæ±ã¯ãå
éšã«é©åããæå°ãµã€ãºã¯ã©ã¹ã«åãäžããããŸãã ãã®ã¹ããŒã ã§ã¯ããµã€ãºã¯ã©ã¹ãªããžã§ã¯ãã®é
åãäœæããŠããclasses[size / SIZE_QUANTUM].alloc()
ãå®è¡ããã®ãäžè¬çã§ãã ãã®äžçã§ã¯ãã©ã®ãµã€ãºã®ã¯ã©ã¹ã䜿çšãããŠããããç解ããã«ã¯ãè¿œå ã®æ瀺ãå¿
èŠã§ããããšãã°ã let excess = classes[size / SIZE_QUANTUM].size
ã ããã»ã©å€ãã¯ãªããããããŸããããé«æ§èœã¢ãã±ãŒã¿ïŒjemallocãªã©ïŒã®ããã©ãŒãã³ã¹ã¯åäžã®ã¯ããã¯ãµã€ã¯ã«ã§æž¬å®ããããããç¹ã«ãã®ãµã€ãºãé¢æ°ã®ãªã¿ãŒã³ã®ãã§ãŒã³ãééããå Žåã¯ãæå³ã®ãããªãŒããŒããããè¡šãå¯èœæ§ããããŸãã
äŸãæããŠããã ããŸããïŒ
å°ãªããšãPRããalloc_jemallocã«ç§»è¡ãããšã alloc_excess
ã¯alloc
ãããæããã«å€ãã®ã³ãŒããå®è¡ããŠããŸãïŒ https ïŒ
ãã®ã¹ããŒã ã§ã¯ããµã€ãºã¯ã©ã¹ãªããžã§ã¯ãã®é åãäœæããŠããclasses [size / SIZE_QUANTUM] .allocïŒïŒãå®è¡ããã®ãäžè¬çã§ãã ãã®äžçã§ã¯ã䜿çšãããŠãããµã€ãºã¯ã©ã¹ãææ¡ããã«ã¯ãè¿œå ã®æé ãå¿ èŠã§ããããšãã°ãexcess = classes [size / 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ããalloc_jemallocã«ç§»è¡ãããšãalloc_excessã¯allocãããæããã«å€ãã®ã³ãŒããå®è¡ããŠããŸãã
ãã®PRã¯ãã°ä¿®æ£ïŒããã©ãŒãã³ã¹ä¿®æ£ã§ã¯ãããŸããïŒã§ãããããã©ãŒãã³ã¹ã«é¢ããŠã¯ãjemallocã¬ã€ã€ãŒã®çŸåšã®ç¶æ ã«å€ãã®åé¡ããããŸããããã®PRãªã®ã§ãå°ãªããšã次ã®ããã«ãªããŸãã
nallocx
ã¯ãGCCã®æå³ã§ã®const
é¢æ°ãã€ãŸãçã®çŽç²é¢æ°ã§ãã ããã¯ãå¯äœçšããªããçµæãåŒæ°ã®ã¿ã«äŸåããã°ããŒãã«ç¶æ
ã«ã¢ã¯ã»ã¹ãããåŒæ°ããã€ã³ã¿ãŒã§ã¯ãªãããšãæå³ããŸãïŒãããã£ãŠãé¢æ°ã¯ã°ããŒãã«ç¶æ
ã«ã¢ã¯ã»ã¹ã§ãããããããã¹ããŒããŸãïŒãC/ C ++ããã°ã©ã ã®å ŽåãLLVMã¯ããã䜿çšã§ããŸããçµæã䜿çšãããªãå Žåã«åŒã³åºããåé€ããããã®æ
å ±ã AFAIK Rustã¯çŸåšãFFICé¢æ°ãconst fn
ãªã©ãšããŠããŒã¯ããããšã¯ã§ããŸããã ãããã£ãŠãããã¯ä¿®æ£ã§ããæåã®ããšã§ãããã€ã³ã©ã€ã³åãšæé©åãé©åã«æ©èœããéããè¶
éåã䜿çšããªãå Žåã¯realloc_excess
ãŒãã³ã¹ãã«ãªããŸããnallocx
ã¯ãåžžã«mallocx
å
ã®æŽåãããå²ãåœãŠã«å¯ŸããŠèšç®ãããŸããã€ãŸãããã¹ãŠã®ã³ãŒãã¯ãã§ã«ãããèšç®ããŠããŸããã mallocx
ã¯çµæãç Žæ£ãããããããã§ã¯å®éã«2åèšç®ããŠããŸãã ãå Žåã«ãã£ãŠã¯nallocx
ã¯mallocx
nallocx
ãšã»ãŒåããããé«äŸ¡ã§ã...ãã©ã³ãã«ãã®ãããªãã®ã®ãã³ãããŒã¯ãããjemallocatorã®ãã©ãŒã¯ããããŸãããããã¯ã¢ããã¹ããªãŒã ã§ä¿®æ£ããå¿
èŠããããŸããããæšãŠãªãAPIãæäŸããããšã«ããjemallocã ãã ãããã®ä¿®æ£ã¯ãçŸåšExcess
ã䜿çšããŠãããã®ã«ã®ã¿åœ±é¿ããŸããããã§ããããã¯ããå€ãã®ã³ãŒãã®ããã«èŠããŸããããã®äœåãªã³ãŒãã¯ãå®éã«2ååŒã³åºããŠããã³ãŒãã§ããããã¯ãæåã«åŒã³åºãããšãã«çµæãç Žæ£ããããã§ãã ä¿®æ£ããããšã¯äžå¯èœã§ã¯ãããŸããããç§ã¯ãŸã ãããä¿®æ£ããæéãèŠã€ããŠããŸããã
ç·šéïŒ @sfacklerä»æ¥ã¯ãªããšãæéãalloc
ã«é¢ããŠalloc_excess
ãç¡æãã«ããããšãã§ãããªãŒããŒãããã¯çŽ1nsãããããŸããã§ããã jemallocsã®é«éãã¹ã ãã¡ã¹ããã¹ã«ã€ããŠã¯ããŸã詳ãã調ã¹ãŠããŸãããããããããã«æ¹åã§ããå¯èœæ§ããããŸãã 詳现ã¯ãã¡ãïŒ https ïŒ
ããã§ããïŒ
ã¯ãã
ãããã£ãŠãããã¯ä¿®æ£ã§ããæåã®ããšã§ãããã€ã³ã©ã€ã³åãšæé©åãé©åã«æ©èœããéããè¶ éåã䜿çšããªãå Žåã¯realloc_excessã®ã³ã¹ãããŒãã«ããŸãã
ã°ããŒãã«ã¢ãã±ãŒã¿ãšããŠäœ¿çšããå Žåããããã€ã³ã©ã€ã³åããããšã¯ã§ããŸããã
ãã®APIããã¹ãŠã®çšéã§æã人éå·¥åŠçã§ã¯ãªãå Žåã§ãããã®ãããªAPIã¯å°ãªããšããã¹ãŠã®çšéãèš±å¯ããŸããããã¯ãèšèšã«æ¬ é¥ããªãããšã瀺ãããã«å¿ èŠãªæ¡ä»¶ã§ãã
alloc_excess
ãåŒã³åºãGithubã«ã¯æåéããŒãã®ã³ãŒãããããŸãã ãããéåžžã«éèŠãªæ©èœã§ããå Žåããªã誰ãããã䜿çšããããšããªãã®ã§ããïŒ C ++ã®å²ãåœãŠAPIã¯ãéå°ãªå®¹éãžã®ã¢ã¯ã»ã¹ãæäŸããŸããã ãããã®æ©èœãããã©ãŒãã³ã¹ãåäžããããšããå®éã®å
·äœçãªèšŒæ ãããã誰ããå®éã«ãããã䜿çšããã®ã«ååæ°ãé
ã£ãŠããå Žåãäžäœäºææ§ã®ããæ¹æ³ã§å°æ¥ãããã®æ©èœãè¿œå /å®å®åããããšã¯éåžžã«ç°¡åã«æããŸãã
ã°ããŒãã«ã¢ãã±ãŒã¿ãšããŠäœ¿çšããå Žåããããã€ã³ã©ã€ã³åããããšã¯ã§ããŸããã
jemalloc
ãããªã°ããŒãã«ã¢ãã±ãŒã¿ã¯ããã«äŸåããŠãããããå°ãªããšãLTOãã«ãã§ã¯ãããã解決ããå¿
èŠããããŸãã nallocx
ã¯ã_èšèšã«ãã_æ¹æ³ã§ãããæåã®æšå¥šäºé
ã§ãã jemallocã®éçºè
ã¯ã alloc_excess
ããã©ãŒãã³ã¹ã«é¢ããŠããããã®åŒã³åºããã€ã³ã©ã€ã³åããå¿
èŠããããCå±æ§ãé©åã«äŒæããŠãã³ã³ãã€ã©ãŒãåŒã³åºããµã€ãããnallocx
åŒã³åºããåé€ããããã«ããŸããã Cããã³C ++ã³ã³ãã€ã©ãšåæ§ã«ã Excess
䜿çšããŸãã
ãããã§ããªãå Žåã§ãã jemalloc
APIã«ããããé©çšããããšã§ã Excess
APIããŒãã³ã¹ãã«ããããšãã§ããŸãïŒãã®ãããªãããã®åæå®è£
ã¯ãrust-lang /ã«ãããŸãã jemallocãã©ãŒã¯ïŒã ãã®APIãèªåã§ç¶æããããšããã¢ããã¹ããªãŒã ã«é
眮ããããšãã§ããŸãããã¢ããã¹ããªãŒã ã«é
眮ããã«ã¯ããããã®ä»ã®èšèªããããã®æé©åãå®è¡ã§ããRustãå®è¡ã§ããªãçç±ã«ã€ããŠé©åãªã±ãŒã¹ãäœæããå¿
èŠããããŸãã ãŸãã¯ããã®æ°ããAPIã¯ã Excess
å¿
èŠãšãããŠãŒã¶ãŒã«ãšã£ãŠã mallocx + nallocx
ããã倧å¹
ã«é«éã§ãããªã©ã®å¥ã®åŒæ°ãå¿
èŠã§ãã
ãããéåžžã«éèŠãªæ©èœã§ããå Žåããªã誰ãããã䜿çšããããšããªãã®ã§ããïŒ
ããã¯è¯ã質åã§ãã std::Vec
ã¯ã Excess
APIã䜿çšããããã®ãã¹ã¿ãŒã®åã§ãããçŸåšã¯äœ¿çšããŠããŸããã以åã®ã³ã¡ã³ãã¯ãã¹ãŠãããããšããã¯Excess
ããæ¬ èœããŠããŸãã APIãã¯ç§ãVec
ããã䜿ãããããšããŠããŸããã Excess
APIïŒ
Excess
ããŸã£ããè¿ããªãã£ãïŒ https ïŒ grow_in_place_excess
ãalloc_zeroed_excess
ãªã©ã®æ©èœãäžè¶³ããŠããŸãããªã誰ããã®APIã䜿çšããŠããªãã®ãããããŸããã ãããã std
ã©ã€ãã©ãªã§ããããããæé©ãªããŒã¿æ§é ïŒ Vec
ïŒã«äœ¿çšã§ããªãããšãèãããšãæšæž¬ããªããã°ãªããªãå Žåãäž»ãªçç±ã¯æ¬¡ã®ãšããã§ãããã®APIã¯çŸåšå£ããŠããŸãã
ããã«æšæž¬ããªããã°ãªããªãå Žåãäž»ã«åäžã®std
ã³ã¬ã¯ã·ã§ã³ã䜿çšããŠããªãããïŒãã®APIãæåã«ãã¹ãããããšäºæ³ãããå ŽæïŒããã®APIãèšèšãã人ã§ãã䜿çšããŠããªããšèšããŸãããŸãã _excess
ãšExcess
ã©ãã§ã䜿çšããŠusable_size
/ allocation_size
ãæå³ããã®ã¯ãããã°ã©ãã³ã°ãéåžžã«æ··ä¹±ããç
©ãããããã§ãã
ããã¯ããããã Excess
å°ãªãAPIã«ããå€ãã®äœæ¥ãè²»ãããã2ã€ã®APIãããå Žåããããã®åæãç¶æããã®ãé£ããããŠãŒã¶ãŒãäž¡æ¹ãèŠã€ããŠã©ã¡ãã䜿çšããããç¥ãã®ãé£ããããã§ãããããŠæåŸã«ããŠãŒã¶ãŒãæ£ããããšãããããã䟿å©ãã奜ãã®ã¯é£ããã§ãã
ã€ãŸãã競åããAPIã2ã€ãããäœæ¥ã®100ïŒ ãäžæ¹ã®æ¹åã«ã0ïŒ ãä»æ¹ã®æ¹åã«è²»ãããå Žåãäžæ¹ãå®éã«å€§å¹ ã«æ©èœããŠãããšããçµè«ã«éããã®ã¯åœç¶ã®ããšã§ããä»ãããåªããŠããŸãã
ç§ã®ç¥ãéããGithubã§ã®jemallocãã¹ã以å€ã®nallocx
ãžã®åŒã³åºãã¯2ã€ã ãã§ãã
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ã«äŒŒãŠããŸããããã¹ã¿ã³ãã¢ãã³ã§äœ¿çšãããŠãå²ãåœãŠãµã€ãºãäœæãããåã«èšç®ãããŸãã
Apache Arrowã¯ãå®è£
ã§nallocx
ã䜿çšããããšãæ€èšããŸããããããŸãæ©èœããªãããšãããããŸããã
https://issues.apache.org/jira/browse/ARROW-464
ãããã¯åºæ¬çã«ç§ãèŠã€ããããšãã§ããnallocx
ãžã®å¯äžã®åç
§ã§ãã ã¢ãã±ãŒã¿ãŒAPIã®æåã®å®è£
ããã®ãããªãããŸããªæ©èœããµããŒãããããšãéèŠãªã®ã¯ãªãã§ããïŒ
ç§ã®ç¥ãéããGithubã§ã®jemallocãã¹ã以å€ã®nallocxãžã®åŒã³åºãã¯2ã€ã ãã§ãã
ç§ã®é ã®ãŠã£ãºããããå°ãªããšãfacebookã®ãã¯ã¿ãŒã¿ã€ããfacebookã®mallocå®è£
ãä»ããŠããã䜿çšããŠããããšãç¥ã£ãŠããŸãïŒ mallocãšfbvectorã®æé·ããªã·ãŒ;ããã¯facebookã®C ++ã®ãã¯ã¿ãŒã®å€§ããªå¡ã§ãïŒãããŠãŸãChapelã¯ãããæ¹åããããã«äœ¿çšããŸããString
ã¿ã€ãã®ããã©ãŒãã³ã¹ïŒãããšè¿œè·¡ã®åé¡ïŒã ã§ã¯ãä»æ¥ã¯Githubã®æé«ã®æ¥ã§ã¯ãªãã£ãã®ã§ããããã
ã¢ãã±ãŒã¿ãŒAPIã®æåã®å®è£ ããã®ãããªãããŸããªæ©èœããµããŒãããããšãéèŠãªã®ã¯ãªãã§ããïŒ
ã¢ãã±ãŒã¿APIã®æåã®å®è£ ã§ã¯ããã®æ©èœããµããŒãããå¿ èŠã¯ãããŸããã
ãã ãããã®æ©èœãé©åã«ãµããŒããããšããã®ãããªAPIã®å®å®åããããã¯ãããã¯ãã§ãã
éæ¹åã«è¿œå ã§ããã®ã«ããªãå®å®åããããã¯ããå¿ èŠãããã®ã§ããïŒåŸã§äºææ§ããããŸããïŒ
éæ¹åã«è¿œå ã§ããã®ã«ããªãå®å®åããããã¯ããå¿ èŠãããã®ã§ããïŒåŸã§äºææ§ããããŸããïŒ
å°ãªããšãç§ã«ãšã£ãŠã¯ããã¶ã€ã³ã¹ããŒã¹ã®ååã ããååã«èª¿æ»ãããŠããããšãæå³ããŸãã
APIã®éå°ã«é¢é£ããªãéšåã¯ãéå°ã«é¢é£ããæ©èœã®èšèšã«ãã£ãŠåœ±é¿ãåãããšæããŸããïŒ ç§ã¯ãã®è°è«ã«äžéå端ã«ããåŸããªãã£ãããšãèªããŸãããããã¯ç§ã«ã¯ããããããªãããã§ãã
ãã®APIãäœæã§ããªãå ŽåïŒ
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(...);
ããããç§éã¯ãã倧ããªåé¡ãæ±ããŠããŸãã
APIã®éå°ã«é¢é£ããªãéšåã¯ãéå°ã«é¢é£ããæ©èœã®èšèšã«ãã£ãŠåœ±é¿ãåãããšæããŸããïŒ
ããã§ããç§ã¯ãéå°ãªAPIããéå°ã«é¢é£ããªãæ©èœã®èšèšã«å€§ããªåœ±é¿ãäžããããšãæåŸ ããŠããŸããããã¯å®å šã«åé€ãããŸãã
ããã«ããã2ã€ã®APIãåæããŠããããexcess-apiã®æ©èœãexcess-lessã®APIãããå°ãªããšããçŸåšã®ç¶æ³ãé²ãããšãã§ããŸãã éå°ãªAPIã®äžã«éå°ãªå°ãªãAPIãæ§ç¯ããããšã¯ã§ããŸããããã®éã¯åœãŠã¯ãŸããŸããã
Excess
ãããããããã人ã¯ããããããããããå¿
èŠããããŸãã
æ確ã«ããããã«ãäžäœäºææ§ã®ããæ¹æ³ã§äºåŸã«alloc_excess
ã¡ãœãããè¿œå ããæ¹æ³ãããã°ãããã§å€§äžå€«ã§ããïŒ ïŒãã¡ããã alloc_excess
ãªãã§å®å®ããããšããããšã¯ãåŸã§è¿œå ããããšã¯é倧ãªå€æŽã«ãªãããšãæå³ããŸããç§ã¯ãã å°ããŠããã®ã§ãããªãã®çç±ãç解ããŠããŸãïŒ
@joshlfãããè¡ãã®ã¯éåžžã«ç°¡åã§ãã
è¶ éåãããããããã人ã¯ãããããããããå¿ èŠããããŸãã
ãããã¯ãéå°ãªå®¹éãæ°ã«ãã0.01ïŒ ã®äººãå¥ã®æ¹æ³ã䜿çšã§ããŸãã
@sfacklerããã¯ãéãã2é±éã®äŒæ©ãåãããšã§åŸããããã®ã§ã-ããã©ã«ãã®ã¡ãœããimplsãå¿ããŠããŸã:)
ãããã¯ãéå°ãªå®¹éãæ°ã«ãã0.01ïŒ ã®äººãå¥ã®æ¹æ³ã䜿çšã§ããŸãã
ãã®çªå·ã¯ã©ãã§å ¥æã§ããŸããïŒ
ç§ã®RustããŒã¿æ§é ã¯ãã¹ãŠã¡ã¢ãªå
ã§ãã©ããã§ãã ãããå®è¡ã§ããããšããç§ãRustã䜿çšããå¯äžã®çç±ã§ãã ãã¹ãŠãããã¯ã¹åã§ããã°ãå¥ã®èšèªã䜿çšããããšã«ãªããŸãã ã ããç§ã¯ãã€ãExcess
0.01%
ãæ°ã«ããŸãããç§ã¯ãã€ããããæ°ã«ããŸãã
ããã¯ãã¡ã€ã³åºæã§ãããä»ã®ãã¡ã€ã³ã§ã¯Excess
æ°ã«ããªãããšã¯ç解ããŠããŸãããRustãŠãŒã¶ãŒã®0.01ïŒ
ã ãããããæ°ã«ãããŠãããšã¯æããŸããïŒã€ãŸããå€ãã®äººãVec
䜿çšããŠããŸãïŒ String
ã Excess
åã®ããŒã¿æ§é ã§ãïŒã
ãã®æ°ã¯ãmallocã䜿çšãããã®ã®ã»ãããšæ¯èŒããŠãnallocxã䜿çšãããã®ãåèšã§çŽ4ã€ãããšããäºå®ããåŸãŠããŸãã
@gnzlbg
æåãããæ£ãããå®è¡ããå Žåã fn alloc(layout) -> (ptr, excess)
ããã fn alloc(layout) -> ptr
ã¯ãŸã£ãããªãããšã瀺åããŠããŸããïŒ ããã¯ç§ã«ã¯æããã§ã¯ãªãããã§ãã è¶
éåãå©çšã§ããå Žåã§ãã alloc_excess(layout).0
ãšããŠå®è£
ãããŠããå Žåã§ããè¶
éåãåé¡ã«ãªããªããŠãŒã¹ã±ãŒã¹ïŒã»ãšãã©ã®ããªãŒæ§é ãªã©ïŒã«ã¯åŸè
ã®APIã䜿çšããã®ãèªç¶ãªããã§ãã
@rkruppe
ããã¯ç§ã«ã¯æããã§ã¯ãªãããã§ãã è¶ éãå©çšå¯èœã§ãã£ãŠããalloc_excessïŒlayoutïŒ.0ãšããŠå®è£ ãããŠããå Žåã§ããè¶ éãåé¡ã«ãªããªããŠãŒã¹ã±ãŒã¹ïŒã»ãšãã©ã®ããªãŒæ§é ãªã©ïŒã«åŸè ã®APIã䜿çšããã®ã¯èªç¶ãªããšã®ããã§ãã
çŸåšãexcess-full APIã¯ãexcess-lessAPIã®äžã«å®è£
ãããŠããŸãã è¶
éã®ãªãã¢ãã±ãŒã¿ã«Alloc
ãå®è£
ããã«ã¯ããŠãŒã¶ãŒãalloc
dealloc
ã¡ãœãããš
ãã ããexcess-fullã¢ãã±ãŒã¿ã«Alloc
ãå®è£
ããå Žåã¯ãããã«å€ãã®ã¡ãœãããæäŸããå¿
èŠããããŸãïŒå°ãªããšãã alloc_excess
ã§ããã realloc_excess
ã«å
¥ããšãããã¯å€§ãããªããŸãã alloc_zeroed_excess
ã grow_in_place_excess
ã...ïŒã
éã®å Žåãã€ãŸããexcess-less APIãexcess-full APIã®äžã«åªãããã®ãšããŠå®è£
ãã alloc_excess
ãšdealloc
å®è£
ããã ãã§ãµããŒãã§ããŸããäž¡æ¹ã®ã¿ã€ãã®ã¢ãã±ãŒã¿ã
è¶ éåãæ°ã«ããªãããŸãã¯è¿éãŸãã¯ç §äŒã§ããªããŠãŒã¶ãŒã¯ãå ¥åãµã€ãºãŸãã¯ã¬ã€ã¢ãŠããè¿ãããšãã§ããŸããïŒããã¯å°ããªäžäŸ¿ã§ãïŒãè¶ éåãåŠçã§ããåŠçããããŠãŒã¶ãŒã¯å®è£ ããå¿ èŠã¯ãããŸããããã以äžã®æ¹æ³ã
@sfackler
ãã®æ°ã¯ãmallocã䜿çšãããã®ã®ã»ãããšæ¯èŒããŠãnallocxã䜿çšãããã®ãåèšã§çŽ4ã€ãããšããäºå®ããåŸãŠããŸãã
Rustãšã³ã·ã¹ãã ã§ã®_excess
䜿çšã«é¢ãããããã®äºå®ãèãããšïŒ
_excess
ã䜿çš_excess
ããŠããŸãVec
ãšString
ãããéã³ãstd
ã©ã€ãã©ãªã§_excess
APIãé©åã«äœ¿çšã§ããŸãã_excess
APIã¯äžå®å®ã§ãexcess-less APIãšåæããŠããããããæè¿ãŸã§ãã°ããããŸããïŒ excess
ããŸã£ããè¿ããªãã£ãïŒ...
ãããŠãä»ã®èšèªã§ã®_excess
ã®äœ¿çšæ³ã«é¢ãããããã®äºå®ãèãããšïŒ
jemallocã®APIã¯ãäžäœäºææ§ã®ãããCãŸãã¯C ++ããã°ã©ã ã§ã¯ãã€ãã£ãã«ãµããŒããããŠããŸããã
ãããã®2ã€ã®è°è«ã¯ç§ã«ã¯ãã£ãšããããèŠããŸãïŒ
std
ã®excess
APIã¯äœ¿çšã§ããªãããã std
ã©ã€ãã©ãªã¯äœ¿çšã§ããŸããããããã£ãŠã誰ã䜿çšã§ããŸããããã®ãããRustãšã³ã·ã¹ãã ã§ã¯äžåºŠã䜿çšãããŸããã ãããªãã®è°è«ïŒ
_excess
APIã䜿çšããŠãã人ã¯ããªããããæ°ã«ãã人ã¯0.01ïŒ
ã«ãããŸãããã§ã¯ãªãã
@alexcrichton -> Result<*mut u8, AllocErr>
ãã-> *mut void
ã«åãæ¿ãããšãã決å®ã¯ãã¢ãã±ãŒã¿ãŒRFCã®æåã®éçºã«åŸã£ã人ã
ã«ãšã£ãŠå€§ããªé©ããšãªããããããŸããã
ç§ã¯åæããŠããªãããªããäœãã®ãã€ã³ãããããã«ããããããã人ã
ã®ããªãã®æ°ã¯ãã®ãéweightnessããšäžç·ã«æ®ããã«åãã§ãã£ãã§ãããããã«æããResult
nullã§ã¯äžè¶³ããŠããå¯èœæ§ã®å¢å ãä»ããŠæ»ãå€ã確èªããŠãã ããã
ãã®é ãå€æŽèªäœã®å¯èŠæ§ãé«ããæ¹æ³ã¯ãããŸããïŒ
1ã€ã®æ¹æ³ïŒé ã®ãŠã£ãºãããïŒïŒ Allocator
ããŸã äžå®å®ãªç¶æ
ã§ãPRèªäœã®ãã¹ã¿ãŒãã©ã³ãã§çœ²åãå€æŽããŸãã ãããŠã誰ãPRã«äžæºãèšã£ãŠããã®ãïŒãããŠèª°ãç¥ã£ãŠããã®ãïŒïŒãèŠãŠãã ããã
*mut void
ãè¿ããã Result<*mut void, AllocErr>
ãè¿ããã«ã€ããŠïŒèª¬æããããã«ããé«ã¬ãã«ããšãäœã¬ãã«ãã®ã¢ãã±ãŒã¿ç¹æ§ãåé¢ãããšããèããåæ€èšããå¿
èŠãããå¯èœæ§ããããŸããã¢ãã±ãŒã¿ãŒRFCã®ãã€ã¯IIã§ã
ïŒæããã«ã *mut void
æ»ãå€ã«æ·±å»ãªç°è°ãããå Žåã¯ãfcpbotãä»ããŠæžå¿µäºé
ãšããŠæåºããŸããããããçŸæç¹ã§ã¯ããããããlibsããŒã ã®å€æãããªãä¿¡é ŒããŠããŸãããã®ã¢ãã±ãŒã¿ãŒãµã¬ã®ç²åŽã«ããéšåããããŸããïŒ
@pnkfelix
-> Result<*mut u8, AllocErr>
ãã-> *mut void
ã«åãæ¿ãããšãã決å®ã¯ãã¢ãã±ãŒã¿ãŒRFCã®æåã®éçºã«åŸã£ã人ã ã«ãšã£ãŠå€§ããªé©ããšãªããããããŸããã
åŸè
ã¯ã説æããããã«ãç§ãã¡ãè¡šçŸãããå¯äžã®ãšã©ãŒã¯OOMã§ããããšãæå³ããŸãã ãããã£ãŠããšã©ãŒããã§ãã¯ããããã®å¶çºçãªå€±æã«å¯Ÿããä¿è·ã®å©ç¹ããŸã æã£ãŠããããããã«è»œéãªäžéã¯-> Option<*mut void>
ã§ãã
@gnzlbg
stdã®äœåãªAPIã¯äœ¿çšã§ããªããããstdã©ã€ãã©ãªã¯äœ¿çšã§ããŸããããããã£ãŠã誰ã䜿çšã§ããŸããããã®ãããRustãšã³ã·ã¹ãã ã§ã¯äžåºŠã䜿çšãããŸããã
次ã«ããããä¿®æ£ããŸãã
@pnkfelix
mut voidãè¿ããã
é«ã¬ãã«APIãalloc_one
ã alloc_array
ãªã©ãšããŠAlloc
èªäœã«å«ãŸããããšãé€ããŠããããã¯åºæ¬çã«ç§ãã¡ã®èãalloc_array
ãæ¡åŒµæ©èœãšããŠæåã«ãšã³ã·ã¹ãã ã§éçºãããããšãã§ããŸãã人ã
ãã©ã®APIã«åæãããã確èªããããã®ç¹æ§ã
@pnkfelix
ã¬ã€ã¢ãŠãã«ã³ããŒã§ã¯ãªãã¯ããŒã³ã®ã¿ãå®è£ ãããçç±ã¯ãã¬ã€ã¢ãŠãã¿ã€ãã«æ§é ãè¿œå ããå¯èœæ§ãæ®ãããã£ãããã§ãã ç¹ã«ãã¬ã€ã¢ãŠãããããæ§ç¯ããããã«äœ¿çšãããä»»æã®åæ§é ïŒããšãã°ãæ§é äœã®16é å{xïŒu8ãyïŒ[char; 215]}ïŒã远跡ããããšããããšã«ãŸã èå³ããããŸããçŸåšã®ã³ã³ãã³ããã©ã®ã¿ã€ãããæ§æãããŠããããã¬ããŒãããã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³ã«ãŒãã³ãå ¬éãããªãã·ã§ã³ã
ããã¯ã©ããã§å®éšãããŸãããïŒ
@sfacklerç§ã¯ãã§ã«ãã®ã»ãšãã©ãå®è¡ããŠããããã¹ãŠãè€è£œãããAPIã§å®è¡ã§ããŸãïŒè¶
éãªã+ _excess
ã¡ãœããïŒã çŸåšã2ã€ã®APIããããå®å
šãª_excess
APIããªããŠãåé¡ãããŸããã
ãŸã å°ãå¿é
ããŠããã®ã¯ãã¢ãã±ãŒã¿ãä»ããå®è£
ããã«ã¯alloc + dealloc
ãå®è£
ããå¿
èŠããããšããããšã ãã§ããã alloc_excess + dealloc
ãåæ§ã«æ©èœããã¯ãã§ãã alloc
alloc_excess
åŸã§
jemallocator
ã¯Alloc
2åå®è£
ããŸãïŒ Jemalloc
ãš&Jemalloc
ïŒãããã§ãäžéšã®method
ã®Jemalloc
å®è£
ã¯ã¡ãœããåŒã³åºãã&Jemalloc
å®è£
ã«è»¢éãã(&*self).method(...)
ã ããã¯ã Jemalloc
ã®Alloc
äž¡æ¹ã®å®è£
ãæåã§åæãããå¿
èŠãããããšãæå³ããŸãã &/_
å®è£
ã§ç°ãªãåäœãããããšãæ²åçã§ãããã©ããã¯ãç§ã«ã¯ããããŸããã
å®éã«Alloc
ç¹æ§ã䜿ã£ãŠäººã
ãå®éã«äœãããŠããã®ããç¥ãã®ã¯éåžžã«é£ãããšæããŸããã ããã䜿çšããŠããããšãããã£ãå¯äžã®ãããžã§ã¯ãã¯ããšã«ããæ¯æ©äœ¿çšãç¶ãïŒãµãŒããã¬ããã¯ã¹ïŒãã°ããŒãã«ã¢ãã±ãŒã¿ãŒãå€æŽããããã«ã®ã¿äœ¿çšããŠããŸãã ãããã³ã¬ã¯ã·ã§ã³ã¿ã€ãã®ãã©ã¡ãŒã¿ãšããŠäœ¿çšãããããžã§ã¯ããèŠã€ãããªãã£ãã®ã¯ãšãŠãå¿é
ã§ãïŒãã¶ãç§ã¯éãæªãã£ãã ãã§ãããã€ããããŸããïŒïŒã ç§ã¯ç¹ã«ã Vec
ãããªã¿ã€ãã®äžã«SmallVec
ãšArrayVec
ãå®è£
ããäŸãæ¢ããŠããŸããïŒ std::Vec
ã¯Alloc
ããªãããïŒ Vec
ãç°ãªãAlloc
atorã䜿çšïŒãã©ã®ããã«æ©èœããã®ãçåã«æã£ãŠããŸããïŒåãããšãããããBox
ã¯ããŒã³äœæã«ãåœãŠã¯ãŸããŸãïŒç°ãªãAlloc
sã®Box
esïŒã ãããã®å®è£
ãã©ããã«ã©ã®ããã«èŠãããã®äŸã¯ãããŸããïŒ
ç§ãèŠã€ãããããã䜿çšããŠããå¯äžã®ãããžã§ã¯ãã¯ããšã«ããæ¯æ©äœ¿çšãç¶ããã€ããã§ãïŒãµãŒããã¬ããã¯ã¹ïŒ
䟡å€ããããã®ãšããŠãServoã¯å¯èœãªéãäžå®å®ãªæ©èœãã移è¡ããããšããŠããŸãïŒ https ïŒ
ãããé¶ãå
ãåµãå
ããšããåé¡ã§ãã å€ãã®ãããžã§ã¯ãã¯ãŸã äžå®å®ãªããã Alloc
ãŸã 䜿çšããŠããŸããã
ãããããªã_excessAPIãå®å šã«è£å®ããå¿ èŠãããã®ãââã¯ç§ã«ã¯ããããããŸããã ãããã¯å ã ãjemallocã®å®éšçãª* allocm APIãåæ ããããã«ååšããŠããŸããããAPIãµãŒãã§ã¹å šäœãè€è£œããªãããã«ãæ°å¹Žåã«4.0ã§åé€ãããŸããã ç§ãã¡ã¯åœŒãã®å å°ã«åŸãããšãã§ããããã§ããïŒ
åŸã§alloc_excessã«é¢ããŠallocã«ããã©ã«ãã®å®è£ ãäžããããšã¯å¯èœã§ããããããããšãäžå¯èœã§ããããé倧ãªå€æŽã§ããããïŒ
alloc_excess
ã«é¢ããŠalloc
ããã©ã«ãã®å®è£
ãè¿œå ã§ããŸããã alloc_excess
ã¯alloc
ã«é¢ããŠããã©ã«ãã®å®è£
ãå¿
èŠã§ãã äžæ¹ãŸãã¯äž¡æ¹ãå®è£
ããã°ãã¹ãŠæ£åžžã«æ©èœããŸãããã©ã¡ããå®è£
ããªããšãã³ãŒãã¯ã³ã³ãã€ã«ãããŸãããç¡éã«ååž°ããŸãã ããã¯ä»¥åã«çºçããããšãããïŒããããRand
ïŒïŒããããã®é¢æ°ã®å°ãªããšã1ã€ãå®è£
ããå¿
èŠããããšèšãããšãã§ããŸãããã©ã¡ãã§ãããŸããŸããã
ãããã³ã¬ã¯ã·ã§ã³ã¿ã€ãã®ãã©ã¡ãŒã¿ãšããŠäœ¿çšãããããžã§ã¯ããèŠã€ãããªãã£ãã®ã¯ãšãŠãå¿é ã§ãïŒãã¶ãç§ã¯éãæªãã£ãã ãã§ãããã€ããããŸããïŒïŒã
ç§ã¯ãããããŠãã人ãç¥ããŸããã
ç§ãèŠã€ãããããã䜿çšããŠããå¯äžã®ãããžã§ã¯ãã¯ããšã«ããæ¯æ©äœ¿çšãç¶ããã€ããã§ãïŒãµãŒããã¬ããã¯ã¹ïŒ
ãããåé²ããã®ã劚ãã倧ããªããšã®1ã€ã¯ãstdlibã³ã¬ã¯ã·ã§ã³ããã©ã¡ããªãã¯ã¢ãã±ãŒã¿ãŒããŸã ãµããŒãããŠããªãããšã§ãã ã»ãšãã©ã®å€éšã³ã¬ã¯ã·ã§ã³ã¯å
éšã®ãã®ïŒ Box
ã Vec
ãªã©ïŒã䜿çšãããããããã¯ä»ã®ã»ãšãã©ã®ã¯ã¬ãŒããã»ãšãã©æé€ããŸãã
ç§ãèŠã€ãããããã䜿çšããŠããå¯äžã®ãããžã§ã¯ãã¯ããšã«ããæ¯æ©äœ¿çšãç¶ããã€ããã§ãïŒãµãŒããã¬ããã¯ã¹ïŒ
ãããåé²ããã®ã劚ãã倧ããªããšã®1ã€ã¯ãstdlibã³ã¬ã¯ã·ã§ã³ããã©ã¡ããªãã¯ã¢ãã±ãŒã¿ãŒããŸã ãµããŒãããŠããªãããšã§ãã ã»ãšãã©ã®å€éšã³ã¬ã¯ã·ã§ã³ã¯å éšã®ãã®ïŒBoxãVecãªã©ïŒã䜿çšãããããããã¯ä»ã®ã»ãšãã©ã®ã¯ã¬ãŒããã»ãšãã©æé€ããŸãã
ããã¯ç§ã«ãåœãŠã¯ãŸããŸã-ç§ã¯ããã¡ãã®ã«ãŒãã«ãæã£ãŠããŸãããããŠããç§ã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
ãäœæãããšãã®ã¹ã¯ã©ããã¹ããŒã¹ãšããŠãéåžžã«æ©ã段éã§ã®ã¿äœ¿çšãããŸãã
çæ³çã«ã¯ã Mutex<Option<RealAllocator>>
ïŒãŸãã¯ãæ¿å
¥å°çšãã«ããã©ãããŒïŒãå¯äžã®ã¢ãã±ãŒã¿ãŒã«ããæ©æã«å²ãåœãŠããããã¹ãŠã®ãã®ãã¢ãŒãªãŒããŒãBumpAllocator
ã§ãã©ã¡ãŒã¿ãŒåããããã«ããŸãã
@sfackler
ãããããªã_excessAPIãå®å šã«è£å®ããå¿ èŠãããã®ãââã¯ç§ã«ã¯ããããããŸããã ãããã¯å ã ãjemallocã®å®éšçãª* allocm APIãåæ ããããã«ååšããŠããŸããããAPIãµãŒãã§ã¹å šäœãè€è£œããªãããã«ãæ°å¹Žåã«4.0ã§åé€ãããŸããã ç§ãã¡ã¯åœŒãã®å å°ã«åŸãããšãã§ããããã§ããïŒ
çŸåšã shrink_in_place
ã¯xallocx
ãåŒã³åºããå®éã®å²ãåœãŠãµã€ãºãè¿ããŸãã shrink_in_place_excess
ã¯ååšããªãããããã®ãµã€ãºã¯ç Žæ£ããããŠãŒã¶ãŒã¯nallocx
ãåŒã³åºããŠåèšç®ããå¿
èŠããããŸãããã®ã³ã¹ãã¯ãå²ãåœãŠã®å€§ããã«ãã£ãŠç°ãªããŸãã
ãããã£ãŠããã§ã«äœ¿çšããŠããå°ãªããšãããã€ãã®jemallocå²ãåœãŠé¢æ°ã¯ã䜿çšå¯èœãªãµã€ãºãè¿ããŸãããçŸåšã®APIã§ã¯ããã䜿çšã§ããŸããã
@remexre
ç§ãããã¡ãã®ã«ãŒãã«ã§äœæ¥ããŠãããšããã°ããŒãã«ã¢ãã±ãŒã¿ãŒãé¿ããŠãã¢ãã±ãŒã¿ãŒãã»ããã¢ããããããŸã§å²ãåœãŠãè¡ãããªãããã«ããããšãç§ã®ç®æšã§ããã ç§ãäžäººã§ã¯ãªããšèããŠããããã§ãïŒ
ããã©ã«ãã®ã°ããŒãã«ã¢ãã±ãŒã¿ã®Heap
ãšããåèªã¯å¥œãã§ã¯ãããŸããã ãªãDefault
ãªãã®ã§ããïŒ
ãã1ã€ã®æ確åã®ãã€ã³ãïŒ RFC 1974ã¯ãããããã¹ãŠã®ãã®ãstd::alloc
ããŸãããçŸåšã¯std::heap
ãŸãã å®å®åã®ããã«ã©ã®å Žæãææ¡ãããŠããŸããïŒ
@jethrogb ãããŒããã¯ããmallocãããªãã«ãã€ã³ã¿ãäžãããã®ãã®ããªãæšæºçãªçšèªã§ã-ãã®çšèªã«å¯Ÿããããªãã®æžå¿µã¯äœã§ããïŒ
@sfackler
ãmallocãããªãã«ãã€ã³ã¿ãäžããããšã
ç§ã®é ã®äžãé€ããŠããããSystem
ã§ãã
確ãã«ã Global
ã¯å¥ã®ååã§ãããå€åïŒ #[global_allocator]
ã䜿çšããŠéžæããããã
è€æ°ã®ããŒãã¢ãã±ãŒã¿ãŒãååšããå¯èœæ§ããããŸãïŒäŸïŒlibcããã³æ¥é èŸjemallocïŒã std::heap::Heap
ååãstd::heap::Default
ã #[global_allocator]
ååã#[default_allocator]
ã©ãã§ããïŒ
ä»ã«æå®ããªãå ŽåïŒããããVec
ãã¢ãã±ãŒã¿ã®è¿œå ã®åãã©ã¡ãŒã¿/ãã£ãŒã«ããååŸããå ŽåïŒã«åŸããããã®ã§ãããšããäºå®ã¯ããperãããªããšããäºå®ãããéèŠã§ãã -ã€ã³ã¹ã¿ã³ã¹ãç¶æ
ïŒãŸãã¯å®éã«ã¯ã€ã³ã¹ã¿ã³ã¹ïŒã
ããã§æçµã³ã¡ã³ãæéãçµäºããŸããã
FCPã«é¢ããŠã¯ãå®å®åã®ããã«ææ¡ãããAPIãµãã»ããã®çšéã¯éåžžã«éãããŠãããšæããŸãã ããšãã°ã jemallocator
ã¯ã¬ãŒãã¯ãµããŒãããŠããŸããã
ã©ã®ããã«ïŒ jemallocatorã¯ãæ©èœãã©ã°ã®èåŸã«ããäžå®å®ãªã¡ãœããã®ããã€ãã®å®è£ ã«ãã©ã°ãç«ãŠãå¿ èŠããããããããŸããããããã ãã§ãã
å®å®ããRustã®jemallocator
ãje_rallocx
åŒã³åºããŠAlloc::realloc
ãªã©ãå®è£
ã§ããªãããããã©ã«ãã®alloc + copy + dealloc implã«äŸåããå¿
èŠãããå Žåãããã¯æšæºã©ã€ãã©ãªã®alloc_jemalloc
ã¯ã¬ãŒãIMOã
確ãã«ãã³ã³ãã€ã«ãããã®ãå ¥æããããšã¯ã§ããŸãããããã¯ç¹ã«äŸ¿å©ãªããšã§ã¯ãããŸããã
ã©ãããŠïŒ C ++ã®ã¢ãã±ãŒã¿ãŒAPIã«ã¯ãreallocã®æŠå¿µããŸã£ãããªããèšèªãæ©èœããªããªã£ãããã«ã¯èŠããŸããã ããã¯æããã«çæ³çã§ã¯ãããŸãããããªããããåãå ¥ããããªãã®ãç解ã§ããŸããã
C ++移åã³ã³ã¹ãã©ã¯ã¿ãŒã¯ä»»æã®ã³ãŒããå®è¡ã§ãããããC ++ã³ã¬ã¯ã·ã§ã³ã¯éåžžreallocã䜿çšããŸãããããã¯ãreallocã圹ã«ç«ããªãããã§ã¯ãããŸããã
ãŸããæ¯èŒã¯C ++ã§ã¯ãªããjemallocãµããŒããçµã¿èŸŒãŸããçŸåšã®Rustæšæºã©ã€ãã©ãªãšã®æ¯èŒã§ãã Alloc
APIã®ãã®ãµãã»ããã®ã¿ã䜿çšããŠãæšæºå€ã®ã¢ãã±ãŒã¿ãŒã«åãæ¿ãããšããªã°ã¬ãã·ã§ã³ãçºçããŸãã
ãããŠrealloc
ã¯ãã®äžäŸã§ãã jemallocatorã¯çŸåšã alloc_zeroed
ã alloc_excess
ã usable_size
ã grow_in_place
ãªã©ãå®è£
ããŠããŸãã
alloc_zeroedã¯å®å®åããããã«ææ¡ãããŠããŸãã ç§ãç¥ãéãïŒã¢ããã¹ã¬ãããåç
§ïŒã alloc_excess
䜿çšã¯æåéããŒãã§ãã ããã©ã«ãã®å®è£
ã«ãã©ãŒã«ããã¯ããå Žåã«ãªã°ã¬ãã·ã§ã³ãèµ·ããã³ãŒããããã€ã瀺ããŠããã ããŸãããã
ãããããã£ãšäžè¬çã«ã¯ãããããããã®APIã®äžéšãå®å®ãããããšã«å察ããè°è«ã§ããçç±ãããããŸããã jemallocatorã䜿çšããããªãå Žåã¯ãåŒãç¶ã䜿çšããªãã§ãã ããã
Layout::array<T>()
const fnã«ããããšã¯ã§ããŸããïŒ
ãããã¯ã«ãªãå¯èœæ§ãããã®ã§ãçŸæç¹ã§ã¯ãããŸããã
ãããã¯ã«ãªãå¯èœæ§ãããã®ã§ãçŸæç¹ã§ã¯ãããŸããã
ãªãã»ã©... const fn Layout::array_elem<T>()
ã§è§£æ±ºããŸããããã¯ããããã¯ã«ãªããªãLayout::<T>::repeat(1).0
çžåœããŸãã
@mzabaluevããªãã説æããŠããããšã¯Layout::new<T>()
ãšåçã ãšæããŸãã çŸåšãããã¯ã«ãªãå¯èœæ§ããããŸãããããã¯Layout::from_size_align
ã次ã«.unwrap()
ã䜿çšããŠå®è£
ãããŠããããã§ãããå¥ã®æ¹æ³ã§å®è¡ã§ãããšæããŸãã
@joshlfãã®æ§é äœã®ãµã€ãºã¯5ã ãšæããŸãããé åã®èŠçŽ ãšããŠããããã¯é 眮ã®ããã«8ãã€ãããšã«é 眮ãããŸãã
struct Foo {
bar: u32,
baz: u8
}
Foo
é
åã«ããµã€ãºèšç®ã®æåŸã®èŠçŽ ã®ããã£ã³ã°ãå«ãŸãããã©ããã¯ããããŸããããããã¯ç§ã®åŒ·ãæåŸ
ã§ãã
Rustã§ã¯ããªããžã§ã¯ãã®ãµã€ãºã¯åžžã«ãã®é
眮ã®åæ°ã§ãããããé
åã®n
çªç®ã®èŠçŽ ã®ã¢ãã¬ã¹ã¯åžžã«array_base_pointer + n * size_of<T>()
ã§ãã ãããã£ãŠãé
åå
ã®ãªããžã§ã¯ãã®ãµã€ãºã¯ãããèªäœã®ãªããžã§ã¯ãã®ãµã€ãºãšåžžã«åãã§ãã 詳现ã«ã€ããŠã¯ã reprïŒRustïŒã®
OKãæ§é äœããã®é
眮ã«åã蟌ãŸããŠããããšãããããŸããããããã¯#[repr(C)]
ãé€ããŠãå®å®ããä¿èšŒã§ã¯ãããŸããã
ãšã«ããã Layout::new
constfnã«ããããšãæè¿ãããŸãã
ããã¯ãå®å®ããé¢æ°ã®ææžåãããïŒãããŠä¿èšŒãããïŒåäœã§ãã
https://doc.rust-lang.org/std/mem/fn.size_of.html
ã¿ã€ãã®ãµã€ãºããã€ãåäœã§è¿ããŸãã
ããå ·äœçã«ã¯ãããã¯ãé åã®ããã£ã³ã°ãå«ããã®ã¢ã€ãã ã¿ã€ããæã€é åå ã®é£ç¶ããèŠçŽ éã®ãã€ãåäœã®ãªãã»ããã§ãã ãããã£ãŠãã¿ã€ã
T
ããã³é·ãn
å Žåã[T; n]
ã®ãµã€ãºã¯n * size_of::<T>()
ãŸãã
ããããšãã Layout::new
ã®çµæãä¹ç®ããconst fnã¯ãïŒ saturating_mul
ãªã©ã§å®è¡ãããªãéãïŒæ¬è³ªçã«ãããã¯ã«ãªãããšã«æ°ä»ããã®ã§ãæ£æ¹åœ¢ã«æ»ããŸãã constfn远跡åé¡ã®ãããã¯ã«ã€ããŠã®è³ªåãç¶ããŸãã
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
å®è£
ããbytes_usedãã®ç¯å²ãåãå Žåãåå²ãåœãŠæã«é¢é£ããéšåãã³ããŒããã ãã§æžã¿ãŸãã å®éã«ã¯ãå°ãªããšãjemallocã¯rallocx
åŒã³åºãã§Alloc::realloc
ããã©ã«ãã®implããªãŒããŒã©ã€ãããŸãã alloc
/ dealloc
ãã³ã¹ãè¡ããã©ãããé¢é£ããã¡ã¢ãªã®ã¿ãã³ããŒããããšã¯ã rallocx
åŒã³åºããããéããé
ããã¯ãããããå€ãã®ããšã«äŸåããŸãïŒ rallocx
管çããŸãããããã¯ãæå®ã®äœçœ®ã«æ¡åŒµããã«ã¯ïŒ rallocx
ã³ããŒããäžèŠãªã¡ã¢ãªã®éãªã©ïŒã
https://github.com/QuiltOS/rust/tree/allocator-erroräžè¬åèªäœãå®è¡ããããšã§ãé¢é£ãããšã©ãŒã¿ã€ããã³ã¬ã¯ã·ã§ã³ãšãšã©ãŒåŠçã®åé¡ãã©ã®ããã«è§£æ±ºãããšæããã瀺ãå§ããŸããã ç¹ã«ãã¢ãžã¥ãŒã«ã§ã©ã®ããã«å€æŽãããã«æ³šæããŠãã ããã
T
å®è£
ã«ã¯ãåžžã«Result<T, A::Err>
å®è£
ãåå©çšããŠãã ããunwrap
ãŸãã¯ãã®ä»ã®éšåçãªãã®ã¯æ±ºããŠãããŸããoom(e)
å€ã®AbortAdapter
ãããã¯ãç§ãè¡ã£ãŠããå€æŽãéåžžã«å®å šã§ããããŸã£ããç¡æå³ã§ããããšãæå³ããŸãã ãšã©ãŒãè¿ãããšãšãšã©ãŒãäžæ¢ããããšã®äž¡æ¹ãæ±ãããšã¯ã粟ç¥çãªäžå€æ¡ä»¶ãç¶æããããã«äœåãªåªåãå¿ èŠãšãã¹ãã§ã¯ãããŸãã---ã¿ã€ããã§ãã«ãŒã¯ãã¹ãŠã®ä»äºãããŸãã
ç§ã¯æãåºããŸã---ç§ã¯@Gankroã®RFCã§æããŸããïŒ ãŸãã¯rfc以åã®ã¹ã¬ãã--- Gecko / Servoã®äººã
ã¯ãã³ã¬ã¯ã·ã§ã³ã®èª€ããã¿ã€ãã®äžéšã«ããªãã®ã¯è¯ãã£ããšèšã£ãŠããŸãã ãããšã #[repr(transparent)]
ãAbortAdapter
è¿œå ããŠãã³ã¬ã¯ã·ã§ã³ãFoo<T, A>
ãšFoo<T, AbortAdapter<A>>
éã§å®å
šã«å€æã§ããããã«ããããšãã§ããŸãïŒå®å
šãªã©ãããŒå
ã§ïŒããã¹ãŠã®ã¡ãœãããè€è£œããã«ååŸã«åãæ¿ããŸãã [ããã¯ã³ã³ãããã®å Žåããããã«ããŠãæšæºã©ã€ãã©ãªã³ã¬ã¯ã·ã§ã³ãè€è£œããå¿
èŠããããŸããã Result<T, !>
ã¯æè¿éåžžã«æ±ããããããããŠãŒã¶ãŒã¡ãœãããè€è£œããå¿
èŠã¯ãããŸããã]
æ®å¿µãªãããlangã¢ã€ãã ïŒããã¯ã¹ïŒã®åãã©ã¡ãŒã¿ãŒãå€æŽãããšã³ã³ãã€ã©ãŒãæ··ä¹±ãããããã³ãŒãã¯å®å
šã«åãã§ãã¯ãè¡ããŸããïŒé©ãã§ãïŒïŒã ICEãåŒãèµ·ããããã¯ã¹ã³ãããã¯æåŸã®ãã®ã§ã---ãããè¯ãåã®ãã¹ãŠã @eddybã¯ïŒ47043ã§
ç·šé@joshlfç§ã¯ããªãã®https://github.com/rust-lang/rust/pull/45272ãç¥ãããããããããã«çµã¿èŸŒã¿ãŸããã ããããšãïŒ
æ°žç¶ã¡ã¢ãªïŒäŸïŒ http ïŒ
ç§ã¯æè¿ãæ°žç¶ã¡ã¢ãªã¢ãã±ãŒã¿ïŒå ·äœçã«ã¯libpmemctoïŒã®Rustã©ãããŒã«åãçµãã§ããŸãã ãã®APIã®å®å®åã«é¢ããŠã©ã®ãããªæ±ºå®ãäžãããŠãã次ã®ããšãè¡ãå¿ èŠããããŸãã-
äœè«ã§ãããpmem.ioéçºïŒIntelã®PMDKïŒã¯ãå éšã§å€æŽãããjemallocã¢ãã±ãŒã¿ãŒãå€çšããŠãããããAPIã³ã³ã·ã¥ãŒããŒã®äŸãšããŠjemallocã䜿çšããã®ãè³¢æãªããã§ãã
ã³ã¬ã¯ã·ã§ã³ã§Alloc
ãšãŒã¿ãŒã䜿çšããçµéšãç©ããŸã§ãæåã«GlobalAllocator
ã®ã¿ãã«ããŒããããã«ãã®ç¯å²ãçž®å°ããããšã¯å¯èœã§ããããïŒ
IIUCã¯ãããã§ãã§ã«servo
ã®ããŒãºã«å¯Ÿå¿ããã³ã³ããã®ãã©ã¡ãŒã¿åã䞊è¡ããŠè©Šãããšãã§ããŸãã å°æ¥çã«ã¯ãã©ã¡ããã䜿çšããŠã³ã¬ã¯ã·ã§ã³ã移åããããšãã§ããŸãGlobalAllocator
ã®ãã©ã³ã±ããIMPLè¿œå 代ããã«ããããã¯åã«Alloc
ããããã«GlobalAllocator
ãããã¯ããã¹ãŠã®ã³ã¬ã¯ã·ã§ã³ã®ããã«äœ¿çšããããšãã§ããããã«ãšããããšã
èãïŒ
@gnzlbg #[global_allocator]
å±æ§ã䜿çšããã«ã¯ïŒ heap::System
ãéžæãã以å€ã«ïŒã Alloc
ç¹æ§ãå®å®ããŠããå¿
èŠããããŸããããã«ããã httpsïŒ/ã®ãããªã¯ã¬ãŒãã§å®è£
ã§ãGlobalAllocator
ãšããååã®ã¿ã€ããç¹æ§ã¯ãããŸããããæ°ããAPIãææ¡ããŠããŸããïŒ
çŸåšãGlobalAllocatorãšããååã®ã¿ã€ããŸãã¯ç¹æ§ã¯ãããŸããããæ°ããAPIãææ¡ããŠããŸããïŒ
ç§ãææ¡ããã®ã¯ã @ alexcrichtonãããã§å®å®åAlloc
ããGlobalAllocator
ããŠãã°ããŒãã«ã¢ãã±ãŒã¿ãŒã®ã¿ãè¡šãããã«ããã³ã¬ã¯ã·ã§ã³ãå¥ã®å°æ¥ã®ã¢ãã±ãŒã¿ãŒç¹æ§ïŒããã¯ã GlobalAllocator
ç¹æ§ã«ãã£ãŠãããããã©ã¡ãŒã¿ãŒåã§ããªãããšãæå³ãããã®ã§ã¯ãããŸããïŒã
IIUC servo
çŸåšãã°ããŒãã«ã¢ãã±ãŒã¿ãŒãåãæ¿ããããšãã§ããå¿
èŠãããã ãã§ãïŒã¢ãã±ãŒã¿ãŒã«ãã£ãŠäžéšã®ã³ã¬ã¯ã·ã§ã³ããã©ã¡ãŒã¿ãŒåããããšãã§ããã®ãšã¯å¯Ÿç
§çã§ãïŒã ãããã£ãŠãäž¡æ¹ã®ãŠãŒã¹ã±ãŒã¹ã§å°æ¥ã«ããã£ãŠå©çšã§ãããœãªã¥ãŒã·ã§ã³ãå®å®ããã代ããã«ãçŸåšã¯ã°ããŒãã«ã¢ãã±ãŒã¿ãŒã®åé¡ã®ã¿ã«å¯ŸåŠããåŸã§ã¢ãã±ãŒã¿ãŒã«ããã³ã¬ã¯ã·ã§ã³ããã©ã¡ãŒã¿ãŒåããæ¹æ³ãç解ããããšãã§ããŸãã
ãããçã«ããªã£ãŠãããã©ããããããªãã
IIUCãµãŒãã¯çŸåšãã°ããŒãã«ã¢ãã±ãŒã¿ãŒãåãæ¿ããããšãã§ããå¿ èŠãããã ãã§ãïŒã¢ãã±ãŒã¿ãŒã«ãã£ãŠäžéšã®ã³ã¬ã¯ã·ã§ã³ããã©ã¡ãŒã¿ãŒåããããšãã§ããã®ãšã¯å¯Ÿç §çã§ãïŒã
ããã¯æ£ããã§ããïŒ
std::heap::Heap
ãçµç±ããã«çŽæ¥åŒã³åºãããšãã§ããŸãã ãããã£ãŠãããã¯ç¹æ§ã°ããŒãã«ã¢ãã±ãŒã¿ãŒã§ããã ãã§ãªããã¢ãã±ãŒã¿ãŒã®ç¹æ§ã§ãããïŒã¢ãã±ãŒã¿ãŒãããäžè¬çãªã³ã¬ã¯ã·ã§ã³çšã«å¥ã®ã¢ãã±ãŒã¿ãŒãäœæããããšã«ãªã£ããšããŠãïŒã GlobalAllocator
ã¯ç¹ã«é©åãªååã§ã¯ãããŸãããalloc_excess
ã realloc
ã realloc_excess
ã usable_size
ã grow_in_place
ãããã³shrink_in_place
ãå®è£
ããŠããŸããææ¡ãããæå°éã®APIã®äžéšã ãããã¯ããã©ã«ãã®implãããå¹ççã§ããå¯èœæ§ããããããããããåé€ãããšããã©ãŒãã³ã¹ãäœäžããŸããäž¡æ¹ã®ç¹ãçã«ããªã£ãŠããŸãã ãã®æ©èœã®å®å®åãå€§å¹ ã«å éããå¯äžã®æ¹æ³ã¯ããã®æ©èœãžã®äŸåãæé€ââããããšã§ãããã³ã¬ã¯ã·ã§ã³ããã©ã¡ãŒã¿ãŒåããããã®åªããç¹æ§ã§ããããšæããŸããã
[ServoãïŒå®å®ãã|å ¬åŒã®Mozillaã¯ã¬ãŒãïŒã®ããã«ãªãã貚ç©ãããã匷å¶ããŠãããã§å°ãã®å§åãåãé€ãããšãã§ããã°çŽ æŽãããã§ãããã]
@ Ericson2314ãµãŒãã¯ããããã®APIã䜿çšãããå¯äžã®ãããžã§ã¯ãã§ã¯ãããŸããã
@ Ericson2314ãããäœãæå³ããã®ãããããŸãããèšãæããŠããããŸããïŒ
ã³ã³ããã¹ãïŒServoã¯çŸåšããã€ãã®äžå®å®ãªæ©èœïŒ #[global_allocator]
ïŒã䜿çšããŠããŸãããïŒäžéšã®æ©èœãå®å®ãããã³ã³ãã€ã©ã«æŽæ°ããããå®å®ãã代æ¿æ段ãèŠã€ããããšã«ãã£ãŠïŒãã£ãããšããããé¢ããããšããŠããŸãã ïŒããã¯https://github.com/servo/servo/issues/5286ã§è¿œè·¡ãã#[global_allocator]
ãå®å®ãããã®ã¯è¯ãããšã§ããããµãŒãäœæ¥ããããã¯ããããšã¯ãããŸããã
Firefoxã¯ã cdylib
ã³ã³ãã€ã«ãããšãã«Rust stdãããã©ã«ãã§ã·ã¹ãã ã¢ãã±ãŒã¿ã«ãªããåããã€ããªã«ãªã³ã¯ãããããšã«ãªã£ãmozjemallocãmalloc
ãfree
ãããªã·ã³ãã«ãå®çŸ©ãããšããäºå®ã«äŸåããŠããŸãã #[global_allocator]
ã䜿çšããŠmozjemallocãæ瀺çã«éžæããã»ããã¢ããå
šäœãããå
ç¢ã«ããããšãæãã§ããŸãã
@SimonSapinã¢ãã±ãŒã¿ãŒãšã³ã¬ã¯ã·ã§ã³ã§éã¶ã»ã©ãã³ã¬ã¯ã·ã§ã³ãAlloc
ãã©ã¡ãŒã¿ãŒåããããªããšæãåŸåããããŸããã¢ãã±ãŒã¿ãŒã«ãã£ãŠã¯ãã³ã¬ã¯ã·ã§ã³ãæäŸãããå Žåãããããã§ãã APIã®éããäžéšã®æäœã®è€éãã®å€æŽãäžéšã®ã³ã¬ã¯ã·ã§ã³ã®è©³çŽ°ã¯å®éã«ã¯ã¢ãã±ãŒã¿ãŒã«äŸåããŸãã
ããã§ãããã§é²æ©ãéããããã®æ¹æ³ãææ¡ããããšæããŸãã
æåã¯ãå®å®ããRustã§ããŠãŒã¶ãŒãããŒãã®ã¢ãã±ãŒã¿ãŒïŒãŸãã¯ãã·ã¹ãã /ãã©ãããã©ãŒã /ã°ããŒãã«/ããªãŒã¹ãã¢ã¢ãã±ãŒã¿ãŒããŸãã¯ååãä»ãããå ŽåïŒãéžæã§ããããã«å¶éããããšãã§ããŸãã
æåã«ãã©ã¡ãŒã¿åããã®ã¯Box
ã ãã§ããããã¯ãã¡ã¢ãªã®å²ãåœãŠïŒ new
ïŒãšå²ãåœãŠè§£é€ïŒ drop
ïŒã®ã¿ãå¿
èŠã§ãã
ãã®ã¢ãã±ãŒã¿ãŒãã¬ã€ãã¯ãæåã¯@alexcrichtonãææ¡ããïŒãŸãã¯ããããæ¡åŒµãããïŒAPIãæã€ããšãã§ãããã®ã¢ãã±ãŒã¿ãŒãã¬ã€ãã¯ãå€éã«ã std::
ã³ã¬ã¯ã·ã§ã³ããµããŒãããããã«ãããã«æ¡åŒµãããAPIãæã€ããšãã§ããŸãã
ããã«çããšãstableã«ç§»è¡ããããŠãŒã¶ãŒã¯ç§»è¡ã§ããŸãããAPIãäžå®å®ãªãããããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸãã
ãã®æç¹ã§ãããã©ãŒãã³ã¹ã®äœäžã®ããã«å®å®çã«ç§»è¡ã§ããªããŠãŒã¶ãŒãåè©äŸ¡ãããã®APIãæ¡åŒµããŠå®å®åããæ¹æ³ã決å®ã§ããŸãã
std
ã³ã¬ã¯ã·ã§ã³ã§ã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒããµããŒãããŸãããŸããããã¯é£ããã®ã§ã決ããŠèµ·ãããªããããããŸãããã決ããŠèµ·ãããªãããšã¯æªãããšã§ã¯ãªããšæããŸãã
ã«ã¹ã¿ã ã¢ãã±ãŒã¿ã䜿çšããŠã³ã¬ã¯ã·ã§ã³ããã©ã¡ãŒã¿åãããå Žåãããã©ãŒãã³ã¹ã®åé¡ãŸãã¯äœ¿ããããã®åé¡ããããŸãã
䜿ããããã®åé¡ãããå Žåã¯ãéåžžãã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒã®æ©èœã掻çšããå¥ã®ã³ã¬ã¯ã·ã§ã³APIãå¿
èŠã§ããããšãã°ã SliceDeque
ã¯ã¬ãŒãã®ããã«ãªããŸãã ã«ã¹ã¿ã ã¢ãã±ãŒã¿ã«ãã£ãŠã³ã¬ã¯ã·ã§ã³ããã©ã¡ãŒã¿åããŠããããã§ã¯åœ¹ã«ç«ã¡ãŸããã
ããã©ãŒãã³ã¹ã«åé¡ãããå Žåã§ããã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒãç§ãæ¯æŽããã®ã¯éåžžã«å°é£ã§ãã Vec
ã¯ãç§ãæãé »ç¹ã«åå®è£
ããã³ã¬ã¯ã·ã§ã³ã§ããããã次ã®ã»ã¯ã·ã§ã³ã§ã®ã¿æ€èšããŸãã
Vec
ãªããžã§ã¯ãå
ã«ããã€ãã®èŠçŽ ãå²ãåœãŠãŠãã·ã¹ãã ã¢ãã±ãŒã¿ãŒãžã®åŒã³åºãåæ°ãæžããããå Žåã¯ãä»æ¥ã¯SmallVec<[T; M]>
ãŸãã ãã ãã SmallVec
ã¯Vec
ã¯ãããŸããïŒ
Vec
移åãããšãèŠçŽ æ°ã¯OïŒ1ïŒã«ãªããŸããã SmallVec<[T; M]>
移åãããšãN <Mã®å Žåã¯OïŒNïŒã«ãªãããã®åŸã¯OïŒ1ïŒã«ãªããŸãã
len() <= M
å Žåã Vec
èŠçŽ ãžã®ãã€ã³ã¿ã¯ç§»åæã«ç¡å¹ã«ãªããŸããããã以å€ã®å Žåãã€ãŸãinto_iter
ãªã©ã®len() <= M
æäœã§èŠçŽ ãã«ç§»åããå¿
èŠãããå Žåã¯ç¡å¹ã«ãªããŸãããã€ã³ã¿ãåãã ãã§ãªããã€ãã¬ãŒã¿ãªããžã§ã¯ãèªäœã
ããããµããŒãããããã«ãã¢ãã±ãŒã¿ãŒäžã§Vec
ãžã§ããªãã¯ã«ããããšã¯ã§ããŸããïŒ ãã¹ãŠãå¯èœã§ãããæãéèŠãªã³ã¹ãã¯æ¬¡ã®ãšããã§ãã
Vec
ã®å®è£
ãããè€éã«ãªãããã®æ©èœã䜿çšããŠããªããŠãŒã¶ãŒã«åœ±é¿ãäžããå¯èœæ§ããããŸãVec
ã®ããã¥ã¡ã³ãã¯ããè€éã«ãªããŸãããããã®ã³ã¹ãã¯ç¡èŠã§ããªããšæããŸãã
Vec
ã®æé·å åã¯ãç¹å®ã®ã¢ãã±ãŒã¿ãŒã«åãããŠèª¿æŽãããŸãã std
ã§ã¯ãäžè¬çãªãã®ã«åãããŠèª¿æŽã§ããŸãjemalloc
/ malloc
/ ...ãã ããã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒã䜿çšããŠããå Žåã¯ãéžæããæé·å åãããã©ã«ãã§ã¯ããŠãŒã¹ã±ãŒã¹ã«æé©ã§ã¯ãããŸããã ãã¹ãŠã®ã¢ãã±ãŒã¿ãŒã¯ãvecã®ãããªå²ãåœãŠãã¿ãŒã³ã®æé·å åãæå®ã§ããå¿
èŠããããŸããïŒ ããããŸããããç§ã®çŽæã¯ç§ã«æããŠãããŸãïŒããããããã§ã¯ãããŸããã
ããšãã°ããªãŒããŒã³ãããã¢ãã±ãŒã¿ã¯ãã»ãšãã©ã®Tier1ããã³Tier2ã¿ãŒã²ããã§äœ¿çšã§ããŸãã Linuxã®ãããªã·ã¹ãã ãMacosã·ã¹ãã ã§ã¯ãããŒãã¢ãã±ãŒã¿ã¯ããã©ã«ãã§ãªãŒããŒã³ãããããŸãããWindows APIã¯VirtualAlloc
ãå
¬ââéããŸããããã¯ãã¡ã¢ãªã®äºçŽïŒ Vec::reserve/with_capacity
ïŒãšpush
ã¡ã¢ãªã®ã³ãããã«äœ¿çšã§ããŸãã
çŸåšã Alloc
ãã¬ã€ãã¯ãã¡ã¢ãªã®ã³ããããšäºçŽã®æŠå¿µãåé¢ããŠããªããããWindowsã§ãã®ãããªã¢ãã±ãŒã¿ãå®è£
ããæ¹æ³ãå
¬éããŠããŸããïŒLinuxã§ã¯ãéå°ã«ã³ãããããŠããªãã¢ãã±ãŒã¿ããããã³ã°ãããå¯èœæ§ããããŸãïŒåããŒãžã1åã¿ããããã ãã§ãïŒã ãŸããã¢ãã±ãŒã¿ãããã©ã«ãã§alloc
ã«ãªãŒããŒã³ããããããã©ããã瀺ãæ¹æ³ãå
¬éããŠããŸããã
ã€ãŸãã Alloc
APIãæ¡åŒµããŠããããVec
ã§ãµããŒãããå¿
èŠããããŸããããã¯ãã»ãšãã©åãŠãªãIMOã«ãªããŸãã ãã®ãããªã¢ãã±ãŒã¿ããããšã Vec
ã»ãã³ãã£ã¯ã¹ãåã³å€ããããã§ãã
Vec
ã¯äºåºŠãšæé·ããå¿
èŠããªãã®ã§ã reserve
ãããªæäœã¯ã»ãšãã©æå³ããããŸããpush
ããO(1)
代ããã®ååŽO(1)
ãcudaMalloc
/ cudaMemcpy
/ ...ã®ãããªäžéšã®ã·ã¹ãã ã¢ãã¯ã¿ãŒã¯ãåºå®ã¡ã¢ãªãšéåºå®ã¡ã¢ãªãåºå¥ããäºãã«çŽ ãªã¢ãã¬ã¹ç©ºéã«ã¡ã¢ãªãå²ãåœãŠãããšãã§ããŸãïŒãããã£ãŠãã«é¢é£ä»ãããããã€ã³ã¿åãå¿
èŠã«ãªããŸãå²ãåœãŠç¹æ§ïŒã..ã
ãã ããVecã®ãããªã³ã¬ã¯ã·ã§ã³ã§ãããã䜿çšãããšãGPUã«ãŒãã«ããè¡ãããã¹ãããè¡ããã«å¿ããŠããã¯ã¿ãŒã®ã€ã³ããã¯ã¹äœæãçªç¶æªå®çŸ©ã®åäœãåŒã³åºããã©ãããªã©ãäžéšã®æäœã®ã»ãã³ãã£ã¯ã¹ã埮åŠã«å€æŽãããŸãã
ãã¹ãŠã®ã³ã¬ã¯ã·ã§ã³ïŒãŸãã¯Vec
ã®ã¿ïŒããã©ã¡ãŒã¿ãŒåããããã«äœ¿çšã§ããAlloc
APIãèãåºãã®ã¯é£ãããããããé£ãããããšæããŸãã
ãã¶ããglobal / system / platform / heap / free-storeã¢ãã±ãŒã¿ãŒãæ£ããååŸãã Box
ãååŸããåŸãã³ã¬ã¯ã·ã§ã³ãåèããããšãã§ããŸãã Alloc
ãåå©çšã§ãããããããŸãããã VecAlloc,
VecDequeAlloc ,
HashMapAlloc`ãå¿
èŠãããããŸãã...ãããã¯ããæ¬åœã«ãããå¿
èŠãªå Žåã¯ãäœãç¥ã£ãŠãããããšèšãã ããããããŸããã ãæšæºã®ã³ã¬ã¯ã·ã§ã³ãã³ããŒããŠã¯ã¬ãŒãã«è²Œãä»ããã¢ãã±ãŒã¿ãŒã«æ圢ããŸããã ããããæåã®è§£æ±ºçã¯ãä¿è²åã®ç¬èªã®ã¯ã¬ãŒãïŒãŸãã¯è€æ°ã®ã¯ã¬ãŒãïŒã«stdã³ã¬ã¯ã·ã§ã³ãé
眮ããå®å®ããæ©èœã®ã¿ã䜿çšããŠããããç°¡åã«ããããšã§ããããã¯ããã«ãã£ã³ã°ãããã¯ã®ã»ãããšããŠå®è£
ãããå ŽåããããŸãã
ãšã«ãããããã§ããããã¹ãŠã®åé¡ã«äžåºŠã«åãçµã¿ããã¹ãŠã«é©ããAlloc
ç¹æ§ãèãåºãã®ã¯é£ãããšæããŸãã ã¹ããã0ã«ããŸããã¹ããã1ãšã¹ããã2ã«ãã°ããå°éããããã®æè¯ã®æ¹æ³ã¯ãããã«å°éãããŸã§ã³ã¬ã¯ã·ã§ã³ãç»åããé€å€ããããšã ãšæããŸãã
ããã«çããšãstableã«ç§»è¡ããããŠãŒã¶ãŒã¯ç§»è¡ã§ããŸãããAPIãäžå®å®ãªãããããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸãã
ã«ã¹ã¿ã ã¢ãã±ãŒã¿ãéžæããããšã¯ãéåžžãããã©ãŒãã³ã¹ãåäžãããããšã§ããããããã®æåã®å®å®åã誰ã«åœ¹ç«ã€ãã¯ããããŸããã
ã«ã¹ã¿ã ã¢ãã±ãŒã¿ãéžæããããšã¯ãéåžžãããã©ãŒãã³ã¹ãåäžãããããšã§ããããããã®æåã®å®å®åã誰ã«åœ¹ç«ã€ãã¯ããããŸããã
ã¿ããªïŒ å°ãªããšãä»ã¯ã ããªããäžæºãèšãæ¹æ³ã®ã»ãšãã©ã¯ãæåã®å®å®åææ¡ã«æ¬ ããŠããŸãïŒããšãã°ã alloc_excess
ïŒãAFAIKã¯ãŸã æšæºã©ã€ãã©ãªã®äœã«ã䜿çšãããŠããŸããã ãŸãã¯ãããã¯æè¿å€æŽãããŸãããïŒ
Vec
ïŒããã³RawVec
ä»ã®ãŠãŒã¶ãŒïŒã¯realloc
ã§push
@SimonSapin
jemallocatorã¯ã¬ãŒãã¯çŸåšãalloc_excessãreallocãrealloc_excessãusable_sizeãgrow_in_placeãshrink_in_placeãå®è£ ããŠããŸãã
ãããã®ã¡ãœãããããAFAIK realloc
ã grow_in_place
ãããã³shrink_in_place
ã䜿çšãããŸããã grow_in_place
ã¯ãã§ã®jemallocã®shrink_in_place
ã«å¯ŸããåçŽãªã©ãããŒã«ãããŸãããå°ãªããšãã Alloc
ç¹æ§ã®shrink_in_place
ã«é¢ããŠgrow_in_place
ã®ããã©ã«ãã®äžå®å®ãªå®è£
ãå®è£
ããå Žåãããã¯2ã€ã®æ¹æ³ã«åæžãããŸãïŒ realloc
ãšshrink_in_place
ã
ã«ã¹ã¿ã ã¢ãã±ãŒã¿ãéžæããããšã¯ãéåžžãããã©ãŒãã³ã¹ãåäžãããããšã§ãã
ããã¯äºå®ã§ããããããã®ã¡ãœããã䜿çšããæªãã¢ãã±ãŒã¿ãŒãããããããã®ã¡ãœããã䜿çšããªããããé©åãªã¢ãã±ãŒã¿ãŒã䜿çšãããšãããã©ãŒãã³ã¹ãåäžããå¯èœæ§ããããŸãã
IIUCã®ãµãŒãã®äž»ãªäœ¿çšäŸã¯ã2çªç®ã®ãžã§ãããã¯ã䜿çšãã代ããã«Firefoxã®ãžã§ãããã¯ã䜿çšããããšã§ãããã
æåã®å®å®åã§realloc
ãšshrink_in_place
ãAlloc
ç¹æ§ã«è¿œå ããŠããããã©ãŒãã³ã¹ã®äžæºãé
ãããã ãã§ãã
ããšãã°ãäžå®å®ãªAPIãAlloc
ãã¬ã€ãã«è¿œå ããŠãæçµçã«std
ã³ã¬ã¯ã·ã§ã³ã§äœ¿çšããããã«ãªã£ãç¬éãå®å®çã§åãããã©ãŒãã³ã¹ãåŸãããšãã§ããªããªããŸããæ¯æ©ä¹ãããšãã§ããŸãã ã€ãŸãã realloc_excess
ãšshrink_in_place_excess
ãallocãã¬ã€ãã«è¿œå ãã Vec
/ String
/ ...ã䜿çšããããšã realloc
å®å®ããŸãã shrink_in_place
ã¯ã1ãããã圹ã«ç«ã¡ãŸããã§ããã
IIUCã®ãµãŒãã®äž»ãªäœ¿çšäŸã¯ã2çªç®ã®ãžã§ãããã¯ã䜿çšãã代ããã«Firefoxã®ãžã§ãããã¯ã䜿çšããããšã§ãããã
ãããã¯ããã€ãã®ã³ãŒããå ±æããŠããŸãããFirefoxãšServoã¯2ã€ã®å¥åã®ãããžã§ã¯ã/ã¢ããªã±ãŒã·ã§ã³ã§ãã
Firefoxã¯mozjemallocã䜿çšããŸããããã¯ãå€ãã®æ©èœãè¿œå ãããå€ãããŒãžã§ã³ã®jemallocã®ãã©ãŒã¯ã§ãã äžéšã®unsafe
FFIã³ãŒãã¯ãRuststdã§äœ¿çšãããŠããmozjemallocã®æ£ç¢ºæ§ãšå¥å
šæ§ã«äŸåããŠãããšæããŸãã
Servoã¯ãçŸæç¹ã§Rustã®å®è¡å¯èœãã¡ã€ã«ã®ããã©ã«ãã§ããjemallocã䜿çšããŸããããã®ããã©ã«ããã·ã¹ãã ã®ã¢ãã±ãŒã¿ãŒã«å€æŽããèšç»ããããŸãã Servoã«ã¯ãå®éã«äœ¿çšãããŠããjemallocã®å¥å
šæ§ã«äŸåããunsafe
ã¡ã¢ãªäœ¿çšéã¬ããŒãã³ãŒãããããŸãã ïŒ Vec::as_ptr()
ãje_malloc_usable_size
æž¡ããŸããïŒ
Servoã¯ãçŸæç¹ã§Rustã®å®è¡å¯èœãã¡ã€ã«ã®ããã©ã«ãã§ããjemallocã䜿çšããŸããããã®ããã©ã«ããã·ã¹ãã ã®ã¢ãã±ãŒã¿ãŒã«å€æŽããèšç»ããããŸãã
ãµãŒãã¿ãŒã²ãããæé©åãããrealloc
ããã³shrink_to_fit
APIãæäŸããã·ã¹ãã ã®ã·ã¹ãã ã¢ãã±ãŒã¿ãŒãjemallocã®ããã«æäŸãããã©ãããç¥ã£ãŠãããšããã§ãããã realloc
ïŒããã³calloc
ïŒã¯éåžžã«äžè¬çã§ããã shrink_to_fit
ïŒ xallocx
ïŒã¯jemalloc
åºæã®AFAIKã§ãã ããããæåã®è§£æ±ºçã¯ãæåã®å®è£
ã§realloc
ãšalloc_zeroed
ïŒ calloc
ïŒãå®å®ãããåŸã§äœ¿çšããããã«shrink_to_fit
ãæ®ãããšã§ãã ããã«ããããµãŒãã¯ããã©ãŒãã³ã¹ã®åé¡ãªãã«ã»ãšãã©ã®ãã©ãããã©ãŒã ã®ã·ã¹ãã ã¢ãã±ãŒã¿ãšé£æºã§ããããã«ãªããŸãã
Servoã«ã¯ãå®éã«äœ¿çšãããŠããjemallocã®å¥å šæ§ã«äŸåããå®å šã§ãªãã¡ã¢ãªäœ¿çšéã¬ããŒãã³ãŒããããã€ããããŸãã ïŒVec :: as_ptrïŒïŒãje_malloc_usable_sizeã«æž¡ããŸããïŒ
ãåç¥ã®ããã«ã jemallocator
ã¯ã¬ãŒãã«ã¯ãã®ããã®APIããããŸãã ã°ããŒãã«ã¢ãã±ãŒã¿ãŒã¹ããŒãªãŒãå®å®ãå§ãããšã jemallocator
ã¯ã¬ãŒãã«äŒŒãã¯ã¬ãŒããåæ§ã®APIãæäŸããä»ã®ã¢ãã±ãŒã¿ãŒã«ãããã¢ããããããšãæåŸ
ããŠããŸãã ãããã®APIãAlloc
ãã¬ã€ãã«å±ãããã©ããã«ã€ããŠã¯ãŸã£ããèããŠããŸããã
malloc_usable_size
ãAlloc
ç¹æ§ã«ããå¿
èŠã¯ãªããšæããŸãã #[global_allocator]
ã䜿çšããŠã Vec<T>
䜿çšãããŠããã¢ãã±ãŒã¿ãŒã確èªãã jemallocator
ã¯ã¬ãŒããšã¯å¥ã«é¢æ°ã䜿çšããããšã¯åé¡ãããŸããã
@SimonSapin Alloc
ç¹æ§ãå®å®ãããšãLinuxã®mallocãšWindowsçšã«jemallocator
ãããªã¯ã¬ãŒããäœæãããå¯èœæ§ããããŸãã ãããã®ã¯ã¬ãŒãã«ã¯ãäžå®å®ãªAlloc
APIã®ããŒãïŒããšãã°ã usable_size
äžã«malloc_usable_size
ïŒãå®è£
ããããã®è¿œå æ©èœãå«ãŸããŠããå¯èœæ§ããããŸããäžéšã§ã¯ãªãAlloc
ã¡ã¢ãªãäžã«å ±åããããã«ãAPI mallinfo
ã ãµãŒãã¿ãŒã²ãããšãªãã·ã¹ãã ã«äœ¿çšå¯èœãªã¯ã¬ãŒããããã°ãå®å®åãåªå
ããããã«Alloc
ç¹æ§ã®ã©ã®éšåãç¥ãã®ãç°¡åã«ãªããŸãããããããå°ãªããšãããã€ãã®å®éšãå¿
èŠãªæ°ããAPIãèŠã€ããã§ããããã¢ãã±ãŒã¿ãŒã
ç§ã¯ç©äºã®ãããæççã @gnzlbg https://github.com/rust-lang/rust/issues/32838#issuecomment -358267292ã ãããã®ã·ã¹ãã åºæã®ãã®ããã¹ãŠé€å€ããŠãallocã®ã³ã¬ã¯ã·ã§ã³ãäžè¬åããããšã¯é£ãããããŸãã-ç§ã¯ãããè¡ããŸããã ãããåãå ¥ããããšããããšã¯å¥ã®ææŠã®ããã«æããŸãã
@SimonSapin Firefoxã«ã¯äžå®å®ãªRustããªã·ãŒã¯ãããŸãããïŒ ç§ã¯æ··ä¹±ããŠãããšæããŸããFirefoxãšServoã¯ãããæãã§ããŸããããããããªããFirefoxã®ãŠãŒã¹ã±ãŒã¹ã¯å®å®åãžã®å§åãå ããã§ãããã
@sfacklerãããåç §ããŠãã ãã^ã ç§ã¯ãããå®å®ãããå¿ èŠããããããžã§ã¯ããšæãã§ãããããžã§ã¯ããåºå¥ããããšããŠããŸããããServoã¯ãã®åå²ã®å察åŽã«ãããŸãã
ãããå¿ èŠã§ãå®å®ããŠããå¿ èŠããããããžã§ã¯ãããããŸãã Rustã®æ¶è²»è ãšããŠã®ServoãšFirefoxã®ã©ã¡ãã«ãç¹ã«éæ³ã®ãããªãã®ã¯ãããŸããã
@ Ericson2314æ£è§£https ïŒ //wiki.mozilla.org/Rust_Update_Policy_for_Firefox ã ç§ã説æããããã«ãä»æ¥ã¯å®çšçãªè§£æ±ºçãããã®ã§ãããã¯äœã®åŠšãã«ããªããŸããã #[global_allocator]
ã䜿çšããæ¹ããããé©åã§å
ç¢ã§ããããã ãã§ãã
Servoã¯ããã€ãã®äžå®å®ãªæ©èœã䜿çšããŸãããåè¿°ã®ããã«ããããå€æŽããããšããŠããŸãã
FWIWããã©ã¡ããªãã¯ã¢ãã±ãŒã¿ãŒã¯ã¢ãã±ãŒã¿ãŒãå®è£ ããã®ã«éåžžã«äŸ¿å©ã§ãã ããŸããŸãªããŒã¿æ§é ãå éšã§äœ¿çšããããåçŽãªã¢ãã±ãŒã¿ãŒïŒ bsallocãªã©ïŒã§ãã©ã¡ãŒã¿ãŒåã§ããå Žåãããã©ãŒãã³ã¹ã®åœ±é¿ãåãã«ããå€ãã®ç°¿èšãã¯ããã«ç°¡åã«ãªããŸãã çŸåšãstdç°å¢ã§ãããè¡ãå¯äžã®æ¹æ³ã¯ãæåã®ãã§ãŒãºã䜿çšããŠåçŽãªã¢ãã±ãŒã¿ãŒãã°ããŒãã«ã¢ãã±ãŒã¿ãŒãšããŠèšå®ãã2çªç®ã®ãã§ãŒãºã䜿çšããŠãã倧ããè€éãªã¢ãã±ãŒã¿ãŒãã³ã³ãã€ã«ãã2ãã§ãŒãºã³ã³ãã€ã«ãè¡ãããšã§ãã ã no-stdã§ã¯ããããè¡ãæ¹æ³ã¯ãŸã£ãããããŸããã
@ Ericson2314
ãããã®ã·ã¹ãã åºæã®ãã®ããã¹ãŠé€å€ããŠãallocã®ã³ã¬ã¯ã·ã§ã³ãäžè¬åããããšã¯é£ãããããŸãã-ç§ã¯ãããè¡ããŸããã ãããåãå ¥ããããšããããšã¯å¥ã®ææŠã®ããã«æããŸãã
Vec
+ã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒã®äžã«ArrayVec
ãŸãã¯SmallVec
å®è£
ããããŸããïŒ ãããç§ãæåã«è¿°ã¹ããã€ã³ãã§ãããããã¯ã·ã¹ãã åºæã®ãã®ã§ã¯ãããŸããã ãããããããã¯æ³åã§ããæãåçŽãª2ã€ã®ã¢ãã±ãŒã¿ãŒã§ããã1ã€ã¯ã¹ãã¬ãŒãžãšããŠã®çã®é
åã§ããããã1ã€ã¯ãé
åã®å®¹éããªããªã£ããããŒãã«ãã©ãŒã«ããã¯ãè¿œå ããããšã§ãæåã®ã¢ãã±ãŒã¿ãŒã®äžã«æ§ç¯ã§ããŸãã äž»ãªéãã¯ããããã®ã¢ãã±ãŒã¿ã¯ãã°ããŒãã«ãã§ã¯ãããŸããããåVec
ã¯ãä»ã®ãã¹ãŠã®ã¢ãã±ãŒã¿ããç¬ç«ããç¬èªã®ã¢ãã±ãŒã¿ãããããããã®ã¢ãã±ãŒã¿ã¯ã¹ããŒããã«ã§ãã
ãŸããç§ã¯æ±ºããŠãããããªããšäž»åŒµããŠããŸããã ããã¯éåžžã«é£ããããšã§ããC++ã¯30幎éãéšåçãªæåã®ã¿ãè©Šã¿ãŠããŸãããGPUã¢ãã±ãŒã¿ãŒãšGCã¢ãã±ãŒã¿ãŒã¯ãæ±çšãã€ã³ã¿ãŒã¿ã€ãã«ããæ©èœããŸããã ArrayVec
ãšSmallVec
å®è£
ããŠããŸãã Vec
äžã«è¿œå ããŠããC ++ã©ã³ãã§ã¯ãŒãã³ã¹ãã®æœè±¡åã«ã¯ãªããŸããïŒ ArrayVec
ããã€ãã®åé¡ã«ã€ããŠè©³ãã説æããŠããŸãïŒã
ã§ããããå°æ¥çã«ã«ã¹ã¿ã ã³ã¬ã¯ã·ã§ã³ã¢ãã±ãŒã¿ãŒãè¿œæ±ããªãéããäœãæçšãªãã®ãæäŸããããŒã¹ãå®å®ãããåŸã§ãããè¿œæ±ããããšãæãã§ããŸãã
IRCã§@SimonSapinãšå°ã話ãããŸããããæåã®å®å®åã®ææ¡ãrealloc
ãšalloc_zeroed
ã§æ¡åŒµãããšãFirefoxã®RustïŒå®å®ããRustã®ã¿ã䜿çšïŒã䜿çšã§ããããã«ãªããŸãã mozjemalloc
ã¯ãè¿œå ã®ããã¯ãå¿
èŠãšããã«ãå®å®ããRustã®ã°ããŒãã«ã¢ãã±ãŒã¿ãŒãšããŠæ©èœããŸãã @SimonSapinãè¿°ã¹ã
ããã§ããããããå§ããããšãã§ããŸããããã«çããããããã©ãŒãã³ã¹ãäœäžãããããšãªãã servo
ãå®å®ãã#[global_allocator]
ã«ç§»åããŸãã
@joshlf
FWIWããã©ã¡ããªãã¯ã¢ãã±ãŒã¿ãŒã¯ã¢ãã±ãŒã¿ãŒãå®è£ ããã®ã«éåžžã«äŸ¿å©ã§ãã
æå³ã«ã€ããŠããå°ã詳ããæããŠããã ããŸããïŒ Alloc
ç¹æ§ã§ã«ã¹ã¿ã ã¢ãã±ãŒã¿ããã©ã¡ãŒã¿åã§ããªãçç±ã¯ãããŸããïŒ ãŸãã¯ãç¬èªã®ã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒãã¬ã€ãã䜿çšããŠãæçµçãªã¢ãã±ãŒã¿ãŒã«Alloc
ãã¬ã€ããå®è£
ããŸãïŒãããã®2ã€ã®ãã¬ã€ãã¯å¿
ãããçããå¿
èŠã¯ãããŸããïŒã
ãSmallVec = Vec +ç¹æ®ã¢ãã±ãŒã¿ãã®äœ¿çšäŸãã©ãããæ¥ãŠããã®ãããããŸããã ããã¯å€ãã®æ·±å»ãªåé¡ãæ±ããŠãããšããçç±ã ãã§ãç§ã以åã«ïŒRustã§ãä»ã®æèã§ãïŒå€ãèšåããããšã¯ãããŸããã ãå°çšã®ã¢ãã±ãŒã¿ãŒã§ããã©ãŒãã³ã¹ãåäžãããããšæããšãããã¯ãŸã£ããæãæµ®ãã³ãŸããã
Layout
APIãèŠããšã from_size_align
ãšalign_to
ãšã©ãŒåŠçã®éãã«ã€ããŠçåã«æã£ãŠããŸãããåè
ã¯ããšã©ãŒãçºçããå Žåã«None
ãè¿ããŸãã ãåŸè
ã¯ãããã¯ã«ãªããŸãïŒïŒïŒã
é©åã«å®çŸ©ãããæçãªLayoutErr
åæåãè¿œå ããäž¡æ¹ã®å Žåã«Result<Layout, LayoutErr>
ãè¿ãïŒãããŠããããçŸåšOption
è¿ãä»ã®é¢æ°ã«äœ¿çšããïŒæ¹ã䟿å©ã§äžè²«æ§ãããã®ã§ã¯ãªãã§ããããã
@rkruppe
ãSmallVec = Vec +ç¹æ®ã¢ãã±ãŒã¿ãã®äœ¿çšäŸãã©ãããæ¥ãŠããã®ãããããŸããã ããã¯å€ãã®æ·±å»ãªåé¡ãæ±ããŠãããšããçç±ã ãã§ãç§ã以åã«ïŒRustã§ãä»ã®æèã§ãïŒå€ãèšåããããšã¯ãããŸããã ãå°çšã®ã¢ãã±ãŒã¿ãŒã§ããã©ãŒãã³ã¹ãåäžãããããšæããšãããã¯ãŸã£ããæãæµ®ãã³ãŸããã
RustãšC ++ã§ã¢ãã±ãŒã¿ãŒã䜿çšããã«ã¯ã2ã€ã®ç¬ç«ããæ¹æ³ããããŸããããã©ã«ãã§ãã¹ãŠã®å²ãåœãŠã§äœ¿çšãããã·ã¹ãã ã¢ãã±ãŒã¿ãŒãšãç¹å®ã®ã³ã¬ã¯ã·ã§ã³ã®ãªããžã§ã¯ããäœæããæ¹æ³ãšããŠãã¢ãã±ãŒã¿ãŒç¹æ§ã«ãã£ãŠãã©ã¡ãŒã¿ãŒåãããã³ã¬ã¯ã·ã§ã³ã®ååŒæ°ãšããŠäœ¿çšãããŸããç¹å®ã®ã¢ãã±ãŒã¿ãŒã䜿çšããŸãïŒã·ã¹ãã ã®ã¢ãã±ãŒã¿ãŒã§ããå Žåãšããã§ãªãå ŽåããããŸãïŒã
以äžã§ã¯ããã®2çªç®ã®ãŠãŒã¹ã±ãŒã¹ã«ã®ã¿çŠç¹ãåœãŠãŸããã³ã¬ã¯ã·ã§ã³ãšã¢ãã±ãŒã¿ãŒã¿ã€ãã䜿çšããŠãç¹å®ã®ã¢ãã±ãŒã¿ãŒã䜿çšãããã®ã³ã¬ã¯ã·ã§ã³ã®ãªããžã§ã¯ããäœæããŸãã
C ++ã§ã®ç§ã®çµéšã§ã¯ãã¢ãã±ãŒã¿ãŒã䜿çšããŠã³ã¬ã¯ã·ã§ã³ããã©ã¡ãŒã¿ãŒåãããšã次ã®2ã€ã®ãŠãŒã¹ã±ãŒã¹ãæäŸãããŸãã
ããã¯ã99ïŒ ã®ç¢ºçã§C ++ã³ãŒãããŒã¹ã«èŠãããã¢ãã±ãŒã¿ãŒã®ãŠãŒã¹ã±ãŒã¹ã§ãã ã³ã¬ã¯ã·ã§ã³ã«æ°ããæ©èœãè¿œå ãããšããã©ãŒãã³ã¹ãåäžãããšããäºå®ã¯ãç§ã®æèŠã§ã¯å¶ç¶ã§ãã ç¹ã«ã次ã®ã¢ãã±ãŒã¿ã¯ãããããå²ãåœãŠãã¿ãŒã³ãã¿ãŒã²ããã«ããããšã«ãã£ãŠããã©ãŒãã³ã¹ãåäžããããã®ã§ã¯ãããŸããã ããã¯ã @ Ericson2314ãèšåããŠããããã«ããã·ã¹ãã åºæããšèŠãªãããšãã§ããæ©èœãè¿œå ããããšã«ãã£ãŠè¡ãããŸãã ãããã¯ããã€ãã®äŸã§ãïŒ
å°ããªãããã¡ã®æé©åãè¡ãããã®ã¹ã¿ãã¯ã¢ãã±ãŒã¿ïŒHoward Hinnantã®stack_allocããŒããŒãåç
§ïŒã std::vector
ãŸãã¯flat_{map,set,multimap,...}
ã䜿çšã§ããã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒãæž¡ãããšã§ãïŒ SmallVec
ïŒãããŸãã¯ãªãïŒ ArrayVec
ïŒã®å°ããªãããã¡ãŒæé©åã«è¿œå ããŸããããŒããã©ãŒã«ããã¯ã ããã«ãããããšãã°ãã³ã¬ã¯ã·ã§ã³ããã®èŠçŽ ãšãšãã«ã¹ã¿ãã¯ãŸãã¯éçã¡ã¢ãªïŒããŒãã䜿çšããŠããå ŽåïŒã«é
眮ã§ããŸãã
ã»ã°ã¡ã³ãåãããã¡ã¢ãªã¢ãŒããã¯ãã£ïŒ16ãããå¹ ã®ãã€ã³ã¿x86ã¿ãŒã²ãããGPGPUãªã©ïŒã ããšãã°ãC ++ 17 Parallel STLã¯ãC ++ 14ã®éãParallel TechnicalSpecificationã§ããã åãèè ã®å è¡ã©ã€ãã©ãªã¯NVIDIAã®Thrustã©ã€ãã©ãªã§ãããã³ã³ããã¯ã©ã¹ãGPGPUã¡ã¢ãªïŒäŸïŒ thrust :: device_malloc_allocator ïŒãŸãã¯ãã³çããããã¡ã¢ãªïŒäŸïŒ thrust :: pinned_allocator ;ãã³çããããã¡ã¢ãªã§ãã¹ãããã€ã¹éã®é«é転éãå¯èœã«ããã¢ãã±ãŒã¿ãå«ãŸããŠããŸãïŒããå ŽåïŒã
åœå
±æïŒäŸïŒIntel Thread Building Blocks cache_aligned_allocator
ïŒãSIMDã¿ã€ãã®ãªãŒããŒã¢ã©ã€ã³ã¡ã³ãèŠä»¶ïŒäŸïŒEigen3ã®aligned_allocator
ïŒãªã©ã®äžŠååŠçé¢é£ã®åé¡ã解決ããããã®ã¢ãã±ãŒã¿ãŒã
ããã»ã¹éå ±æã¡ã¢ãªïŒ Boost.Interprocessã«ã¯ãOSããã»ã¹éå ±æã¡ã¢ãªæ©èœïŒSystem Vå ±æã¡ã¢ãªãªã©ïŒã䜿çšããŠã³ã¬ã¯ã·ã§ã³ã®ã¡ã¢ãªãå²ãåœãŠãã¢ãã±ãŒã¿ããããŸãã ããã«ãããstdã³ã³ãããçŽæ¥äœ¿çšããŠãç°ãªãããã»ã¹éã®éä¿¡ã«äœ¿çšãããã¡ã¢ãªã管çã§ããŸãã
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒHerb Sutterã®é 延ã¡ã¢ãªå²ãåœãŠã©ã€ãã©ãªã¯ããŠãŒã¶ãŒå®çŸ©ã®ãã€ã³ã¿åã䜿çšããŠãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¡ã¢ãªãå®è£ ããã¢ãã±ãŒã¿ãå®è£ ããŸãã ãã®ãããããšãã°ããã¯ãã«ã倧ãããªããšããã®ã¡ã¢ãªãžã®ãã¹ãŠã®ãã€ã³ã¿ãç Žæ£ããããŸã§ãã¡ã¢ãªã®å€ããã£ã³ã¯ãåç¶ããã€ãã¬ãŒã¿ã®ç¡å¹åãåé¿ãããŸãã
ã€ã³ã¹ãã«ã¡ã³ãåãããã¢ãã±ãŒã¿ãŒïŒãã«ãŒã ããŒã°ã®ãœãããŠã§ã¢ã©ã€ãã©ãªã®blsma_testallocatorã䜿çšãããšã䜿çšãããªããžã§ã¯ãã®ã¡ã¢ãªã®å²ãåœãŠ/å²ãåœãŠè§£é€ïŒããã³C ++åºæã®ãªããžã§ã¯ãã®æ§ç¯/ç Žæ£ïŒãã¿ãŒã³ããã°ã«èšé²ã§ããŸãã Vec
reserve
åŸã«å²ãåœãŠããããã©ããããããŸãããïŒ ãã®ãããªã¢ãã±ãŒã¿ãæ¥ç¶ãããšããããçºçãããã©ãããéç¥ãããŸãã ãããã®ã¢ãã±ãŒã¿ã®äžéšã§ã¯ãååãä»ããããšãã§ãããããè€æ°ã®ãªããžã§ã¯ãã§äœ¿çšããŠãã©ã®ãªããžã§ã¯ããäœãå®è¡ããŠãããã瀺ããã°ãååŸã§ããŸãã
ãããã¯ãC ++ã§å®éã«æãé »ç¹ã«èŠãããã¿ã€ãã®ã¢ãã±ãŒã¿ãŒã§ãã åã«ãèšã£ãããã«ãããã©ãŒãã³ã¹ãåäžããå Žåããããšããäºå®ã¯ãç§ã®æèŠã§ã¯å¶ç¶ã§ãã éèŠãªéšåã¯ããããã®ããããç¹å®ã®å²ãåœãŠãã¿ãŒã³ãã¿ãŒã²ããã«ããããšããªãããšã§ãã
AFAIKãããè¡ãC ++ã¢ãã±ãŒã¿ã¯åºã䜿çšãããŠããŸãããããããªãã ãšæãã®ããããã«èª¬æããŸãã 次ã®ã©ã€ãã©ãªã¯ããã®ãŠãŒã¹ã±ãŒã¹ã察象ãšããŠããŸãã
ãã ãããããã®ã©ã€ãã©ãªã¯ãç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã«å¯ŸããŠåäžã®ã¢ãã±ãŒã¿ãå®éã«æäŸããããã§ã¯ãããŸããã 代ããã«ãã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®éšåã®ç¹å®ã®å²ãåœãŠãã¿ãŒã³ã察象ãšããã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒãæ§ç¯ããããã«äœ¿çšã§ããã¢ãã±ãŒã¿ãŒãã«ãã£ã³ã°ãããã¯ãæäŸããŸãã
ç§ãC ++ã®æ代ããæãåºããäžè¬çãªã¢ããã€ã¹ã¯ãåã«ããããã䜿çšããªããããšã§ããïŒãããã¯æåŸã®æ段ã§ãïŒãçç±ã¯æ¬¡ã®ãšããã§ãã
ããã¯ããã®ãŠãŒã¹ã±ãŒã¹ã®ã©ã€ãã©ãªã圹ã«ç«ããªããšããæå³ã§ã¯ãããŸããã ããããããã§ã foonathan / memoryã®ãããªã©ã€ãã©ãªãéè±ããŠããŸãã ããããå°ãªããšãç§ã®çµéšã§ã¯ããæ©èœãè¿œå ãããã¢ãã±ãŒã¿ãŒãããå®éã«ã¯ããŸã䜿çšãããŠããŸãããåå©ãåããã«ã¯ãã·ã¹ãã ã¢ãã±ãŒã¿ãŒãæã¡è² ããå¿ èŠããããŸããããã¯ãã»ãšãã©ã®ãŠãŒã¶ãŒãæè³ãããããå€ãã®æéãå¿ èŠãšããŸãïŒStackoverflowããã£ã±ãã§ãïŒã ãBoost.Poolã䜿çšããŸããããããã©ãŒãã³ã¹ãäœäžããŸãããã©ãããã°ããã§ããïŒBoost.Poolã䜿çšããªãã§ãã ãããããšããã¿ã€ãã®è³ªåã®æ°ã
IMO C ++ã¢ãã±ãŒã¿ãŒã¢ãã«ãå®å šã§ã¯ãããŸããããäž¡æ¹ã®ãŠãŒã¹ã±ãŒã¹ããµããŒãããŠããããšã¯çŽ æŽãããããšã ãšæããŸããRustã®stdã³ã¬ã¯ã·ã§ã³ãã¢ãã±ãŒã¿ãŒã«ãã£ãŠãã©ã¡ãŒã¿ãŒåãããå Žåã¯ãäž¡æ¹ã®ãŠãŒã¹ã±ãŒã¹ããµããŒãããå¿ èŠããããšæããŸããã©ã¡ãã®å ŽåãC ++ã¢ãã±ãŒã¿ã䟿å©ã§ããããšãããããŸããã
ãã®åé¡ã¯ãç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã®ã°ããŒãã«/ã·ã¹ãã /ãã©ãããã©ãŒã /ããã©ã«ã/ããŒã/ããªãŒã¹ãã¢ã¢ãã±ãŒã¿ãŒãã«ã¹ã¿ãã€ãºã§ããããšãšã¯å°ãçŽäº€ããŠãããšæããŸããäž¡æ¹ã®åé¡ãåæã«è§£æ±ºããããšãããšãäžæ¹ã®è§£æ±ºãé ããå¯èœæ§ããããŸãããããã®äžå¿ èŠã«ã
äžéšã®ãŠãŒã¶ãŒãã¢ãã±ãŒã¿ãŒã«ãã£ãŠãã©ã¡ãŒã¿ãŒåãããã³ã¬ã¯ã·ã§ã³ã§å®è¡ãããããšã¯ãä»ã®ãŠãŒã¶ãŒãå®è¡ãããããšãšã¯å€§ããç°ãªãå ŽåããããŸãã @rkruppeããå²ãåœãŠãã¿ãŒã³ã®äžèŽãããå§ãŸãããåœå ±æã®é²æ¢ããŸãã¯ãããŒããã©ãŒã«ããã¯ã䌎ãå°ããªãããã¡ãŒæé©åã®äœ¿çšãããå§ããå Žåãæåã«ç解ãããäºãã®ããŒãºãç解ãã次ã«å°çããã®ã¯é£ããã§ããããäž¡æ¹ã§æ©èœãããœãªã¥ãŒã·ã§ã³ã§ã
@gnzlbgå æ¬çãªèšäºãããããšãã ããã®ã»ãšãã©ã¯ç§ã®æåã®è³ªåã«å¯ŸåŠããŠããããç§ã¯ããã®ããã€ãã«åæããŸããããç§ãã¡ããäºããè¶ ããŠè©±ããªãããã«ããã綎ã£ãŠããã®ã¯è¯ãããšã§ãã
ç§ã®è³ªåã¯ç¹ã«ãã®ã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠã§ããïŒ
å°ããªãããã¡ã®æé©åãè¡ãããã®ã¹ã¿ãã¯ã¢ãã±ãŒã¿ïŒHoward Hinnantã®stack_allocããŒããŒãåç §ïŒã std :: vectorãŸãã¯flat_ {mapãsetãmultimapã...}ã䜿çšã§ããã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒãæž¡ãããšã§ãïŒSmallVecïŒãŸãã¯ãªãïŒArrayVecïŒã®ããŒããã©ãŒã«ããã¯ã䜿çšããŠå°ããªãããã¡ãŒæé©åãè¿œå ããŸãã ããã«ãããããšãã°ãã³ã¬ã¯ã·ã§ã³ããã®èŠçŽ ãšãšãã«ã¹ã¿ãã¯ãŸãã¯éçã¡ã¢ãªïŒããŒãã䜿çšããŠããå ŽåïŒã«é 眮ã§ããŸãã
stack_allocã«ã€ããŠèªãã§ããããã©ã®ããã«æ©èœããããç解ããŸããã SmallVecïŒãããã¡ãã³ã¬ã¯ã·ã§ã³ã«ã€ã³ã©ã€ã³ã§æ ŒçŽãããŠããïŒãéåžžæå³ãããã®ã§ã¯ãªãããããã®ãªãã·ã§ã³ãèŠéããŸããããã³ã¬ã¯ã·ã§ã³ã移åãããšãã«ãã€ã³ã¿ãæŽæ°ããå¿
èŠããããšããåé¡ãåé¿ããŸãïŒãŸãã移åãå®ããªããŸãïŒ ïŒã ãŸããshort_allocã䜿çšãããšãè€æ°ã®ã³ã¬ã¯ã·ã§ã³ã§1ã€ã®arena
ãå
±æã§ãããããéåžžã®SmallVecã¿ã€ããšã¯ããã«ç°ãªããŸãã ããã¯ãå²ãåœãŠãããã¹ããŒã¹ãäžè¶³ãããšãã«ããŒãå²ãåœãŠãžã®é©åãªãã©ãŒã«ããã¯ãåããç·åœ¢/ãã³ããã€ã³ã¿ãŒã¢ãã±ãŒã¿ãŒã®ãããªãã®ã§ãã
ãã®çš®ã®ã¢ãã±ãŒã¿ãŒãšcache_aligned_allocator
ãåºæ¬çã«æ°ããæ©èœãè¿œå ããŠããããšã«åæããŸããã ãããã¯äœ¿çšæ¹æ³ãç°ãªãããå²ãåœãŠãã¿ãŒã³ãã®å®çŸ©ã«ãã£ãŠã¯ãç¹å®ã®å²ãåœãŠãã¿ãŒã³ã«æé©åãããªãå ŽåããããŸãã ãã ãããããã¯ç¢ºãã«ç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã«æé©åãããŠãããæ±çšããŒãã¢ãã±ãŒã¿ãŒãšã®åäœã«å€§ããªéãã¯ãããŸããã
ãã ããããã€ã³ã¿ãã®æå³ãå€§å¹ ã«å€æŽããSutterã®é 延ã¡ã¢ãªå²ãåœãŠã®ãããªãŠãŒã¹ã±ãŒã¹ã¯ããµããŒããããå Žåã¯å¥ã®èšèšãå¿ èŠã«ãªãå¯èœæ§ãããå¥ã®ã¢ããªã±ãŒã·ã§ã³ã§ããããšã«åæããŸãã
stack_allocã«ã€ããŠèªãã§ããããã©ã®ããã«æ©èœããããç解ããŸããã SmallVecïŒãããã¡ãã³ã¬ã¯ã·ã§ã³ã«ã€ã³ã©ã€ã³ã§æ ŒçŽãããŠããïŒãéåžžæå³ãããã®ã§ã¯ãªãããããã®ãªãã·ã§ã³ãèŠéããŸããããã³ã¬ã¯ã·ã§ã³ã移åãããšãã«ãã€ã³ã¿ãæŽæ°ããå¿ èŠããããšããåé¡ãåé¿ããŸãïŒãŸãã移åãå®ããªããŸãïŒ ïŒã
stack_alloc
ã¯ãçŽããåããå¯äžã®ã¢ãã±ãŒã¿ãŒã§ããããèšåããŸãããã2009幎ã«ãªãªãŒã¹ãããC ++ 11ããåã«ãªãªãŒã¹ãããŸããïŒC ++ 03ã¯ã³ã¬ã¯ã·ã§ã³å
ã®ã¹ããŒããã«ã¢ãã±ãŒã¿ãŒããµããŒãããŠããŸããã§ããïŒã
ãããC ++ 11ïŒã¹ããŒããã«ã¢ãã±ãŒã¿ãŒããµããŒãïŒã§æ©èœããæ¹æ³ã¯ãç°¡åã«èšããšæ¬¡ã®ãšããã§ãã
RawVec
ãšåãããã«ããã®äžã«Allocator
ãªããžã§ã¯ããæ ŒçŽããŸããtrue
ã§ãã ãã®ããããã£ãfalse
å Žåãã ãŒã代å
¥ã§ã¯ã¢ãã±ãŒã¿ãŒãäŒæã§ããªããããæšæºã§ã¯ãåèŠçŽ ãæ°ããã¹ãã¬ãŒãžã«æåã§ç§»åããããã«ã³ã¬ã¯ã·ã§ã³ãå¿
èŠã§ãããããã£ãŠãã·ã¹ãã ã¢ãã±ãŒã¿ãå«ããã¯ãã«ã移åããããšãæåã«ã¹ã¿ãã¯äžã®æ°ãããã¯ãã«ã®ã¹ãã¬ãŒãžãå²ãåœãŠããã次ã«ã¢ãã±ãŒã¿ã移åããïŒãµã€ãºã¯ãŒãïŒã次ã«3ã€ã®ãã€ã³ã¿ã移åãããŸãããããã¯åŒãç¶ãæå¹ã§ãã ãã®ãããªåãã¯O(1)
ã§ãã
OTOHOã POCMA == true
ã¢ãã±ãŒã¿ãæã€ãã¯ãã«ã移åããããšãæåã«ã¹ã¿ãã¯äžã®æ°ãããã¯ãã«ã®ã¹ãã¬ãŒãžãå²ãåœãŠããã空ã®ãã¯ãã«ã§åæåããã次ã«å€ãã³ã¬ã¯ã·ã§ã³ãdrain
æ¿å
¥ãããŸããæ°ãããã®ãå€ããã®ã¯ç©ºã§ãæ°ãããã®ã¯ãã£ã±ãã«ãªããŸãã ããã«ãããã ãŒã代å
¥æŒç®åã䜿çšããŠãã³ã¬ã¯ã·ã§ã³ã®åèŠçŽ ãåå¥ã«ç§»åãããŸãã ãã®ã¹ãããã¯O(N)
ãããèŠçŽ ã®å
éšãã€ã³ã¿ãŒãä¿®æ£ããŸãã æåŸã«ãå
ã®ç©ºã®ã³ã¬ã¯ã·ã§ã³ãåé€ãããŸãã ããã¯ã¯ããŒã³ã®ããã«èŠããŸãããèŠçŽ èªäœãã¯ããŒã³ãããŠããªãããã§ã¯ãªããC ++ã§ç§»åãããŠããããšã«æ³šæããŠãã ããã
ããã¯çã«ããªã£ãŠããŸããïŒ
C ++ã§ã®ãã®ã¢ãããŒãã®äž»ãªåé¡ã¯ã次ã®ãšããã§ãã
_excess
ã¡ãœããããããŸããããšãã°ã _excess
ã¡ãœãããè¿œå ããæšæºã®æºæ ã³ã¬ã¯ã·ã§ã³ããããã䜿çšããããšãä¿èšŒããããšã«ããããããã®åé¡ãä¿®æ£ããããã«C ++ã®ã¢ãã±ãŒã¿ãŒAPIã®æ¹åã«åãçµãã§ããå€ãã®äººã
ãããŸãã
ãã®çš®ã®ã¢ãã±ãŒã¿ãŒãšcache_aligned_allocatorãåºæ¬çã«æ°ããæ©èœãè¿œå ããŠããããšã«åæããŸããã
ãã¶ãç§ãæå³ããã®ã¯ã以åã¯äœ¿çšã§ããªãã£ãç¶æ³ãã¿ã€ãã§stdã³ã¬ã¯ã·ã§ã³ã䜿çšã§ãããšããããšã§ãã ããšãã°ãC ++ã§ã¯ãã¹ã¿ãã¯ã¢ãã±ãŒã¿ã®ãããªãã®ããªããšããã€ããªã®éçã¡ã¢ãªã»ã°ã¡ã³ãã«ãã¯ãã«ã®èŠçŽ ãé
眮ã§ããŸããïŒãã ãããããå®è¡ããç¬èªã®ã³ã¬ã¯ã·ã§ã³ãäœæããããšã¯ã§ããŸãïŒã OTOHãC ++æšæºã¯SIMDã¿ã€ãã®ãããªãªãŒããŒã¢ã©ã€ã³ãããã¿ã€ãããµããŒãããŠãããã new
ããŒãå²ãåœãŠããããšãããšãæªå®çŸ©ã®åäœãåŒã³åºãããŸãïŒ posix_memalign
ãªã©ã䜿çšããå¿
èŠããããŸãïŒ ã ãªããžã§ã¯ãã䜿çšãããšãéåžžãã»ã°ã¡ã³ããŒã·ã§ã³éåïŒ*ïŒãä»ããŠæªå®çŸ©ã®åäœãæããã«ãªããŸãã aligned_allocator
ãããªãã®ã䜿çšãããšãå¥ã®ã¢ãã±ãŒã¿ãŒã䜿çšããŠãæªå®çŸ©ã®åäœãåŒã³åºããã«ããããã®ã¿ã€ããããŒãå²ãåœãŠããstdã³ã¬ã¯ã·ã§ã³ã«é
眮ããããšãã§ããŸãã 確ãã«ãæ°ããã¢ãã±ãŒã¿ã«ã¯ããŸããŸãªå²ãåœãŠãã¿ãŒã³ããããŸãïŒãããã®ã¢ãã±ãŒã¿ã¯åºæ¬çã«ãã¹ãŠã®ã¡ã¢ãªããªãŒããŒã¢ã©ã€ã³ããŸã...ïŒãã人ã
ããããã䜿çšããã®ã¯ã以åã¯ã§ããªãã£ãããšãå®è¡ã§ããããã«ããããšã§ãã
æããã«ãRustã¯C ++ã§ã¯ãããŸããã ãããŠãC ++ã«ã¯Rustã«ã¯ãªãåé¡ããããŸãïŒéããŸãåæ§ã§ãïŒã Rustã§ã¯ãC ++ã«æ°ããæ©èœãè¿œå ããã¢ãã±ãŒã¿ãŒãäžèŠãªå ŽåããããŸããããšãã°ãSIMDã¿ã€ãã«åé¡ã¯ãããŸããã
ïŒ*ïŒC ++ããã³STLã³ã³ãããŒã䜿çšããéã®æªå®çŸ©ã®åäœãåé¿ããã«ã¯ãSIMDã¿ã€ããŸãã¯SIMDã¿ã€ããå«ãã¿ã€ãïŒ Eigen3 docs ïŒããnew
ããªãŒããŒããŒãããããšã«ãããåã«new
ã䜿çšããããšã¯ãããŸããïŒ
@gnzlbgããããšããç§ãsmallvecã®äŸã«æ··ä¹±ããŸããã ããã«ã¯ãRustã§ç§»åäžå¯èœãªã¿ã€ããšããçš®ã®ã¢ãã«ãå¿ èŠã«ãªããŸã--- 2ã€ã®RFCãã¬ãã¥ãŒããããã«ãã©ããŒã¢ããäœæ¥ãè¡ããŸã---ã§ããããä»ã®ãšãããããã«ã€ããŠæ©ãããšã¯ãããŸããã å¿ èŠãªãã¹ãŠã®ã¹ã¿ãã¯ã¹ããŒã¹ãåžžã«äœ¿çšãããšããæ¢åã®smallvecæŠç¥ã¯ãä»ã®ãšããåé¡ãªãããã§ãã
ãŸãã @ rkruppeã«åæããŸããæ¹èšããããªã¹ãã§ã¯ãã¢ãã±ãŒã¿ãŒã®æ°ããæ©èœããã¢ãã±ãŒã¿ãŒã䜿çšããã³ã¬ã¯ã·ã§ã³ã«ã¯ããCollection<Allocator>
ã«æ°ããããããã£ãããå ŽåããããŸãïŒããšãã°ãå®å
šã«åºå®ãããã¡ã¢ãªã«ååšããŸãïŒããããã¯ã¢ãã±ãŒã¿ã䜿çšããå Žåã®èªç¶ãªçµæã§ãã
ããã§ç§ãèŠãå¯äžã®äŸå€ã¯ãåäžã®ãµã€ãº/ã¿ã€ãã®ã¿ãå²ãåœãŠãã¢ãã±ãŒã¿ãŒã§ãïŒNVidiaã®ãã®ã¯ã¹ã©ãã¢ãã±ãŒã¿ãŒãšåæ§ã«ãããè¡ããŸãïŒã éåžžã®ã¢ãã±ãŒã¿ãŒçšã«å
æ¬çã«å®è£
ãããå¥ã®ObjAlloc<T>
ãã¬ã€ããæã€ããšãã§ããŸãïŒ impl<A: Alloc, T> ObjAlloc<T> for A
ã 次ã«ãã³ã¬ã¯ã·ã§ã³ã¯ãããã€ãã®ã¢ã€ãã ãå²ãåœãŠãå¿
èŠãããå Žåã¯ãObjAllocå¢çã䜿çšããŸãã ããããåŸã§äºææ§ãæã£ãŠéæ¹åã«å®è¡ã§ããã¯ããªã®ã§ããããåãäžããŠãå°ãã°ãããŠãããšæããŸãã
ããã¯çã«ããªã£ãŠããŸããïŒ
ãã¡ããã§ãããmoveã³ã³ã¹ãã©ã¯ã¿ãŒããªããããRustãšã¯ããŸãé¢ä¿ããããŸããã ãããã£ãŠããã€ã³ã¿ãæž¡ãã¡ã¢ãªãçŽæ¥å«ãïŒç§»åå¯èœãªïŒã¢ãã±ãŒã¿ã¯äžå¯èœã§ãã
ããšãã°ãC ++ã§ã¯ãã¹ã¿ãã¯ã¢ãã±ãŒã¿ã®ãããªãã®ããªããšããã€ããªã®éçã¡ã¢ãªã»ã°ã¡ã³ãã«ãã¯ãã«ã®èŠçŽ ãé 眮ã§ããŸããïŒãã ãããããå®è¡ããç¬èªã®ã³ã¬ã¯ã·ã§ã³ãäœæããããšã¯ã§ããŸãïŒã
ããã¯åäœã®å€æŽã§ã¯ãããŸããã ã³ã¬ã¯ã·ã§ã³ãã¡ã¢ãªãååŸããå Žæãå¶åŸ¡ããæ£åœãªçç±ã¯ãããããããŸããããããã¯ãã¹ãŠãããã©ãŒãã³ã¹ããªã³ã«ãŒã¹ã¯ãªãããããã°ã©ã å šäœã®ã¡ã¢ãªã¬ã€ã¢ãŠãã®å¶åŸ¡ãªã©ã®ãå€éšæ§ãã«é¢é£ããŠããŸãã
align_allocatorã®ãããªãã®ã䜿çšãããšãå¥ã®ã¢ãã±ãŒã¿ãŒã䜿çšããŠãæªå®çŸ©ã®åäœãåŒã³åºããã«ããããã®ã¿ã€ããããŒãå²ãåœãŠããstdã³ã¬ã¯ã·ã§ã³ã«é 眮ããããšãã§ããŸãã
ããããEigenã®aligned_allocatorã§ã¯ãªããTBBã®cache_aligned_allocatorã«ã€ããŠå ·äœçã«èšåããçç±ã§ãã cache_aligned_allocatorã¯ãããã¥ã¡ã³ãå ã®ç¹å®ã®é 眮ãä¿èšŒããŠããªãããã§ãïŒãéåžžã128ãã€ãã§ãããšã ãèšã£ãŠããŸãïŒããŸããä¿èšŒãããšããŠããéåžžã¯ãã®ç®çã«ã¯äœ¿çšãããŸããïŒé 眮ã倧ããããŠäžè¬çã§ã¯ãªãããïŒ SIMDã¿ã€ãã§ãããããŒãžæŽåDMAãªã©ã«ã¯å°ããããŸãïŒã ããªããèšãããã«ããã®ç®çã¯åœå ±æãé¿ããããšã§ãã
@gnzlbg
FWIWããã©ã¡ããªãã¯ã¢ãã±ãŒã¿ãŒã¯ã¢ãã±ãŒã¿ãŒãå®è£ ããã®ã«éåžžã«äŸ¿å©ã§ãã
æå³ã«ã€ããŠããå°ã詳ããæããŠããã ããŸããïŒ ã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒãAllocãã¬ã€ãã§ãã©ã¡ãŒã¿ãŒåã§ããªãçç±ã¯ãããŸããïŒ ãŸãã¯ãç¬èªã®ã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒãã¬ã€ãã䜿çšããŠãæçµçãªã¢ãã±ãŒã¿ãŒã«Allocãã¬ã€ããå®è£ ããŸãïŒãããã®2ã€ã®ãã¬ã€ãã¯å¿ ãããçããå¿ èŠã¯ãããŸããïŒã
ã¯ã£ããããŠããªãã£ããšæããŸãã ãã£ãšãã説æããããšæããŸãã 次ã®ããããã䜿çšããäºå®ã®ã¢ãã±ãŒã¿ãå®è£ ããŠãããšããŸãããã
ãããŠããã®ã¢ãã±ãŒã¿ãŒãå®è£
ããããã«ãå
éšã§Vec
ã䜿çšããããšããŸãã ä»æ¥ååšããVec
çŽæ¥äœ¿çšããããšã¯ã§ããŸããã
Vec
ã¯ãããŸãããããã£ãŠãå¿
èŠãªã®ã¯ãåçŽãªå
éšç°¿èšã®ããã«å
éšã§äœ¿çšããå¥ã®ã¢ãã±ãŒã¿ã§ãã©ã¡ãŒã¿åãããVec
ã䜿çšã§ããããã«ããããšã§ãã ãããbsallocã®ç®æšã§ãïŒãããŠååã®ç±æ¥-ä»ã®ã¢ãã±ãŒã¿ãŒãããŒãã¹ãã©ããããããã«äœ¿çšãããŸãïŒã
elfmallocã§ã¯ã次ã®æ¹æ³ã§ã°ããŒãã«ã¢ãã±ãŒã¿ãŒã«ãªãããšãã§ããŸãã
ãã®å Žåãã·ã¹ãã ã¢ãã±ãŒã¿ãŒãã°ããŒãã«ã¢ãã±ãŒã¿ãŒãšããŠäœ¿çšããŠã³ã³ãã€ã«ããªãããšãéèŠã§ããããŒãããããšãååž°çãªäŸåé¢ä¿ãåå°å ¥ãããããããã®æç¹ã§ç§ãã¡ã¯ã·ã¹ãã ã¢ãã±ãŒã¿ãŒã«ãªããŸãã
ãã ãã次ã®å Žåã¯æ©èœããŸããã
OTOHãC ++æšæºã¯ãSIMDã¿ã€ãã®ãããªãªãŒããŒã¢ã©ã€ã³ãããã¿ã€ãããµããŒãããŠããŸãããæ°ããã¿ã€ããããŒãå²ãåœãŠããããšãããšãæªå®çŸ©ã®åäœãåŒã³åºãããŸãïŒ
posix_memalign
ãªã©ã䜿çšããå¿ èŠããããŸãïŒã
çŸåšã®Alloc
ç¹æ§ã¯ã¢ã©ã€ã³ã¡ã³ãããã©ã¡ãŒã¿ãŒãšããŠåãã®ã§ããã®ã¯ã©ã¹ã®åé¡ïŒãå¥ã®ã¢ã©ã€ã³ã¡ã³ããªãã§ã¯äœæ¥ã§ããªããåé¡ïŒã¯è§£æ¶ããããšæããŸããïŒ
@ gnzlbg-å æ¬çãªèšè¿°ïŒããããšãïŒã§ãããæ°žç¶ã¡ã¢ãªãã«ããŒãããŠãŒã¹ã±ãŒã¹ã¯ãããŸãã*ã
ãã®ãŠãŒã¹ã±ãŒã¹ãèæ ®ããå¿ èŠã
'static
ã¯ãããŸãããRustã«ã¯ãããã§äž»å°æš©ãæ¡ããHDãSSDãããã«ã¯PCIæ¥ç¶ã¹ãã¬ãŒãžã«åã£ãŠä»£ãããã¡ãŒã¹ãã¯ã©ã¹ã®ãã©ãããã©ãŒã ã«ãã絶奜ã®æ©äŒããããŸãã
*ããæè¿ãŸã§å°ãç¹å¥ã ã£ãã®ã§ãé©ãããšã§ã¯ãããŸããã çŸåšãLinuxãFreeBSDãããã³Windowsã§åºããµããŒããããŠããŸãã
@raphaelcohn
ããã¯æ¬åœã«æ°žç¶çãªã¡ã¢ãªã解決ããå Žæã§ã¯ãããŸããã æ°žç¶ã¡ã¢ãªãžã®ã€ã³ã¿ãŒãã§ã€ã¹ã«é¢ããèãæ¹ã¯ããªãã ãã§ã¯ãããŸãããããšãã°ãããŒã¿ã®æŽåæ§ã®çç±ãããäžè¬çãªã¢ãããŒãã¯åã«é«éãã£ã¹ã¯ã®ããã«æ±ãããšã§ããããšãå€æããå ŽåããããŸãã
ãã®ããã«æ°žç¶ã¡ã¢ãªã䜿çšãããŠãŒã¹ã±ãŒã¹ãããå Žåã¯ãæåã«ä»ã®å Žæã§ãã®ã±ãŒã¹ãäœæããæ¹ãããã§ãããã ããããããã¿ã€ãåããã¢ãã±ãŒã¿ãŒã€ã³ã¿ãŒãã§ãŒã¹ã«ããã€ãã®ããå ·äœçãªå€æŽãèãåºããçæ³çã«ã¯ããããã®å€æŽãå¹³åçãªå Žåã«äžãã圱é¿ã«èŠåã䟡å€ããããšäž»åŒµããŸãã
@rpjohnst
åæããŸããã ããã¯ãŸãã«ãããå±ããå Žæã®ãããªãã®ã§ãã çŠç¹ãçãããŠèšŒæ ãæ¢ããçµæãšããŠãã¶ã€ã³ãäœæããããšãã決å®ãäžãããã®ãé¿ããããšæããŸãã
çŸåšã®IntelPMDKïŒäœã¬ãã«ã®ãŠãŒã¶ãŒã¹ããŒã¹ãµããŒãã«å€ãã®åªåã泚ãããŠããïŒã¯ãå²ãåœãŠãããããã€ã³ã¿ãŒä»ãã®éåžžã®ã¡ã¢ãªïŒ mmap
çµç±ã®ã¡ã¢ãªãšåæ§ã®ã¡ã¢ãªïŒãšããŠã¯ããã«è¿ã¥ããŠããŸãã 確ãã«ãLinuxã§æ°žç¶ã¡ã¢ãªãæäœãããå Žåã¯ãçŸæç¹ã§ãããã»ãšãã©å¯äžã®åŒã³åºãããŒãã§ãããšæããŸãã æ¬è³ªçã«ãããã䜿çšããããã®æãé«åºŠãªããŒã«ãããã®1ã€ïŒå¿
èŠã«å¿ããŠäžè¬çãªããŒã«ãããïŒã¯ãå²ãåœãŠãããã¡ã¢ãªãšããŠæ±ããŸãã
ããããããã¿ã€ãã³ã°ããããšã«é¢ããŠã¯-ãŸããããã¯ãŸãã«ç§ããã£ããšèšã£ãããš
ç§ã¯æè¿ãæ°žç¶ã¡ã¢ãªã¢ãã±ãŒã¿ïŒå ·äœçã«ã¯libpmemctoïŒã®Rustã©ãããŒã«åãçµãã§ããŸãã
ïŒ https://crates.io/crates/nvmlã§ç§ã®ã¯ã¬ãŒãã®åæããŒãžã§ã³ã䜿çšã§ãcto_pool
ã¢ãžã¥ãŒã«ã®ãœãŒã¹ç®¡çã«ã¯ããã«å€ãã®å®éšããããŸãïŒã
ç§ã®ãããã¿ã€ãã¯ãå®éã®å€§èŠæš¡ã·ã¹ãã ã§ããŒã¿ã¹ãã¬ãŒãžãšã³ãžã³ã眮ãæããããã«å¿ èŠãªãã®ã念é ã«çœ®ããŠæ§ç¯ãããŠããŸãã åæ§ã®èãæ¹ããç§ã®ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã®å€ãã®èåŸã«ãããŸãã ç§ã¯äœå¹Žã«ãããã£ãŠãå®éã®äœ¿çšæ³ãã掟çããæé«ã®æšæºã§ããæé«ã®ã©ã€ãã©ãªãèŠã€ããŸããã
å®éã®ã¢ãã±ãŒã¿ãçŸåšã®ã€ã³ã¿ãŒãã§ã€ã¹ã«é©åãããããšãããããªãã®ã¯ãããŸããã ççŽã«èšã£ãŠã Alloc
ã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšãã次ã«Vec
å
šäœãã³ããŒããããã埮調æŽãããšããçµéšã¯èŠçã§ããã å€ãã®å Žæã§ã¯ãã¢ãã±ãŒã¿ãæž¡ãããªããšæ³å®ããŠããŸãïŒäŸïŒ Vec::new()
ã
ãã®éãå ã®ã³ã¡ã³ãã§ãã¢ãã±ãŒã¿ãŒã«äœãå¿ èŠãããã®ãããªã¢ãã±ãŒã¿ãŒã®ãŠãŒã¶ãŒã«äœãå¿ èŠãã«ã€ããŠãããã€ãã®èŠ³å¯ãè¡ããŸããã ãããã¯ãã¢ãã±ãŒã¿ã€ã³ã¿ãŒãã§ã€ã¹ã«é¢ãããã£ã¹ã«ãã·ã§ã³ã¹ã¬ããã§éåžžã«æå¹ã ãšæããŸãã
è¯ããã¥ãŒã¹ã¯ã httpsïŒ //github.com/rust-lang/rust/issues/32838#issuecomment-358940992ããã®æåã®3ã€ã®ç®æ¡æžããä»ã®ãŠãŒã¹ã±ãŒã¹ã§å ±æãããŠããããšã§ãã
ãªã¹ãã«äžæ®çºæ§ã¡ã¢ãªãè¿œå ããªãã£ãããšãè¿œå ãããã£ãã ãã§ã
ãªã¹ãã«ã¯ãã³ã³ããããã©ã¡ãŒã¿åããã¢ãã±ãŒã¿ã®ãŠãŒã¹ã±ãŒã¹ããªã¹ããããŠããããã§ãã
å°ãªããšãç§ã®çµéšã§ã¯ããåºãã䜿çšãããŠããC ++ã®äžçïŒ
ç§ãèšåããã¢ãã¯ã¿ãŒã¯ãã»ãšãã©ãå€ãã®äººã«äœ¿çšãããŠããéåžžã«äººæ°ã®ããã©ã€ãã©ãªããã®ãã®ã§ãïŒã
Intel SDKïŒäžéšã®ã©ã€ãã©ãªïŒã®åãçµã¿ã«ã€ããŠã¯ç¥ã£ãŠããŸãã
ã¿ãŒã²ããC ++ïŒç§ã¯ãããã䜿çšããŠãããããžã§ã¯ããå人çã«ç¥ããŸããïŒåœŒãã¯æã£ãŠããŸãã
std :: vectorã§äœ¿çšã§ããã¢ãã±ãŒã¿ïŒ ç¥ããŸããïŒã ããã¯ããŸãã
ãããã䜿çšãããŠããããéèŠã§ããªãããšãæå³ããŸãã ç¥ããã
ãããã«ã€ããŠã§ãããç§ã®æçš¿ã®èŠç¹ã¯ããã©ã¡ãŒã¿åããããšã§ãã
ã³ã³ããã«ããã¢ãã±ãŒã¿ã¯éåžžã«è€éã§ããã
ã³ã³ããã®ãã¢ãéããããšãªããã·ã¹ãã ã¢ãã±ãŒã¿ãé²æ©ããã
ïŒããããåŸã§ããã«åãçµãå¿
èŠããããŸãïŒã
2018幎1æ21æ¥17:36ããžã§ã³ãšãªã¯ãœã³[email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
è¯ããã¥ãŒã¹ã¯ãïŒ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
ã
ç§ã¯ãã§ã«æžãããŠãããã®ã®ã»ãšãã©ãèªã¿èŸŒãããšããã®ã§ãããã¯ãã§ã«ããã«ãããããããŸããããã®å Žåãç§ããããèŠéããå Žåã¯ç³ãèš³ãããŸããããããã«è¡ããŸãïŒ
ã²ãŒã ïŒC / C ++ïŒã§ããªãäžè¬çãªã®ã¯ãããã¬ãŒã ããšã®ã¹ã¯ã©ããå²ãåœãŠãã䜿çšããããšã§ããããã¯ãç¹å®ã®æéïŒã§ïŒæå¹ãªå²ãåœãŠã«äœ¿çšãããç·åœ¢/ãã³ãã¢ãã±ãŒã¿ãŒãããããšãæå³ããŸããã²ãŒã ãã¬ãŒã ïŒãããŠãç Žå£ããããŸãã
ãã®å Žåã¯ç Žæ£ãããŸããã€ãŸããã¢ãã±ãŒã¿ãéå§äœçœ®ã«ãªã»ããããŸãã ãããã®ãªããžã§ã¯ãã¯PODã¿ã€ãã§ããå¿ èŠãããããããªããžã§ã¯ãã®ãç Žå£ãã¯ãŸã£ãããããŸããïŒãããã£ãŠããã¹ãã©ã¯ã¿ã¯å®è¡ãããŸããïŒã
ãã®ãããªãã®ãRustã®çŸåšã®ã¢ãã±ãŒã¿ãŒã®èšèšã«é©åããã®ã ãããïŒ
ïŒç·šéïŒãªããžã§ã¯ãã®ç Žå£ããªãã¯ãã§ãïŒ
@emoon
ã²ãŒã ïŒC / C ++ïŒã§ããªãäžè¬çãªã®ã¯ãããã¬ãŒã ããšã®ã¹ã¯ã©ããå²ãåœãŠãã䜿çšããããšã§ããããã¯ãç¹å®ã®æéïŒã§ïŒæå¹ãªå²ãåœãŠã«äœ¿çšãããç·åœ¢/ãã³ãã¢ãã±ãŒã¿ãŒãããããšãæå³ããŸããã²ãŒã ãã¬ãŒã ïŒãããŠãç Žå£ããããŸãã
ãã®å Žåã¯ç Žæ£ãããŸããã€ãŸããã¢ãã±ãŒã¿ãéå§äœçœ®ã«ãªã»ããããŸãã ãããã®ãªããžã§ã¯ãã¯PODã¿ã€ãã§ããå¿ èŠãããããããªããžã§ã¯ãã®ãç Žå£ãããŸã£ãããããŸããïŒãããã£ãŠããã¹ãã©ã¯ã¿ã¯å®è¡ãããŸããïŒã
å®è¡å¯èœã§ããå¿
èŠããããŸãã é ã®ãŠã£ãºããããã¢ãªãŒãèªäœã«1ã€ã®ãªããžã§ã¯ããšãã¢ãªãŒãã®ãã¬ãŒã ããšã®ãã³ãã«ã§ããå¥ã®ãªããžã§ã¯ããå¿
èŠã«ãªããŸãã 次ã«ããã®ãã³ãã«ã«Alloc
ãå®è£
ããå²ãåœãŠã«é«ã¬ãã«ã®å®å
šãªã©ãããŒã䜿çšããŠãããšä»®å®ããŸãïŒããšãã°ã Box
ãAlloc
ãã©ã¡ããªãã¯ã«ãªããšæ³åããŠãã ããïŒãã©ã€ãã¿ã€ã ã¯ããã¬ãŒã ããšã®ãã³ãã«ãåé€ãããåã«ãå²ãåœãŠããããã¹ãŠã®ãªããžã§ã¯ããåé€ãããããšãä¿èšŒããŸãã dealloc
ã¯åŒãç¶ããªããžã§ã¯ãããšã«åŒã³åºãããŸããã dealloc
ãããŒãªãã¬ãŒã·ã§ã³ã®å Žåãããããã¢ã³ããã¢ãã±ãŒã·ã§ã³ããžãã¯å
šäœãå®å
šã«ãŸãã¯ã»ãšãã©æé©åãããŠããå¯èœæ§ãããããšã«æ³šæããŠãã ããã
Drop
å®è£
ããªãã«ã¹ã¿ã ã¹ããŒããã€ã³ã¿ã¿ã€ãã䜿çšããããšãã§ããŸããããã«ãããä»ã®å Žæã§å€ãã®ããšãç°¡åã«ãªããŸãã
ããããšãïŒ å ã®æçš¿ã§ã¿ã€ããã¹ãããŸããã ããã¯ããªããžã§ã¯ãã®ç Žå£ã
ã¢ãã±ãŒã¿ãŒã®å°é家ã§ã¯ãªãããã®ã¹ã¬ããããã©ãããšãã§ããªã人ã ã«ãšã£ãŠãçŸåšã®ã³ã³ã»ã³ãµã¹ã¯äœã§ããïŒstdlibã³ã¬ã¯ã·ã§ã³ã¿ã€ãã®ã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒããµããŒãããäºå®ã§ããïŒ
@alexregæçµçãªèšç»ãäœã§ãããã¯std
ããã©ã«ãåã®å€æ°ãçãããã§ãããç§ã¯ã¡ããã©ããäœãã«ã¯åé¡ããªãã®ã§ã alloc
ç§ãã¡ã¯ä»ã®ãšããã®ã¿ã®ãã®ã劚ããããããšãªãlibåŽã§é²æ©ãéããããšãã§ããŸãã
@ Ericson2314ããããŸãããèããŠããã£ãã§ãã ããã©ã«ãã®åå€æ°ã¯ãŸã å®è£
ãããŠããŸããïŒ ãŸãã¯RFCã®æ®µéã§ããããïŒ ããªããèšãããã«ãããããalloc / std::heap
ã«é¢é£ãããã®ã«å¶éãããŠããã ããªããããã¯ãã¹ãŠå€§äžå€«ãªã¯ãã§ãã
@alexreghttps ïŒ //github.com/rust-lang/rfcs/pull/2321ãåç §ããŠãã ãã
AllocErrã¯ãšã©ãŒã«ãªãã¯ãã ãšæ¬åœã«æããŸãã ä»ã®ã¢ãžã¥ãŒã«ïŒäŸïŒioïŒãšã®æŽåæ§ãé«ããªããŸãã
impl Error for AllocError
ããããæå³ãããã害ã¯ãããŸããããç§ã¯å人çã«Error
ç¹æ§ã圹ã«ç«ããªãããšã«æ°ã¥ããŸããã
ä»æ¥ãLayout :: from_size_aligné¢æ°ãèŠãŠããŸããããã align
ã¯2 ^ 31ïŒã€ãŸãã 1 << 31
ïŒãè¶
ããŠalign
ãªããŸããããšããå¶éã¯ç§ã«ã¯æå³ããããŸããã§ããã ãããŠãgitã®éé£ã¯ïŒ30170ãææããŸããã
ããã¯éåžžã«æ¬ºççãªã³ãããã¡ãã»ãŒãžã§ãããu32ã«align
é©åããããšã«ã€ããŠè©±ããŠããŸããããããã¯å¶çºçãªãã®ã§ãããå®éã«ãä¿®æ£ããããŠããïŒããåé¿ãããŠããïŒã®ã¯ã·ã¹ãã ã¢ãã±ãŒã¿ãŒã®èª€åäœã§ãã
ããã¯ç§ããã®ã¡ã¢ã«å°ããŸãïŒããã®ãOSX / alloc_systemã¯å·šå€§ãªé 眮ã§ãã°ããããŸããé ç®ã¯ãã§ãã¯ãããã¹ãã§ã¯ãããŸããã çŽæ¥çãªåé¡ã¯åŠçãããŠããŸãããé·æçã«ã¯ä¿®æ£ãé©åã§ãããšã¯æããŸãããã·ã¹ãã ã¢ãã±ãŒã¿ãŒã®èª€åäœã¯ãåäœããã¢ãã±ãŒã¿ãŒã®å®è£ ã劚ããã¹ãã§ã¯ãªãããã§ãã ãããŠãLayout :: from_size_alignã®ä»»æã®å¶éããããè¡ããŸãã
@glandium 4ã®ã¬ãã€ã以äžã®åæ°ãžã®ã¢ã©ã€ã³ã¡ã³ãããªã¯ãšã¹ããããšäŸ¿å©ã§ããïŒ
4GiBã®å²ãåœãŠã4GiBã«æãããå Žåãæ³åââã§ããŸããããã¯çŸåšã¯äžå¯èœã§ããããã以äžã«ãªãããšã¯ã»ãšãã©ãããŸããã ããããä»ã¯ãã®ãããªçç±ãèããŠããªããããšãã£ãŠãæ£æçãªå¶éãå ããã¹ãã§ã¯ãªããšæããŸãã
4GiBã®å²ãåœãŠã4GiBã«æãããå Žåãæ³åââã§ããŸãã
ãããã®ã±ãŒã¹ã¯äœã§ããïŒ
4GiBã®å²ãåœãŠã4GiBã«æãããå Žåãæ³åââã§ããŸãã
ãããã®ã±ãŒã¹ã¯äœã§ããïŒ
å
·äœçã«ã¯ãç§ã ãã§ä»»æã®å€§ããã®ã¢ã©ã€ã¡ã³ãã®ããã®ãµããŒããè¿œå ããŸããmmap-alloc
ã§äœ¿çšããã¡ã¢ãªã®å€§èŠæš¡ãªãæŽåã¹ã©ãã®å²ãåœãŠããµããŒãããããã«ã elfmalloc
ã ã¢ã€ãã¢ã¯ãã¡ã¢ãªã®ã¹ã©ãããã®ãµã€ãºã«æããŠããã®ã¹ã©ãããå²ãåœãŠããããªããžã§ã¯ããžã®ãã€ã³ã¿ãäžããããå Žåãå«ãŸããŠããã¹ã©ããèŠã€ããããã«äžäœãããããã¹ã¯ããã ãã§ããããã«ããããšã§ãã çŸåšã4GBã®ãµã€ãºã®ã¹ã©ãã¯äœ¿çšããŠããŸããïŒå€§ããªãªããžã§ã¯ãã®å Žåã¯ãçŽæ¥mmapã«ç§»åããŸãïŒãã䜿çšã§ããªãã£ãçç±ã¯ãªããRAMèŠä»¶ã倧ããã¢ããªã±ãŒã·ã§ã³ã§å®è¡ããããšèããŠããŸãããããïŒã€ãŸããmmapã®ãªãŒããŒããããåãå
¥ããããªãã»ã©é »ç¹ã«ãã«ãGBãªããžã§ã¯ããå²ãåœãŠãå ŽåïŒã
4GiBãè¶ ããé 眮ã®èãããã䜿çšäŸã¯æ¬¡ã®ãšããã§ãã倧ããªããŒãžå¢çãžã®é 眮ã 4GiBãè¶ ããããŒãžããµããŒããããã©ãããã©ãŒã ã¯ãã§ã«ååšããŸãã ãã®IBMææžã«ã¯ããPOWER5 +ããã»ããµãŒã¯ã4 KBã64 KBã16 MBãããã³16GBã®4ã€ã®ä»®æ³ã¡ã¢ãªãŒã»ããŒãžã»ãµã€ãºããµããŒãããŠããããšãµããŒãããŸãã
Allocãã¬ã€ãã®åæå®ãããŠããªãé¢æ°ã¯ãã¹ãŠã *mut u8
ãŸãã ã€ãŸããnullãã€ã³ã¿ãŒãååŸãŸãã¯è¿ãå¯èœæ§ãããããã¹ãŠã®å°çã解ãæŸãããŸãã 代ããã«NonNull
ã䜿çšããå¿
èŠããããŸããïŒ
圌ããè¿ãããšãã§ããå€ãã®ãã€ã³ã¿ãããããããããã¹ãŠã®å°çã
ç·©ããŸãã
3:56ãã€ã¯Hommeyã®ææ¥ã2018幎3æ4æ¥ã«[email protected]æžããŸããïŒ
Allocãã¬ã€ãã®åæå®ãããŠããªãé¢æ°ã¯ãã¹ãŠã* mutu8ãåŠçããŠããŸãã
ã€ãŸããnullãã€ã³ã¿ãŒãååŸãŸãã¯è¿ãããšãã§ãããã¹ãŠã®å°çã¯
ç·©ããŸãã 代ããã«NonNullã䜿çšããå¿ èŠããããŸããïŒâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/32838#issuecomment-370223269 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ABY2UR2dRxDtdACeRUh_djM-DExRuLxiks5ta9aFgaJpZM4IDYUN
ã
NonNull
ã䜿çšãããã説åŸåã®ããçç±ã¯ãçŸåšAlloc
ã¡ãœããããè¿ãããResult
ãèš±å¯ããããšã§ãïŒãŸãã¯Options
ã«åãæ¿ãããšãå°æ¥ïŒå°ããããã
NonNullã䜿çšãããã説åŸåã®ããçç±ã¯ãAllocã¡ãœããïŒãŸãã¯å°æ¥ããã«åãæ¿ããå Žåã¯OptionsïŒããçŸåšè¿ãããçµæãå°ããã§ããããšã§ãã
AllocErr
ã¯2ã€ã®ããªãšãŒã·ã§ã³ãããããããããªããšã¯æããŸããã
圌ããè¿ãããšãã§ããå€ãã®ãã€ã³ã¿ãŒãããããããããã¹ãŠã®å°çã解ãæŸãããŸãã
ããããnullãã€ã³ã¿ãŒã¯ãä»ã®ã©ã®ãã€ã³ã¿ãŒãããæããã«ééã£ãŠããŸãã
ãã³åã·ã¹ãã ã¯ãããã¬ã³ã«åœ¹ç«ã¡ãäžå€æ¡ä»¶ããšã³ã³ãŒãããããã«äœ¿çšããããšæããŸãã alloc
ã®ããã¥ã¡ã³ãã«ã¯ãããã®ã¡ãœãããOk(addr)
è¿ãå Žåãè¿ãããã¢ãã¬ã¹ã¯null以å€ã®ã¢ãã¬ã¹ã«ãªããŸãããšæèšãããŠããŸããããã®æ»ãå€ã®åã¯ããã§ã¯ãããŸããã å®ã¯ã Ok(malloc(layout.size()))
ã¯ãæããã«ããã§ã¯ãªãå Žåã§ããæå¹ãªå®è£
ã«ãªããŸãã
Layout
ãµã€ãºããŒã以å€ã§ããå¿
èŠããããšããã¡ã¢ãããã®ã§ããããNonZeroãšããŠãšã³ã³ãŒãããå¿
èŠãããããšã«ã泚æããŠãã ããã
ããããã¹ãŠã®æ©èœãæ¬è³ªçã«å®å šã§ãªããããšãã£ãŠããããã¬ã³ãé²ãã¹ãã§ã¯ãããŸããã
ã¢ãã±ãŒã¿ãŒã®äœ¿çšïŒç·šéïŒããã³å®è£ ïŒã§çºçããå¯èœæ§ã®ãããã¹ãŠã®ãšã©ãŒã®äžã§ãnullãã€ã³ã¿ãŒãæž¡ãããšã¯ã远跡ããã®ãæãç°¡åãªãã®ã®1ã€ã§ãïŒå°ãªããšãMMUããããå®è¡ããªãã£ãå Žåã¯ãéåç §æã«åžžã«ã¯ãªãŒã³ãªã»ã°ã¡ã³ããŒã·ã§ã³éåãçºçããŸãéåžžã«å¥åŠãªããšã§ãïŒããããŠéåžžãä¿®æ£ããã®ãæãç°¡åãªãã®ã®1ã€ã§ãã å®å šã§ãªãã€ã³ã¿ãŒãã§ãŒã¹ããããã¬ã³ãé²ãããšããã®ã¯äºå®ã§ããããã®ãããã¬ã³ã¯ïŒä»ã®èãããããšã©ãŒãåã·ã¹ãã ã§ãã®äžå€æ¡ä»¶ããšã³ã³ãŒãããåé·æ§ãšæ¯èŒããŠïŒäžé£ãåãã«å°ããããã§ãã
ããã«ãã¢ãã±ãŒã¿ãŒã®å®è£
ã§ã¯ããããã©ãŒãã³ã¹ã®ããã«ã NonNull
ã®ãã§ãã¯ãããŠããªãã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããå¯èœæ§ããããŸããæ£ããã¢ãã±ãŒã¿ãŒã§ã¯ããšã«ããnullãè¿ãããããšã¯ãªãããã NonNell::new(...).unwrap()
ãã¹ãããããå¿
èŠããããŸãã ãã®å Žåãå®éã«ã¯å
·äœçãªãããã¬ã³ã®äºé²çã¯åŸããããå®åçãªãã®ãå¢ããã ãã§ãã ïŒ Result
ãµã€ãºã®ã¡ãªããã¯ãå®éã®å Žåã§ããããã§ã説åŸåã®ããçç±ã§ããå¯èœæ§ããããŸããïŒ
ã¢ãã±ãŒã¿ãŒã®å®è£ ã§ã¯ãNonNullã®ãã§ãã¯ãããŠããªãã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããã ãã§ãã
éèŠãªã®ã¯ããŠãŒã¶ãŒãæ¯æŽããããšããããã¢ãã±ãŒã¿ãŒã®å®è£
ãæ¯æŽããããšã§ãã MyVec
ã«NonNull<T>
MyVec
ãå«ãŸããŠããŠã Heap.alloc()
ãã§ã«NonNull
è¿ããŠããå Žåã¯ããã§ãã¯ãããŠããªãããŸãã¯å®å
šã§ãªããã§ãã¯ãããŠããªãåŒã³åºãã1åè¡ãå¿
èŠããããŸãã
ãã€ã³ã¿ã¯æ»ãå€ã®åã§ããã ãã§ãªããããšãã°dealloc
ãrealloc
ãžã®å
¥ååã§ãããããšã«æ³šæããŠãã ããã ãããã®é¢æ°ã¯ãå
¥åãnullã§ããå¯èœæ§ããããã©ããã«å¯ŸããŠã匷åãããã¯ãã§ããïŒ ããã¥ã¡ã³ãã¯ããããããšèšãåŸåããããŸãããåã·ã¹ãã ã¯ãã¯ãããšèšãåŸåããããŸãã
layout.sizeïŒïŒãšãŸã£ããåãã§ãã å²ãåœãŠé¢æ°ã¯ãèŠæ±ããããµã€ãºã0ã§ããããšãäœããã®åœ¢ã§åŠçããããšã«ãªã£ãŠããŸããïŒ
ïŒçµæãµã€ãºã®å©ç¹ã¯ãå®éã®å Žåã§ããããã§ã説åŸåã®ããçç±ã§ããå¯èœæ§ããããŸããïŒ
ãµã€ãºã®ã¡ãªããããããšã¯æããŸããããïŒ48741ã®ãããªãã®ã䜿çšãããšãcodegenã®ã¡ãªããããããŸãã
APIã®ãŠãŒã¶ãŒã«ãšã£ãŠããæè»ã§ãããšããååãç¶ç¶ããå Žåããã€ã³ã¿ãŒã¯æ»ãå€ã®åã§ã¯NonNull
ã§ããå¿
èŠããããŸãããåŒæ°ã§ã¯ããã§ã¯ãããŸããã ïŒããã¯ããããã®åŒæ°ãå®è¡æã«nullãã§ãã¯ããå¿
èŠããããšããæå³ã§ã¯ãããŸãããïŒ
ãã¹ãã«ã®æ³åã¢ãããŒãã¯ãããã§æ¡çšããã®ã¯ééã£ãŠãããšæããŸãã äœããããŸãã
Allocã¡ãœããã«nullãã€ã³ã¿ãæž¡ãããšãæå¹ãªå Žåã¯ïŒ ããã§ãªãå Žåã¯ã
ãã®æè»æ§ã¯åºæ¬çã«ãããã¬ã³ã«ããå°ãã ãäžããããšã§ã
ææãªããªã¬ãŒã
2018幎3æ5æ¥åå8æããSimonSapinã [email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
APIã®ãŠãŒã¶ãŒã«ãšã£ãŠããæè»ã§ãããšããååãç¶ç¶ãããšã
ãã€ã³ã¿ã¯ãæ»ãå€ã®åã§ã¯NonNullã§ããå¿ èŠããããŸãããåŒæ°ã§ã¯ããã§ã¯ãããŸããã ïŒãã®
ãããã®åŒæ°ãå®è¡æã«nullãã§ãã¯ããå¿ èŠããããšããæå³ã§ã¯ãããŸãããïŒâ
ãã®ã¹ã¬ããã«ãµãã¹ã¯ã©ã€ãããŠããããããããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/32838#issuecomment-370327018 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AA_2L8zrOLyUv5mUc_kiiXOAn1f60k9Uks5tbOJ0gaJpZM4IDYUN
ã
éèŠãªã®ã¯ããŠãŒã¶ãŒãæ¯æŽããããšããããã¢ãã±ãŒã¿ãŒã®å®è£ ãæ¯æŽããããšã§ãã MyVecã«NonNullãå«ãŸããŠããå Žå
ãããŠãHeap.allocïŒïŒã¯ãã§ã«NonNullãè¿ããŸããããã¯ãç§ãè¡ãå¿ èŠã®ãããã§ãã¯ãããŠããªãããŸãã¯å®å šã§ãªããã§ãã¯ãããŠããªãåŒã³åºãã§ãã
ãããããã¯çã«ããªã£ãŠããŸãã ãããã¬ã³ãä¿®æ£ããŸãããããã®è²¬ä»»ãäžå åããŸãã
ãã€ã³ã¿ã¯æ»ãå€ã®åã§ããã ãã§ãªããdeallocãreallocãªã©ãžã®å ¥ååã§ãããããšã«æ³šæããŠãã ããã ãããã®é¢æ°ã¯ãå ¥åãnullã§ããå¯èœæ§ããããã©ããã«å¯ŸããŠã匷åãããã¯ãã§ããïŒ ããã¥ã¡ã³ãã¯ããããããšèšãåŸåããããŸãããåã·ã¹ãã ã¯ãã¯ãããšèšãåŸåããããŸãã
Allocã¡ãœããã«nullãã€ã³ã¿ãæž¡ãããšãæå¹ãªå Žåã¯ãããŸããïŒ ããã§ãªãå Žåããã®æè»æ§ã¯åºæ¬çã«ãããã¬ã³ã«ãããã«ææãªããªã¬ãŒãäžããã ãã§ãã
ãŠãŒã¶ãŒã¯çµ¶å¯Ÿã«ããã¥ã¢ã«ãèªã¿ãå¿ã®äžã§äžå€éãç¶æããŠããŸãã å€ãã®äžå€æ¡ä»¶ã¯ãåã·ã¹ãã ãä»ããŠåŒ·å¶ããããšã¯ã§ããŸãããå¯èœã§ããã°ãé¢æ°ã¯ããããå®å šã§ã¯ãããŸããã ãããã£ãŠãããã¯ãç¹å®ã®ã€ã³ã¿ãŒãã§ã€ã¹ã«NonNullãé 眮ããããšãå®éã«ãŠãŒã¶ãŒãæ¯æŽãããã©ããã®åé¡ã«ãããŸããã
ç§ã¯ãäŸãã°ãã®åŒæ°äœãã«ä»»æã®åŒ·åãªå©ç¹ã衚瀺ãããŠããªãdealloc
ã«NonNull
ã ãã®APIã®äœ¿çšã«ã¯ãããã2ã€ã®ã¯ã©ã¹ããããŸãã
alloc
ãåŒã³åºãæ¯èŒçç°¡åãªäœ¿çšæ³ã§ã¯ãè¿ããããã€ã³ã¿ãã©ããã«æ ŒçŽãããã°ããããŠãæ ŒçŽããããã€ã³ã¿ãdealloc
æž¡ããŸããdealloc
ã«æž¡ãããšãä¿èšŒããããã«éèŠãªããžãã¯ãé¢ä¿ããŠããŸããããã§NonNull
ã䜿çšãããšãåºæ¬çã«æåã®çš®é¡ã®ãŠãŒã¹ã±ãŒã¹ã®ã¿ã圹ç«ã¡ãŸããããã¯ã NonNull
ãé©åãªå Žæã«ä¿åããå€æŽããã«NonNull
æž¡ãããã§ãã çè«çã«ã¯ãè€æ°ã®ãã€ã³ã¿ãŒããžã£ã°ãªã³ã°ããŠããŠããã®ãã¡ã®1ã€ã ããNonNull
å Žåãããã€ãã®ã¿ã€ããã¹ïŒ bar
ãæå³ãããšãã«foo
ãæž¡ãïŒãé²ãããšãã§ããŸãããããã¯ããã§ã¯ãªãããã§ãããŸãã«ãäžè¬çãŸãã¯éèŠã§ãã dealloc
ãçã®ãã€ã³ã¿ãåãããšã®äžå©ãªç¹ïŒ alloc
ãNonNull
ãè¿ããš@ SimonSapinã¯ç§ãèµ·ããã¹ãã ãšç¢ºä¿¡ããŠããŸãïŒã¯ã as_ptr
ãå¿
èŠã«ãªãããšã§ããæœåšçã«è¿·æã§ãããã©ã¡ãã®æ¹æ³ã§ãå®å
šæ§ã«åœ±é¿ãäžããªããdeallocåŒã³åºãã
2çªç®ã®çš®é¡ã®ãŠãŒã¹ã±ãŒã¹ã¯ãããã»ã¹å
šäœã§NonNull
ã䜿ãç¶ããããšãã§ããªãå¯èœæ§ãããããã圹ã«ç«ã¡ãŸããããã®ãããååŸããçã®ãã€ã³ã¿ãŒããNonNull
ãæåã§åäœæããå¿
èŠããããŸããã©ããããããã åã«è°è«ããããã«ãããã¯å®éã®å®è¡æãã§ãã¯ã§ã¯ãªãããã§ãã¯ãããŠããªã/ unsafe
ã¢ãµãŒã·ã§ã³ã«ãªãå¯èœæ§ãé«ãããããããã¬ã³ã劚ããããããšã¯ãããŸããã
ããã¯ãç§ãdealloc
ãçã®ãã€ã³ã¿ãŒãåãããšã«è³æããŠãããšããããšã§ã¯ãããŸããã ãããã¬ã³ã«é¢ããŠäž»åŒµãããŠããå©ç¹ã¯èŠåœãããŸããã ã¿ã€ãã®äžè²«æ§ã¯ãããããããã©ã«ãã§åã€ã ãã§ãã
ç³ãèš³ãããŸãããããåã·ã¹ãã ãä»ããŠå€ãã®äžå€æ¡ä»¶ã匷å¶ããããšã¯ã§ããŸãã...ãããã£ãŠãè©ŠããŠã¿ãŸããããšèªã¿ãŸããã å®ç§ãåã®æµã«ããªãã§ãã ããïŒ
NonNull
ã«ãã£ãŠæäŸãããä¿èšŒãšã NonNull
ãšçã®ãã€ã³ã¿ãŒã®éãè¡ãæ¥ããå¿
èŠãã倱ããã人éå·¥åŠãšã®éã®ãã¬ãŒããªãã«ã€ããŠã ãšæããŸãã ã©ã¡ãã«ããŠããç¹ã«åŒ·ãæèŠã¯ãããŸãããã©ã¡ãã®åŽãäžåçã«æããŸãã
@cramertjãããã§ãç§ã¯ãã®ãããªè°è«ã®åæãå®éã«ã¯è²·ããŸããã Alloc
ã¯ããããŸãã§ãé ããããã»ãšãã©å®å
šã§ãªããŠãŒã¹ã±ãŒã¹ã®ããã®ãã®ã ãšäººã
ã¯èšããŸãã ãŸãããããŸãã§èªã¿ã«ããã³ãŒãã§ã¯ãã§ããã ãå®å
šã«ããããšæããŸã---æ£ç¢ºã«ã¯ãå
ã®äœè
ãããªãå¯èœæ§ãéåžžã«äœãããã§ãã éã«ãã³ãŒããæ°å¹ŽåŸã«èªã¿åãããŠããå Žåã¯ããšãŽããã¯ã¹ããã蟌ã¿ãŸãã ã©ã¡ãããšããã°ãããã¯éå¹æã§ãã ãªãã¿ã®ãªãèªè
ãå°çäžã§äœãèµ·ãã£ãŠããã®ããããããç解ã§ããããã«ãã³ãŒãã¯éåžžã«æ確ã«ãªãããã«åªããå¿
èŠããããŸãã ãã€ãºãå°ãªã<äžå€éãæ確ã§ãã
2çªç®ã®çš®é¡ã®ãŠãŒã¹ã±ãŒã¹ã¯ãããã»ã¹å šäœã§
NonNull
ã䜿ãç¶ããããšãã§ããªãå¯èœæ§ãããããã圹ã«ç«ã¡ãŸããããã®ãããååŸããçã®ãã€ã³ã¿ãŒããNonNull
ãæåã§åäœæããå¿ èŠããããŸããã©ããããããã
ããã¯åãªã調æŽã®å€±æã§ãããæè¡çãªå¿
ç¶æ§ã§ã¯ãããŸããã 確ãã«ãçŸåšãå€ãã®å®å
šã§ãªãAPIã¯çã®ãã€ã³ã¿ãŒã䜿çšããå¯èœæ§ããããŸãã äœãããªãŒãããŠãããããªæ¹æ³ã¯ã䜿çšããŠãåªããã€ã³ã¿ãã§ãŒã¹ã«åãæ¿ããNonNull
ãŸãã¯ä»ã®ã©ãããŒãã ããããã°ãä»ã®ã³ãŒããããç°¡åã«è¿œéã§ããŸãã ç§ã¯ãã°ãªãŒã³ãã£ãŒã«ãã§ããã¹ãŠéã³ããå®å
šã§ãªãã³ãŒãã§ãèªã¿ã«ãããæ
å ±éã®å°ãªãrawãã€ã³ã¿ãŒã«åžžã«é Œãçç±ã¯ãããŸããã
ããã«ã¡ã¯ïŒ
ç§ã¯ãRustã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒã®äœæè
/ä¿å®è
ãšããŠã NonNull
ãæ¯æããŠãããšèšãããã ãã§ãã ã»ãŒãã¹ãŠã®çç±ã§ããã®ã¹ã¬ããã§ãã§ã«èª¬æãããŠããŸãã
ãŸãã @ glandiumã¯Firefoxã®jemallocãã©ãŒã¯ã®
@ Ericson2314ãä»ã®äººãã¡ã«ãã£ãšå€ãã®è¿çãæžãããšãã§ããŸããããããã¯ããã«éåžžã«å€ç«ããå²åŠçãªè°è«ã«ãªãã€ã€ããã®ã§ãããã§ã¯çãããŸãã ç§ã¯ããã®çš®ã®APIã§ã®NonNull
ã®å®å
šäžã®å©ç¹ãèªåŒµããŠãããšç§ãä¿¡ããŠããããšã«å察ããŠããŸããïŒãã¡ãããä»ã®å©ç¹ããããŸãïŒã å®å
šäžã®ã¡ãªããããªããšããããã§ã¯ãããŸãããã @ cramertjãèšã£ãããã«ããã¬ãŒããªãããããããããåŽã¯èªåŒµãããŠãããšæããŸãã ãšã«ãããç§ã¯ä»ã®çç±ã§ããŸããŸãªå Žæã§NonNull
ã䜿çšããããšã«åŸåããŠãããšãã§ã«è¿°ã¹ãŸãã-äžè²«æ§ã®ããã«@SimonSapinãalloc
ã§ã dealloc
ã§äžããçç±ã§ãã ããã§ã¯ããããå®è¡ããŠããã以äžæ¥ç·ãå€ããªãããã«ããŸãããã
誰ããåå ããŠããNonNull
ãŠãŒã¹ã±ãŒã¹ãããã€ãããå Žåãããã¯çŽ æŽãããã¹ã¿ãŒãã§ãã
æ©æŠãå°ãªããšãliballoc
以å
ã«æããããã«ã Unique
ãšãã®å人ãæŽæ°ããŠã NonZero
ã§ã¯ãªãNonNull
ã䜿çšããããšããå§ãããŸãã ããããããã¯ãã¢ãã±ãŒã¿ãŒã®1ã€ã®æœè±¡åã¬ãã«ã§ãã§ã«è¡ã£ãŠããããšã®ããã«èŠããŸãããŸããã¢ãã±ãŒã¿ãŒã¬ãã«ã§ããããè¡ããªãçç±ã¯èããããŸããã ç§ã«ã¯åççãªå€æŽã®ããã«èŠããŸãã
ïŒ Unique<T>
ãšNonNull<T>
éã§å®å
šã«å€æããFrom
ãã¬ã€ãã®å®è£
ã¯ãã§ã«2ã€ãããŸããïŒ
å®å®ããéã®ã¢ãã±ãŒã¿ãŒAPIã«éåžžã«ãã䌌ããã®ãå¿ èŠã§ããããšãèæ ®ããŠãéã®ãªããžããªããã³ãŒããæœåºããå¥ã®ã¯ã¬ãŒãã«é 眮ããŸããã
ãã®/ could /ã¯ãAPIã®å®éšçãªå€æŽãç¹°ãè¿ãããã«äœ¿çšã§ããŸãããçŸæç¹ã§ã¯ãrustãªããžããªã«ãããã®ã®ãã¬ãŒã³ã³ããŒã§ãã
[ãªããããã¯]ããã std
ããã®ãããªããªãŒå€ã®å®å®ããã³ãŒãã¯ã¬ãŒãã䜿çšã§ããã°ãå®å®ããã³ãŒãã§äžå®å®ãªã€ã³ã¿ãŒãã§ã€ã¹ãè©Šãããšãã§ããŸãã ããããç§ãstd
ã®ãã¡ãµãŒããæã€ã®ã奜ããªçç±ã®1ã€ã§ãã
std
ã¯ãcrates.ioããã®ã¯ã¬ãŒãã®ã³ããŒã«äŸåããå¯èœæ§ããããŸãããããã°ã©ã ãåãã¯ã¬ãŒãã«ãäŸåããŠããå Žåããšã«ããåãã¯ã¬ãŒã/ã¿ã€ã/ç¹æ§ãrustcã«ã䌌ãŠããªããã®ã§ãç§ã¯ããŸãããããã©ã®ããã«åœ¹ç«ã€ãããããŸããã ãšã«ããããã¡ãµãŒãã«é¢ä¿ãªããå®å®ãããã£ãã«ã§äžå®å®ãªæ©èœã䜿çšã§ããªãããã«ããããšã¯ãå¶ç¶ã§ã¯ãªããéåžžã«æ
éãªéžæã§ãã
NonNullã䜿çšããããšã§ããçšåºŠã®åæãããããã§ãã ãããå®éã«èµ·ããããã®ä»åŸã®éã¯äœã§ããïŒ ãã ã®PRã§ããïŒ RFCïŒ
ç¡é¢ä¿ã«ãç§ã¯ãã¯ã·ã³ã°ã®ãã®ããçæãããããã€ãã®ã¢ã»ã³ããªãèŠãŠããŸããããããŠãšã©ãŒãã¹ã¯ããªã倧ããã§ãã ããã«ã€ããŠäœãããå¿ èŠããããŸããïŒ
äŸïŒ
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
ããã¯ãããã¯ã¹ãäœæããå Žæã«è¿œå ããããªãã®éã®ã³ãŒãã§ãã ã¢ãã±ãŒã¿ãŒAPIããªãã£ã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>
ãããå®éã«éèŠã§ããå Žåãããã¯ç¢ºãã«è¿·æã§ãã ããããLLVMã¯ããããã倧ããªããã°ã©ã åãã«æé©åããã®ã§ããããïŒ
ææ°ã®Firefoxã§ã¯æ¯æ©__rust_oom
ãžã®åŒã³åºãã1439åãããŸãã ãã ããFirefoxã¯rustã®ã¢ãã±ãŒã¿ã䜿çšããªããããmalloc / callocãçŽæ¥åŒã³åºãããç¶ããŠoomæºåã³ãŒãïŒéåžžã¯2ã€ã®movqãšleaïŒã«ãžã£ã³ãããnullãã§ãã¯ãè¡ãããAllocErrãå
¥åãããŠã¢ãã¬ã¹ãååŸãããŸãã __rust__oom
ã«æž¡ããŸãã ããã¯åºæ¬çã«æè¯ã®ã·ããªãªã§ãããããã§ã2ã€ã®movqãšleaã®ãã·ã³ã³ãŒãã¯20ãã€ãã§ãã
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ã«è²Œãä»ãããã®ãšåæ§ã®ã³ãŒãããã
@noxã¯ä»æ¥ã mergefunc
llvmãã¹ãæå¹ã«ããããšãæ€èšããŠããŸããããããã§äœãéããããã®ã§ã¯ãªãããšæããŸãã
mergefunc
ã¯ãè€æ°ã®åäžã®_ZN61_$LT$alloc..heap..Heap$u20$as$u20$alloc..allocator..Alloc$GT$3oom17h53c76bda5 0c6b65aE.llvm.nnnnnnnnnnnnnnn
é¢æ°ãåé€ããªãããã§ãïŒ RUSTFLAGS
-C passes=mergefunc
ã§è©ŠããŠã¿ãŸããïŒã
ãããã倧ããªéããçãã®ã¯LTOã§ããããã¯ãFirefoxãmallocãçŽæ¥åŒã³åºãããã«ãã __rust_oom
åŒã³åºãçŽåã«AllocErr
ã®äœæãä»»ããŸãã ããã«ãããã¢ãã±ãŒã¿ãåŒã³åºãåã«Layout
å¿
èŠããªããªãã AllocErr
åãããšãã«ãã®ãŸãŸã«ãªããŸãã
ããã«ããã __rust_oom
ãé€ããŠãå²ãåœãŠé¢æ°ã¯ããããã€ã³ã©ã€ã³ã§ããŒã¯ããå¿
èŠããããšæããŸãã
ãšããã§ãFirefoxçšã«çæãããã³ãŒããèŠãŠã malloc
代ããã«moz_xmalloc
ã䜿çšããããšãçæ³çã ãšæããŸãã ããã¯ãã¢ãã±ãŒã¿ãŒç¹æ§ã®çµã¿åãããšã°ããŒãã«ããŒãã¢ãã±ãŒã¿ãŒã®çœ®ãæãããªããã°äžå¯èœã§ãããã¢ãã±ãŒã¿ãŒç¹æ§ã®ã«ã¹ã¿ã ãšã©ãŒã¿ã€ããå¿
èŠã«ãªãå¯èœæ§ããããŸãã moz_xmalloc
ã¯ééããªãã次ã®å Žåã«ã¯è¿ãããŸããã倱æã IOWãããã¯OOMèªäœãåŠçãããã®å Žåãéã³ãã³ãŒãã¯__rust_oom
ãåŒã³åºãå¿
èŠã¯ãããŸããã ããã«ãããã¢ãã±ãŒã¿é¢æ°ããªãã·ã§ã³ã§AllocErr
ã§ã¯ãªã!
è¿ãããšãæãŸããã§ãããã
AllocErr
ããŒããµã€ãºã®æ§é äœã«ããããšã«ã€ããŠèª¬æããŸããããããããã§åœ¹ç«ã€å¯èœæ§ããããŸãã ãã€ã³ã¿ãNonNull
ã«ãããšãæ»ãå€å
šäœããã€ã³ã¿ãµã€ãºã«ããããšãã§ããŸãã
https://github.com/rust-lang/rust/pull/49669ã¯ãã°ããŒãã«ã¢ãã±ãŒã¿ãŒãã«ããŒãããµãã»ãããå®å®ãããããšãç®çãšããŠããããã®APIã«å€ãã®å€æŽãå ããŠããŸãã ãã®ãµãã»ããã®è¿œè·¡ã®åé¡ïŒ https ïŒ æ°ããGlobalAlloc
ç¹æ§ãå°å
¥ãããŸããã
ãã®PRã¯ãç§ãã¡ã¯ã®ãããªããšãè¡ãããšãã§ããŸãVec::new_with_alloc(alloc)
ãšããalloc: Alloc
ããã«ïŒ
@alexregããã
@sfacklerããŒããã©ãããŠïŒ ãããè¡ãåã«äœãå¿ èŠã§ããïŒ ã°ããŒãã«ã¢ãã±ãŒã¿ãå€æŽããã ãã®å Žåãé€ããŠããã®PRã®ãã€ã³ãã¯ä»ã®æ¹æ³ã§ã¯å®éã«ã¯ããããŸããã
@alexreg
ã°ããŒãã«ã¢ãã±ãŒã¿ãå€æŽããã ãã®å Žåãé€ããŠããã®PRã®ãã€ã³ãã¯ä»ã®æ¹æ³ã§ã¯å®éã«ã¯ããããŸããã
ã°ããŒãã«ã¢ãã±ãŒã¿ãŒãå€æŽããããã ãã ãšæããŸãã
@alexregå®å®ããŠãããšããããšã§ããã°ãå®å®ãããæºåãã§ããŠããªãæªè§£æ±ºã®èšèšäžã®è³ªåãããã€ããããŸãã Nightlyã§ã¯ãããã¯RawVec
ãµããŒããããŠãããããã«åãçµãã§ã¿ãããšæã人ã®ããã«ã Vec
#[unstable]
ãšããŠè¿œå ããŠãåé¡ãããŸããã
ã¯ããPRã§è¿°ã¹ãããã«ããã®ãã€ã³ãã¯ãã°ããŒãã«ã¢ãã±ãŒã¿ãŒãå€æŽãããã 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ã®ç§»æ€ã¯ãŸã éå§ããŠããŸããããPRã¯å€§æè¿ã§ãã vec.rsã¯å€§ããã§ãã
https://github.com/rust-lang/rust/issues/32838#issuecomment -377097485ã§èšåãããŠããcodegenã®ãåé¡ãã¯ãïŒ49669ã®å€æŽã§åé€ãããã¯ãã§ãã
ããŠã Alloc
ãã¬ã€ãã䜿çšããŠã¢ãã±ãŒã¿ãŒãã¬ã€ã€ãŒã«å®è£
ããã®ã«åœ¹ç«ã€ããšãããå°ãèããŠã¿ããšãïŒå°ãªããšãç§ã«ãšã£ãŠã¯ïŒåœ¹ç«ã€ãšæãããšã2ã€ãããŸãã
AllocErr
ã¿ã€ããæå®ã§ããŸãã ããã¯ã !
ã«ããå ŽåããAllocErrã空ã«ãªã£ãããããªãã·ã§ã³ã§ã倱æããããå€ãã®æ
å ±ãäŒéããå Žåã«åœ¹ç«ã¡ãŸããLayout
ã¿ã€ããæå®ã§ããŸãã ã¢ãã±ãŒã¿ã®2ã€ã®å±€ããããšæ³åããŠãã ããã1ã€ã¯ããŒãžå²ãåœãŠçšã§ããã1ã€ã¯ãã倧ããªé åçšã§ãã åŸè
ã¯åè
ã«äŸåã§ããŸãããäž¡æ¹ãåãLayout
ã¿ã€ãããšãå Žåãäž¡æ¹ã®ã¬ã€ã€ãŒãç¬èªã®æ€èšŒãè¡ãå¿
èŠããããŸããæäœã¬ãã«ã§ã¯ããã®ãµã€ãºãšé
眮ã¯ããŒãžãµã€ãºã®åæ°ã§ããããé«ãã¬ãã«ã§ã¯ããã®ãµã€ãºãšé
眮ã¯ãã倧ããªé åã®èŠä»¶ã«äžèŽããŸãã ãããããããã®ãã§ãã¯ã¯åé·ã§ãã ç¹æ®ãªLayout
ã¿ã€ãã䜿çšãããšãæ€èšŒãã¢ãã±ãŒã¿ãŒèªäœã§ã¯ãªãLayout
äœæã«å§ä»»ã§ãã Layout
ã¿ã€ãéã®å€æã«ãããåé·ãªãã§ãã¯ãã¹ãããã§ããŸãã@cramertj @SimonSapin @glandiumããããŸãããæ確ã«ããŠããã ãããããšãcrate ã
@alexregã¯ãïŒ49669ã®Alloc
ç¹æ§ã«å¯Ÿããé倧ãªå€æŽã®éãèæ
®ãããšãæåã«ããŒãžãããã®ãåŸ
ã€æ¹ãããã§ãããã
@glandiumãŸããŸãã ããã¯çéžããããã»ã©é ããªãããã§ãã https://github.com/pnkfelix/collections-primeã¬ãã«ãæ°ã¥ããŸãã...ããªããšã®é¢ä¿ã§ããã¯äœã§ããïŒ
ãã1ã€æªè§£æ±ºã®è³ªåãè¿œå ããŸãã
Alloc::oom
ã¯ãããã¯ã«é¥ãããšãã§ããŸããïŒ çŸåšãããã¥ã¡ã³ãã«ã¯ããã®ã¡ãœããã¯ããã»ã¹ãäžæ¢ããå¿
èŠããããšæžãããŠããŸãã ããã¯ãã¢ãã±ãŒã¿ã䜿çšããã³ãŒãã«åœ±é¿ãåãŒããŸããã¢ãã±ãŒã¿ã¯ãã¡ã¢ãªãªãŒã¯ãªãã§ã¢ã³ã¯ã€ã³ããé©åã«åŠçããããã«èšèšããå¿
èŠãããããã§ããããŒã«ã«ã¢ãã±ãŒã¿ãŒã®é害ã¯å¿
ãããã°ããŒãã«ã¢ãã±ãŒã¿ãŒã倱æããããšãæå³ããããã§ã¯ãªãã®ã§ããããã¯ã蚱容ããå¿
èŠããããšæããŸãã ææªã®å Žåãã°ããŒãã«ã¢ãã±ãŒã¿ã®oom
ãåŒã³åºãããããã»ã¹ãäžæ¢ãããŸãïŒããããªããšãæ¢åã®ã³ãŒããç ŽæããŸãïŒã
@alexregããã§ã¯ãããŸããã std / alloc / collectionsã«ãããã®ã®åçŽãªã³ããŒã®ããã§ãã ããŠãããã®2幎åã®ã³ããŒã ç§ã®ã¯ã¬ãŒãã¯ç¯å²ãã¯ããã«å¶éãããŠããŸãïŒå
¬éãããããŒãžã§ã³ã«ã¯æ°é±éåã®æç¹ã§Alloc
ç¹æ§ãããªãããã¹ã¿ãŒãã©ã³ãã«ã¯RawVec
ãšBox
ãããããŸããããïŒããããŠç§ã®ç®æšã®1ã€ã¯ãå®å®ããéã§ãããæ§ç¯ãç¶ããããšã§ãã
@glandiumããŠããã®å Žåããã®PRãçéžãããŸã§åŸ ã£ãŠãããéã³ããã¹ã¿ãŒã«å¯ŸããŠPRãäœæããã¿ã°ãä»ããã®ã¯ããããçã«ããªã£ãŠããŸããããããã°ããã€ãã¹ã¿ãŒã«ããŒãžãããããããããŸãïŒãããŠãã¯ã¬ãŒãã«ããŒãžã§ããŸãïŒã ããã§ã¢ïŒ
@alexregã¯çã«ããªã£ãŠããŸãã ããªãã¯ä»ãããå§ããããšãã§ããŸããããã€ã¯ã·ã§ãã£ã³ã°ããã®PRã®ç¶æ³ãå€ããå Žåãããã¯ããªãã®åŽã«ããããã®ãã£ãŒã³ãåŒãèµ·ããå¯èœæ§ããããŸãã
@glandiumä»ã®ãšãããRustã§å¿ããããŠããä»ã®ããšããããŸããããã®PRãæ¿èªããããããã«
Alloc :: oomã¯ãããã¯ã«é¥ãããšãã§ããŸããïŒ çŸåšãããã¥ã¡ã³ãã«ã¯ããã®ã¡ãœããã¯ããã»ã¹ãäžæ¢ããå¿ èŠããããšæžãããŠããŸãã ããã¯ãã¢ãã±ãŒã¿ã䜿çšããã³ãŒãã«åœ±é¿ãåãŒããŸããã¢ãã±ãŒã¿ã¯ãã¡ã¢ãªãªãŒã¯ãªãã§ã¢ã³ã¯ã€ã³ããé©åã«åŠçããããã«èšèšããå¿ èŠãããããã§ãã
@Amanieuãã®RFCã¯ããŒãžãããŸããïŒ https ïŒ
PRã®æåºãæ€èšããŠããAPIã«1ã€ã®å€æŽããããŸãã
Alloc
ãã¬ã€ãããå®è£
ããšããã«ããŒãã®2ã€ã®éšåã«åå²ããŸãã åè
ã¯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
ãã©ã®ååãéžæããŠãïŒã®ãããªãã®ã䜿çšãããšãå®è£
è
ãèããå Žåã«èªåã®è¶³ãæã€ããšãèš±å¯ããã«ãã¯ã©ã€ã¢ã³ãã«ãšã£ãŠãããã®é¢æ°ã®äŸ¿å©ããç¶æã§ããŸãããããã¯ãããããªãŒããŒã©ã€ãããããšã«ãã£ãŠïŒãããŠãããã·ã¢ãã±ãŒã¿ãŒãå®è£
ãã人ã
ã«ãšã£ãŠããç°¡åã«ããããšã«ãã£ãŠïŒæŽŸæãªããšãããã§ãããã
PRãæåºããããšãæ€èšããŠããAPIã«1ã€ã®å€æŽããããŸã
ïŒ50436ã§ããããŸãã
@glandium
ïŒãããŠå®éã®ãšãããç§ã¯mozjemallocããã®ããã«å¿ èŠãšããŠããŸãïŒã
ãã®ãŠãŒã¹ã±ãŒã¹ã«ã€ããŠè©³ããæããŠãã ããã
mozjemallocã«ã¯ãæå³çã«ãªãŒã¯ããããŒã¹ã¢ãã±ãŒã¿ãŒããããŸãã ããªãŒãªã¹ããä¿æãã1çš®é¡ã®ãªããžã§ã¯ããé€ããŸãã alloc_one
ããªãã¯ãè¡ãã®ã§ã¯ãªããã¢ãã±ãŒã¿ãŒãéå±€åããããšã§ãããè¡ãããšãã§ããŸãã
å²ãåœãŠãæ£ç¢ºãªé 眮ãå²ãåœãŠè§£é€ããå¿ èŠããããŸããïŒ
ãã®è³ªåãžã®çãããã¯ããã§ããããšã匷調ããããã«ãç§ã¯ãã€ã¯ããœããèªèº«ãããã®çŽ æµãªåŒçšãæã£ãŠã
Alined_allocïŒïŒã¯ãC11ãå®è£ ãšäºææ§ã®ãªãæ¹æ³ã§æå®ãããããããããå®è£ ãããŸããïŒã€ãŸããfreeïŒïŒã¯é«åºŠã«èª¿æŽãããå²ãåœãŠãåŠçã§ããå¿ èŠããããŸãïŒ
Windowsã§ã·ã¹ãã ã¢ãã±ãŒã¿ã䜿çšããã«ã¯ãé«åºŠã«èª¿æŽãããå²ãåœãŠãæ£ããå²ãåœãŠè§£é€ããããã«ãå²ãåœãŠã解é€ãããšãã«åžžã«é 眮ãç¥ã£ãŠ
Windowsã§ã·ã¹ãã ã¢ãã±ãŒã¿ã䜿çšããã«ã¯ãé«åºŠã«èª¿æŽãããå²ãåœãŠãæ£ããå²ãåœãŠè§£é€ããããã«ãå²ãåœãŠã解é€ãããšãã«åžžã«é 眮ãç¥ã£ãŠ
ããã¯æ®å¿µã§ãããããã¯ããã§ãã ããã§ã¯ããªãŒããŒã¢ã©ã€ã³ããããã¯ãã«ããããããŸãããã ïŒæ··ä¹±ïŒ
ãªãŒããŒã¢ã©ã€ã³ããããã¯ãã«ããããããŸããã
ã©ãããŠïŒ ãªãŒããŒã¢ã©ã€ã³ã¡ã³ãã§å²ãåœãŠãšå²ãåœãŠè§£é€ã®äž¡æ¹ãè¡ãVec<T, OverAlignedAlloc<U16>>
ãå¿
èŠã§ãã
ã©ãããŠïŒ ãªãŒããŒã¢ã©ã€ã³ã¡ã³ãã§å²ãåœãŠãšå²ãåœãŠè§£é€ã®äž¡æ¹ãè¡ã
Vec<T, OverAlignedAlloc<U16>>
ãå¿ èŠã§ãã
ãã£ãšå
·äœçã«ãã¹ãã ã£ãã ã€ãŸãããªãŒããŒã¢ã©ã€ã³ããããã¯ã¿ãŒããã³ã³ãããŒã«å€ã®APIã«ç§»åããããšãæå³ããŸãããã€ãŸãã Vec<T, OverAlignedAlloc<U16>>
ã§ã¯ãªãVec<T>
ã䜿çšããAPIã§ãã ïŒããšãã°ã 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
ãé£ç¶ã¡ã¢ãªäžã«ãªããããAVXæäœãçŽæ¥äœ¿çšã§ããªãããã«ããŸãã ãããŠãç§ã¯å人çã«&[OverAligned32<f32>]
ãžã®derefãæ±ãã®ãå°ãé¢åã ãšæããŸããBox
ã Box<T, OverAligned<U32>>
察Box<OverAligned32<T>>
åäžèŠçŽ ã®å Žåãäž¡æ¹ã®ã¢ãããŒãã¯ããåçã§ããã2çªç®ã®ã¢ãããŒããå®éã«æãŸããå ŽåããããŸãã ãããã«ãããäž¡æ¹ã®ãªãã·ã§ã³ããããšäŸ¿å©ã§ãã
Allocç¹æ§ãžã®ãã®wrtå€æŽãæçš¿ããŸããïŒ https ïŒ
ãã®å·ã®åé ã«ãã远跡æçš¿ã¯ã²ã©ãå€ããªã£ãŠããŸãïŒæåŸã«ç·šéãããã®ã¯2016幎ã§ãïŒã è°è«ãçç£çã«ç¶ããã«ã¯ã掻çºãªæžå¿µäºé ã®ææ°ãªã¹ããå¿ èŠã§ãã
è°è«ã¯ãŸããçŸåšã®æªè§£æ±ºã®è³ªåãšèšèšæ±ºå®ã®è«ççæ ¹æ ãå«ãææ°ã®èšèšææžãã倧ããªæ©æµãåããã§ãããã
ãçŸåšæ¯æ©å®è£
ãããŠãããã®ããããå
ã®AllocRFCã§ææ¡ããããã®ããŸã§ãããŸããŸãªãã£ãã«ïŒrfcãªããžããªãrust-langãã©ããã³ã°ã®åé¡ãã°ããŒãã«alloc RFCãå
éšæçš¿ãå€ãïŒã«æ°åã®ã³ã¡ã³ããçæããdiffã®ã¹ã¬ãããè€æ°ãããŸãã巚倧ãªPRãªã©ïŒããããŠGlobalAlloc
RFCã§å®å®ããŠãããã®ã¯ãå
ã®RFCã§ææ¡ããããã®ãšããŸã䌌ãŠããŸããã
ããã¯ãããã¥ã¡ã³ããšãªãã¡ã¬ã³ã¹ã®æŽæ°ãå®äºããããã«ãšã«ããå¿ èŠãªãã®ã§ãããçŸåšã®ãã£ã¹ã«ãã·ã§ã³ã§ã圹ç«ã¡ãŸãã
Alloc
ç¹æ§ã®å®å®åã«ã€ããŠèããåã«ããŸããã¹ãŠã®æšæºã©ã€ãã©ãªã³ã¬ã¯ã·ã§ã³ã«ã¢ãã±ãŒã¿ãµããŒããå®è£
ããŠã¿ãå¿
èŠããããšæããŸãã ããã«ããããã®ç¹æ§ãå®éã«ã©ã®ããã«äœ¿çšããããã«ã€ããŠã®çµéšãåŸãããã¯ãã§ãã
Alloc
ç¹æ§ã®å®å®åã«ã€ããŠèããåã«ããŸããã¹ãŠã®æšæºã©ã€ãã©ãªã³ã¬ã¯ã·ã§ã³ã«ã¢ãã±ãŒã¿ãµããŒããå®è£ ããŠã¿ãå¿ èŠããããšæããŸãã ããã«ããããã®ç¹æ§ãå®éã«ã©ã®ããã«äœ¿çšããããã«ã€ããŠã®çµéšãåŸãããã¯ãã§ãã
ãã®ãšããã ç¹ã«Box
ã Box<T, A>
ã«2ã€ã®åèªã䜿çšãããªãããã«ããæ¹æ³ããŸã ããããªãããã§ãã
ãã®ãšããã ç¹ã«BoxãBoxãé¿ããæ¹æ³ããŸã ããããªãã®ã§
2ã€ã®èšèãåãäžããŸãã
æåã®å®è£
ã§ã¯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);
}
}
Allocãã¬ã€ãã®å®å®åã«ã€ããŠèããåã«ããŸããã¹ãŠã®æšæºã©ã€ãã©ãªã³ã¬ã¯ã·ã§ã³ã«ã¢ãã±ãŒã¿ãŒãµããŒããå®è£ ããŠã¿ãå¿ èŠããããšæããŸãã ããã«ããããã®ç¹æ§ãå®éã«ã©ã®ããã«äœ¿çšããããã«ã€ããŠã®çµéšãåŸãããã¯ãã§ãã
https://github.com/rust-lang/rust/issues/42774ã«ãããšã @ Ericson2314ãããã«åãçµãã§ãããšæããŸãã 圌ããææ°æ å ±ãå ¥æã§ãããå¬ããã§ãã
æåã®å®è£ ã§ã¯
Box<T, A>
ã®ãµã€ãºãå¿é ããå¿ èŠã¯ãªããšæããŸãããããã¯ããµããŒãããã ãã®DeAlloc
ãã¬ã€ããè¿œå ããããšã§ãäžäœäºææ§ã®ããæ¹æ³ã§åŸã§è¿œå ã§ãããã®ã§ããå²ãåœãŠè§£é€ã
ããã¯1ã€ã®ã¢ãããŒãã§ããããããééããªãæè¯ã®ã¢ãããŒãã§ãããã©ããã¯ç§ã«ã¯ãŸã£ããããããŸããã ããã«ã¯æ確ãªæ¬ ç¹ããããŸããããšãã°ãaïŒãã€ã³ã¿->ã¢ãã±ãŒã¿ã«ãã¯ã¢ãããå¯èœãªå Žåã«ã®ã¿æ©èœãïŒããã¯ãã»ãšãã©ã®ã¢ãªãŒãã¢ãã±ãŒã¿ã«ã¯åœãŠã¯ãŸããŸããïŒãbïŒ dealloc
ããªãã®ãªãŒããŒããããè¿œå ãããŸãã ãã®ææ¡ãŸãã¯ãã®ææ¡ã®ãããªãããæ±çšçãªå¹æãŸãã¯ã³ã³ããã¹ãã·ã¹ãã ã§ããå ŽåããããŸãã ãããã¯ããŸã£ããå¥ã®äœããããããŸããã ãããã£ãŠããããAlloc
ç¹æ§ã®çŸåšã®å身ãšäžäœäºææ§ã®ããæ¹æ³ã§ç°¡åã«è§£æ±ºã§ãããšæ³å®ããã¹ãã§ã¯ãªããšæããŸãã
@joshlf Box<T, A>
ã¯ããããããããšãã«ã®ã¿èªåèªèº«ã«ã¢ã¯ã»ã¹ã§ãããšããäºå®ãèãããšãããã¯å®å
šãªã³ãŒãã®ã¿ã§å®è¡ã§ããæåã®ããšã§ãã ãã®ãããªãã¿ãŒã³ã¯ãæäœãªãã®dealloc
ãããã¢ãã±ãŒã¿ãŒãããããããããšãã«ã¡ã¢ãªã解æŸããã ãã®ã¢ãªãŒãã®ãããªã¢ãã±ãŒã¿ãŒã«åœ¹ç«ã€å ŽåããããŸãã
ã¢ãã±ãŒã¿ãã³ã³ããïŒ LinkedList
ïŒã«ãã£ãŠææãããè€æ°ã®å²ãåœãŠã管çãããããè€éãªã·ã¹ãã ã®å Žåã Box
ã¯å
éšã§äœ¿çšãããªããšäºæ³ãããŸãã 代ããã«ã LinkedList
å
éšã¯ã LinkedList
ãªããžã§ã¯ãã«å«ãŸããŠããAlloc
ã€ã³ã¹ã¿ã³ã¹ã§å²ãåœãŠãããŠè§£æŸãããçã®ãã€ã³ã¿ãŒã䜿çšããŸãã ããã«ããããã¹ãŠã®ãã€ã³ã¿ãŒã®ãµã€ãºã2åã«ãªãã®ãé²ãããšãã§ããŸãã
Box<T, A>
ã¯ããããããããšãã«ã®ã¿èªåèªèº«ã«ã¢ã¯ã»ã¹ã§ãããšããäºå®ãèãããšãããã¯å®å šãªã³ãŒãã®ã¿ã§å®è¡ã§ããæåã®ããšã§ãã ãã®ãããªãã¿ãŒã³ã¯ãæäœãªãã®dealloc
ãããã¢ãã±ãŒã¿ãŒãããããããããšãã«ã¡ã¢ãªã解æŸããã ãã®ã¢ãªãŒãã®ãããªã¢ãã±ãŒã¿ãŒã«åœ¹ç«ã€å ŽåããããŸãã
ããã§ããã Box
ã¯ã dealloc
ãããŒãªãã¬ãŒã·ã§ã³ã§ããããšãç¥ããŸããã
ã¢ãã±ãŒã¿ãŒãã³ã³ãããŒã«ãã£ãŠææããïŒ
LinkedList
ïŒãè€æ°ã®å²ãåœãŠã管çãããããè€éãªã·ã¹ãã ã®å ŽåãBoxã¯å éšã§äœ¿çšãããªãããšãæåŸ ããŠããŸãã 代ããã«ãLinkedList
å éšã¯ãLinkedList
ãªããžã§ã¯ãã«å«ãŸããŠããAlloc
ã€ã³ã¹ã¿ã³ã¹ã§å²ãåœãŠãããŠè§£æŸãããçã®ãã€ã³ã¿ãŒã䜿çšããŸãã ããã«ããããã¹ãŠã®ãã€ã³ã¿ãŒã®ãµã€ãºã2åã«ãªãã®ãé²ãããšãã§ããŸãã
ã³ã¬ã¯ã·ã§ã³ãäœæããããã«å®å
šã§ãªãã³ãŒãã䜿çšããããã«äººã
ã«èŠæ±ããããšã¯æ¬åœã«æ®å¿µã ãšæããŸãã ç®æšããã¹ãŠã®ã³ã¬ã¯ã·ã§ã³ïŒããããæšæºã©ã€ãã©ãªã®å€éšã®ãã®ãå«ãïŒãã¢ãã±ãŒã¿ãŒã§ãªãã·ã§ã³ã§ãã©ã¡ããªãã¯ã«ããããšã§ããã Box
ãã¢ãã±ãŒã¿ãŒãã©ã¡ããªãã¯ã§ã¯ãªãå Žåãã³ã¬ã¯ã·ã§ã³ã®äœæè
ã¯Box
䜿çšããŠã¯ãªããŸããã
ããã§ãããBoxã¯deallocãããŒãªãã¬ãŒã·ã§ã³ã§ããããšãç¥ããŸããã
ãªãC ++ unique_ptr
ãè¡ãããšãé©å¿ãããªãã®ã§ããïŒ
ã€ãŸããã¢ãã±ãŒã¿ããã¹ããŒããã«ãã®å Žåã¯ãã€ã³ã¿ãæ ŒçŽããã¢ãã±ãŒã¿ããã¹ããŒãã¬ã¹ãã®å Žåã¯æ ŒçŽããªãããã«ããŸãã
ïŒããšãã°ã malloc
ãŸãã¯mmap
ã°ããŒãã«ã©ãããŒïŒã
ããã«ã¯ãçŸåšã®Alloc
ãã¬ã€ã³ãStatefulAlloc
ãšStatelessAlloc
2ã€ã®ç¹æ§ã«åå²ããå¿
èŠããããŸãã
ç§ã¯ãããéåžžã«å€±ç€Œã§ãšã¬ã¬ã³ãã§ãªãããšãç解ããŠããŸãïŒãããŠãããã誰ãã以åã®è°è«ã§ããããã§ã«ææ¡ããŸããïŒã
ãã®åªé
ãã«ããããããããã®ãœãªã¥ãŒã·ã§ã³ã¯ã·ã³ãã«ã§äžäœäºææ§ããããŸãïŒããã©ãŒãã³ã¹ã®ããã«ãã£ã¯ãããŸããïŒã
ã³ã¬ã¯ã·ã§ã³ãäœæããããã«å®å šã§ãªãã³ãŒãã䜿çšããããã«äººã ã«èŠæ±ããããšã¯æ¬åœã«æ®å¿µã ãšæããŸãã ç®æšããã¹ãŠã®ã³ã¬ã¯ã·ã§ã³ïŒããããæšæºã©ã€ãã©ãªã®å€éšã®ãã®ãå«ãïŒãã¢ãã±ãŒã¿ãŒã§ãªãã·ã§ã³ã§ãã©ã¡ããªãã¯ã«ããããšã§ãããBoxãã¢ãã±ãŒã¿ãŒãã©ã¡ããªãã¯ã§ã¯ãªãå Žåãã³ã¬ã¯ã·ã§ã³ã®äœæè ã¯BoxããŸã£ãã䜿çšããªãããå®å šã§ãªãã³ãŒãã䜿çšããå¿ èŠããããŸãïŒããã³åžžã«ç©äºã解æŸããããšãèŠããŠããããšã¯ãCããã³C ++ã§æãäžè¬çãªã¿ã€ãã®ã¡ã¢ãªã®å®å šæ§ã®åé¡ã®1ã€ã§ãããããå®å šã§ãªãã³ãŒããæ£ããååŸããã®ã¯å°é£ã§ãïŒã ããã¯äžå¹žãªæãåºãç©ã®ããã§ãã
ãªã¹ããããªãŒãªã©ã®ããŒãããŒã¹ã®ã³ã³ãããå®å
šãªæ¹æ³ã§èšè¿°ã§ãããšãã§ã¯ããŸãã¯ã³ã³ããã¹ãã·ã¹ãã ã®å®è£
ã«ã¯ãæéãããããããå¯èœæ§ããããŸãïŒååãšããŠå¯èœã§ããã°ïŒã
ãã®åé¡ã«åãçµãã§ããè«æãåŠè¡èšèªã¯èŠåœãããŸããã§ããïŒãã®ãããªäœåãå®éã«ååšããå Žåã¯èšæ£ããŠãã ããïŒã
ãããã£ãŠãããŒãããŒã¹ã®ã³ã³ããã®å®è£
ã§unsafe
ã«é Œãããšã¯ãå°ãªããšãçæçã«ã¯å¿
èŠæªãããããŸããã
@eucpp泚unique_ptr
ä¿åãããŠããªããallocator--ãããæ ŒçŽDeleter
ïŒ
Deleterã¯ãFunctionObjectãŸãã¯FunctionObjectãžã®å·ŠèŸºå€åç §ããŸãã¯é¢æ°ãžã®å·ŠèŸºå€åç §ã§ããå¿ èŠããããunique_ptråã®åŒæ°ã§åŒã³åºãããšãã§ããŸãã
::ãã€ã³ã¿ `
ããã¯ãåå²ãããAlloc
ãšDealloc
ç¹æ§ãæäŸããããšãšã»ãŒåçã§ãããšæããŸãã
@cramertjã¯ãããã®éãã§ãã ããã§ããã¹ããŒããã«ãšã¹ããŒãã¬ã¹ã®2ã€ã®ç¹æ§ãå¿
èŠã§ãDealloc
ã
ZST Deallocã§ååã§ã¯ãªãã§ããããïŒ
15:08 Evgeniy Moiseenkoã§ç«ã2018幎6æ12æ¥ã«ã¯[email protected]
æžããŸããïŒ
@cramertj https://github.com/cramertjã¯ãããã®éãã§ãã ããã§ãã2ã€
ç¹æ§ãå¿ èŠã§ã-ã¹ããŒããã«ããã³ã¹ããŒãã¬ã¹Deallocãâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/32838#issuecomment-396716689 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AEAJtWkpF0ofVc18NwbfV45G4QY6SCFBks5t8B_AgaJpZM4IDYUN
ã
ZST Deallocã§ååã§ã¯ãªãã§ããããïŒ
@remexreç§ã¯ããããããªããšæããŸã:)
rustã³ã³ãã€ã©ãZSTãããã«ãµããŒãããããšãç¥ããŸããã§ããã
C ++ã§ã¯ã空ã®ããŒã¹ã®æé©åã«é¢ããå°ãªããšãããã€ãã®ããªãã¯ãå¿
èŠã«ãªããŸãã
ç§ã¯Rustã§ããªãæ°ããã®ã§ãããã€ãã®æãããªééãããè©«ã³ããŸãã
ã¹ããŒããã«ãšã¹ããŒãã¬ã¹ã«å¥ã ã®ç¹æ§ãå¿ èŠã ãšã¯æããŸããã
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
ïŒ
次ã«ã Box
ã¯Clone
ãšclone_with_alloc
å®è£
ããå¯èœæ§ããããŸãã
ç§ã¯ãããåå²ç¹æ§ãå®éã«ã¯ããŒã³ã«å€§ããªåœ±é¿ãäžãããšã¯æããŸãã-implã¯impl<T, A> Clone for Box<T, A> where A: Alloc + Dealloc + Clone { ... }
ãŸãã
@sfacklerç§ã¯ãã®implã«å察ããŸãããã clone_into
ãŸãã¯æäŸãããã¢ãã±ãŒã¿ãŒã䜿çšãããã®ãããããšãæåŸ
ããŸãã
alloc_copy
ã¡ãœããããAlloc
æå³ããããŸããïŒ ããã¯ãããšãã°ããŒãžã®ã³ããŒãªã³ã©ã€ãã¯ããŒã³ãäœæããããšã«ããã倧èŠæš¡ãªå²ãåœãŠã«å¯ŸããŠããé«éãªmemcpyïŒ Copy/Clone
ïŒå®è£
ãæäŸããããã«äœ¿çšã§ããŸãã
ããã¯ããªãã¯ãŒã«ã§ãããã©ã«ãã®å®è£ ãæäŸããã®ã¯ç°¡åã§ãã
ãã®ãããªalloc_copy
é¢æ°ã䜿çšãããšã©ããªãã§ããããã impl Clone for Box<T, A>
ïŒ
ããã Vec
åäžã
ããå°ã調ã¹ãŠã¿ããšãå°ãªããšã1ã¬ãã«ä»¥äžã®æ·±ãã§äœæãããå Žåã¯ãããããŒãšäžå¯èœã®éã®åãããã»ã¹ç¯å²å
ã§ã³ããŒãªã³ã©ã€ãããŒãžãäœæããã¢ãããŒãã®ããã§ãã ãããã£ãŠã alloc_copy
ã¯å€§ããªã¡ãªããã«ã¯ãªããŸããã
代ããã«ãå°æ¥ã®ä»®æ³ã¡ã¢ãªã®ã·ã§ããã¬ã³ãå¯èœã«ãããããäžè¬çãªãšã¹ã±ãŒããããã圹ç«ã€å¯èœæ§ããããŸãã ã€ãŸããå²ãåœãŠã倧ããããšã«ããmmapã«æ¯ããããŠã¹ããŒãã¬ã¹ã§ããå Žåãã¢ãã±ãŒã¿ã¯å²ãåœãŠã®å°æ¥ã®å€æŽã«ã€ããŠæ°ä»ããªãããšãçŽæã§ããŸãã 次ã«ããŠãŒã¶ãŒã¯ãã®ã¡ã¢ãªããã€ãã«ç§»åãããããããã解é€ãããããããšãã§ããŸãã
ãããã¯ããã ã®mmap-all-the-thingsã¢ãã±ãŒã¿ãŒãštry-transferé¢æ°ãååšããå¯èœæ§ããããŸãã
代ããã«ãå°æ¥ã®ä»®æ³ã¡ã¢ãªãå¯èœã«ããããäžè¬çãªãšã¹ã±ãŒãããã
ã¡ã¢ãªã¢ãã±ãŒã¿ïŒmallocãjemallocã...ïŒã¯ãéåžžããããããä»»æã®çš®é¡ã®ã¡ã¢ãªãçãããšã¯ã§ããŸããããŸããéåžžãææããã¡ã¢ãªã®ããããã£ãç §äŒãŸãã¯å€æŽããããšãã§ããŸããã ã§ã¯ããã®äžè¬çãªãšã¹ã±ãŒããããã¯ã¡ã¢ãªã¢ãã±ãŒã¿ãšäœã®é¢ä¿ãããã®ã§ããããã
ãŸããä»®æ³ã¡ã¢ãªã®ãµããŒãã¯ãã©ãããã©ãŒã éã§å€§ããç°ãªããããä»®æ³ã¡ã¢ãªãå¹æçã«äœ¿çšããã«ã¯ããã©ãããã©ãŒã ããšã«ç°ãªãã¢ã«ãŽãªãºã ãå¿ èŠã«ãªãããšãå€ããä¿èšŒããŸã£ããç°ãªããŸãã ç§ã¯ä»®æ³ã¡ã¢ãªäžã§ããã€ãã®ç§»æ€å¯èœãªæœè±¡åãèŠãŠããŸãããããããã®ã移æ€æ§ãã®ããã«ããã€ãã®ç¶æ³ã§åœ¹ã«ç«ããªãã»ã©æ©èœããªããªã£ãŠããªããã®ã¯ãŸã èŠãŠããŸããã
ããªããæ£ããã ãã®ãããªãŠãŒã¹ã±ãŒã¹ïŒç§ã¯äž»ã«ãã©ãããã©ãŒã åºæã®æé©åãèããŠããŸããïŒã¯ãããããæåã«ã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒã䜿çšããããšã«ãã£ãŠæãããæäŸãããŸãã
AndreiAlexandrescuãCppConãã¬ãŒã³ããŒã·ã§ã³ã§èª¬æããComposableAllocator APIã«ã€ããŠäœãèãã¯ãããŸããïŒ ãããªã¯ããã®YouTubeã§å©çšå¯èœã§ãïŒ https ïŒ ãŸããããã話ã¯ããªãããããéããŠèŠãããšã奜ããããããªãååã«é¢çœãã§ãïŒ ã
ããããã¹ãŠã®å¿ ç¶çãªçµè«ã¯ãã³ã¬ã¯ã·ã§ã³ã©ã€ãã©ãªã¯äžè¬çãªWRTå²ãåœãŠã§ãããã¢ããªããã°ã©ããŒèªèº«ã建èšçŸå Žã§ã¢ãã±ãŒã¿ãŒãšã³ã¬ã¯ã·ã§ã³ãèªç±ã«äœæã§ããå¿ èŠããããšããããšã®ããã«æããŸãã
AndreiAlexandrescuãCppConãã¬ãŒã³ããŒã·ã§ã³ã§èª¬æããComposableAllocator APIã«ã€ããŠäœãèãã¯ãããŸããïŒ
çŸåšã®Alloc
APIã䜿çšãããšãæ§æå¯èœãªã¢ãã±ãŒã¿ãŒïŒ MyAlloc<Other: Alloc>
ïŒãèšè¿°ã§ããç¹æ§ãšç¹æ®åã䜿çšããŠãAndreisããŒã¯ã§éæãããã»ãšãã©ãã¹ãŠãéæã§ããŸãã ãã ããAndreiãAPIãæ§ç¯ããæ¹æ³ã¯ãæåããå¶çŽã®ãªããžã§ããªãã¯+ SFINAE / staticã«åºã¥ããŠãããããAndreiã®è©±ããã¯ã»ãšãã©äœãRustã«é©çšã§ããªããšãããã¢ã€ãã¢ããè¶
ããŠãRustã®ãžã§ããªãã¯ã·ã¹ãã ãããšã¯å
šç¶éããŸãã
æ®ãã®Layout
ã¡ãœãããå®å®ãããããšãææ¡ããããšæããŸãã ãããã¯ãçŸåšã®ã°ããŒãã«ã¢ãã±ãŒã¿APIã§ãã§ã«åœ¹ç«ã¡ãŸãã
ãããã¯ããªããæå³ãããã¹ãŠã®æ¹æ³ã§ããïŒ
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ã¯ç§ã«ã¯åé¡ãªãããã«
ã¢ãã±ãŒã¿ãŒãšã©ã€ãã¿ã€ã ããïŒ
ïŒallocator implsã®å ŽåïŒïŒallocatorå€ã移åããŠããæªåŠçã®ã¡ã¢ãªãããã¯ãç¡å¹ã«ãªã£ãŠã¯ãªããŸããã
ãã¹ãŠã®ã¯ã©ã€ã¢ã³ãã¯ãã³ãŒãã§ãããæ³å®ã§ããŸãã
ãããã£ãŠãã¯ã©ã€ã¢ã³ããã¢ãã±ãŒã¿ãããããã¯ãå²ãåœãŠïŒa1ãšåŒã³ãŸãïŒã次ã«a1ãæ°ããå Žæã«ç§»åããå ŽåïŒããšãã°ãvialet a2 = a1;ïŒãã¯ã©ã€ã¢ã³ããa2ãä»ããŠãã®ãããã¯ã®å²ãåœãŠã解é€ããããšã¯å¥å šãªãŸãŸã§ãã
ããã¯ãã¢ãã±ãŒã¿ãUnpin
ãªããã°ãªããªãããšãæå³ããŸããïŒ
ãããã£ããïŒ
Alloc
ãã¬ã€ãã¯ãŸã äžå®å®ãªã®ã§ãRFCã®ãã®éšåãå€æŽãããå Žåã¯ãã«ãŒã«ãå€æŽã§ãããšæããŸãã ããããããã¯ç¢ºãã«å¿ã«çããŠããã¹ãããšã§ãã
@gnzlbgã¯ãããžã§ããªãã¯ã·ã¹ãã ã®å€§ããªéããèªèããŠããŸãã圌ã詳述ãããã¹ãŠãRustã§åãããã«å®è£ ã§ããããã§ã¯ãããŸããã ãšã¯ãããæ皿以æ¥ãã©ã€ãã©ãªã®ãªã³ãšãªãã«åãçµãã§ãããé 調ã«é²ãã§ããŸãã
ããã¯ãã¢ãã±ãŒã¿ã
Unpin
ãªããã°ãªããªãããšãæå³ããŸããïŒ
ããã§ã¯ãããŸããã Unpin
ã¯ã Pin
ã§ã©ããããããšãã®åã®åäœã«é¢ãããã®ã§ããããã®APIãžã®ç¹å¥ãªæ¥ç¶ã¯ãããŸããã
ãããã Unpin
ã䜿çšããŠåè¿°ã®å¶çŽãé©çšããããšã¯ã§ããŸãããïŒ
dealloc_array
ã«é¢ããå¥ã®è³ªåïŒé¢æ°ãResult
è¿ãã®ã¯ãªãã§ããïŒ çŸåšã®å®è£
ã§ã¯ãããã¯2ã€ã®å Žåã«å€±æããå¯èœæ§ããããŸãã
n
ã¯ãŒãã§ãn * size_of::<T>()
容éãªãŒããŒãããŒæåã®ã±ãŒã¹ã«ã¯2ã€ã®ã±ãŒã¹ããããŸãïŒããã¥ã¡ã³ãã®ããã«ãå®è£ è ã¯ãããããéžæã§ããŸãïŒã
Ok
ãŒãåã«n
=> dealloc_array
ãè¿ãå¿
èŠãOk
ãn
=>ã«Err
ãè¿ããŸãã dealloc_array
æž¡ãããšãã§ãããã€ã³ã¿ã¯ãããŸããã2ã€ç®ã¯ã次ã®å®å šäžã®å¶çŽã«ãã£ãŠä¿èšŒãããŸãã
[T; n]
ã®ã¬ã€ã¢ãŠãã¯ããã®ã¡ã¢ãªãããã¯ã«é©åããŠããå¿ èŠ
ã€ãŸããå²ãåœãŠãšåãn
dealloc_array
ãåŒã³åºãå¿
èŠããããŸãã n
èŠçŽ ãæã€é
åãå²ãåœãŠãããšãã§ããå Žåã n
ã¯T
ã«å¯ŸããŠæå¹ã§ãã ããã§ãªããã°ãå²ãåœãŠã¯å€±æããã§ãããã
ç·šéïŒæåŸã®ç¹ã«ã€ããŠïŒ usable_size
ãn * size_of::<T>()
ãããé«ãå€ãè¿ãããšããŠããããã¯åŒãç¶ãæå¹ã§ãã ãã以å€ã®å Žåãå®è£
ã¯ãã®ç¹æ§å¶çŽã«éåããŸãã
ãããã¯ã®ãµã€ãºã¯
[use_min, use_max]
ç¯å²å ã«ããå¿ èŠããããŸããããã§ã
- [...]
use_max
ã¯ããããã¯ãalloc_excess
ãŸãã¯realloc_excess
ãžã®åŒã³åºããä»ããŠå²ãåœãŠããããšãã«è¿ãããïŒãŸãã¯è¿ãããã¯ãã®ïŒå®¹éã§ãã
ç¹æ§ã«ã¯unsafe impl
ãå¿
èŠãªãããããã¯åœãŠã¯ãŸããŸãã
æåã®ã±ãŒã¹ã«ã¯2ã€ã®ã±ãŒã¹ããããŸãïŒããã¥ã¡ã³ãã®ããã«ãå®è£ è ã¯ãããããéžæã§ããŸãïŒã
- å²ãåœãŠã¯ããŒãåããã
n
Ok
ãè¿ããŸã
ãã®æ å ±ã¯ã©ãããå ¥æããŸãããïŒ
ããã¥ã¡ã³ãå
ã®ãã¹ãŠã®Alloc::alloc_
ã¡ãœããã¯ããŒããµã€ãºã®å²ãåœãŠã®åäœããSafetyãå¥ã§å®çŸ©ãããŠããªãããšãæå®ããŠããŸãã
core::alloc::Alloc
ããã¥ã¡ã³ãïŒåŒ·èª¿è¡šç€ºãããé¢é£éšåïŒïŒ
ãŒããµã€ãºã®åãšãŒããµã€ãºã®ã¬ã€ã¢ãŠãã«é¢ãã泚æïŒ
Alloc
ãã¬ã€ãã®å€ãã®ã¡ãœããã¯ãå²ãåœãŠèŠæ±ã¯ãŒã以å€ã®ãµã€ãºã§ãªããã°ãªããªããšè¿°ã¹ãŠããŸããããããªããšãæªå®çŸ©ã®åäœãçºçããå¯èœæ§ããããŸãã
- ãã ããäžéšã®é«ã¬ãã«ã®å²ãåœãŠæ¹æ³ïŒ
alloc_one
ãalloc_array
ïŒã¯ããµã€ãºããŒãã®åã§æ確ã«å®çŸ©ãããŠããããªãã·ã§ã³ã§ãããããµããŒãã§ããŸããErr
ãErr
ããŸãã¯ãã€ã³ã¿ãä»ããŠãã®å Žåã
Alloc
å®è£ ãOk
ãè¿ãããšãéžæããå ŽåïŒã€ãŸãããã€ã³ã¿ãŒããŒããµã€ãºã®ã¢ã¯ã»ã¹ã§ããªããããã¯ã瀺ããŠããå ŽåïŒãè¿ããããã€ã³ã¿ãŒã¯ãçŸåšå²ãåœãŠãããŠããããšèŠãªãå¿ èŠããããŸãã ãã®ãããªã¢ãã±ãŒã¿ã§ã¯ãçŸåšå²ãåœãŠãããŠãããã€ã³ã¿ãå ¥åãšããŠåãåããã¹ãŠã®ã¡ãœããã¯ãæªå®çŸ©ã®åäœãåŒãèµ·ããèšãæãããšããŒããµã€ãºã®ãã€ã³ã¿ãŒãã¢ãã±ãŒã¿ãŒããæµåºããå¯èœæ§ãããå Žåããã®ã¢ãã±ãŒã¿ãŒã¯åæ§ã«ããã®ãã€ã³ã¿ãŒãå²ãåœãŠè§£é€ããã³åå²ãåœãŠã¡ãœããã«éæµããããšãåãå ¥ããå¿ èŠããããŸãã
ãããã£ãŠã dealloc_array
ã®ãšã©ãŒç¶æ
ã®1ã€ã¯ééããªãçããããã®ã§ãã
/// # 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ã¯å²ãåœãŠã®ã¡ã¢ãªãããã¯ã«é©åãããåäœã¯æªå®çŸ©ã§ãïŒå®å
šæ¡é
ã«ããïŒã
ãã1ã€ã®ãšã©ãŒæ¡ä»¶ã¯ããç®è¡ãªãŒããŒãããŒæã«åžžã«Err
ãè¿ããã§ãã ããã¯ããªãäžè¬çã§ãã ãããæçšãªãšã©ãŒç¶æ
ã§ãããã©ãããèŠåããã®ã¯é£ããã§ãã Alloc
ç¹æ§ã®å®è£
ããšã«ãçè«çã«ã©ããã§ããç®è¡æŒç®ãå®è¡ã§ããå¥ã®å®è£
ãæãä»ãããšãã§ããå¯èœæ§ããããããð€·ââïž
core::alloc::Alloc
ããã¥ã¡ã³ãïŒåŒ·èª¿è¡šç€ºãããé¢é£éšåïŒïŒ
確ãã«ã éåžžã«å€ãã®ã¡ãœããïŒ Alloc::alloc
ïŒããŒããµã€ãºã®å²ãåœãŠãæªå®çŸ©ã®åäœã§ãããšè¿°ã¹ãŠããã®ã¯å¥åŠã ãšæããŸããã Alloc::alloc_array(0)
ã«å®è£
å®çŸ©ã®åäœãæäŸããã ãã§ãã ããæå³ã§ã Alloc::alloc_array(0)
ã¯ãã¢ãã±ãŒã¿ãŒããŒããµã€ãºã®å²ãåœãŠããµããŒãããŠãããã©ããã確èªããããã®ãªããã¹è©Šéšã§ãã
[T; N]
ãã¢ãã±ãŒã¿ã®ãµã€ãºãŸãã¯é 眮ã®å¶çŽãæºãããªãå ŽåãAFAICTã¯å²ãåœãŠã®ã¡ã¢ãªãããã¯ã«é©åãããåäœã¯æªå®çŸ©ã§ãïŒå®å šæ¡é ã«ããïŒã
ããããã®ãšã©ãŒç¶æ ã¯åé·ãªã®ã§åé€ã§ãããšæããŸãã å®å šæ¡é ãŸãã¯ãšã©ãŒæ¡ä»¶ã®ãããããå¿ èŠã§ãããäž¡æ¹ã¯å¿ èŠãããŸããã
ãã1ã€ã®ãšã©ãŒæ¡ä»¶ã¯ããç®è¡ãªãŒããŒãããŒæã«åžžã«
Err
ãè¿ããã§ãã ããã¯ããªãäžè¬çã§ãã ãããæçšãªãšã©ãŒç¶æ ã§ãããã©ãããèŠåããã®ã¯é£ããã§ãã
IMOãããã¯äžèšãšåãå®å
šæ¡é
ã«ãã£ãŠå®ãããŠããŸãã [T; N]
ã®å®¹éããªãŒããŒãããŒããå Žåããã®ã¡ã¢ãªãããã¯ã¯å²ãåœãŠè§£é€ã«é©åããŸããã ãã¶ã@pnkfelixã¯ããã«ã€ããŠè©³ãã
ããæå³ã§ã
Alloc::alloc_array(1)
ã¯ãã¢ãã±ãŒã¿ãŒããŒããµã€ãºã®å²ãåœãŠããµããŒãããŠãããã©ããã確èªããããã®ãªããã¹è©Šéšã§ãã
Alloc::alloc_array(0)
ã§ããïŒ
IMOãããã¯äžèšãšåãå®å šæ¡é ã«ãã£ãŠå®ãããŠããŸãã
[T; N]
ã®å®¹éããªãŒããŒãããŒããå Žåããã®ã¡ã¢ãªãããã¯ã®å²ãåœãŠã解é€ããããšã¯ã§ããŸããã
ãã®ç¹æ§ã¯ããŠãŒã¶ãŒãç¬èªã®ã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒã«å¯ŸããŠå®è£
ã§ããããšãããã³ãããã®ãŠãŒã¶ãŒããããã®ã¡ãœããã®ããã©ã«ãã®å®è£
ããªãŒããŒã©ã€ãã§ããããšã«æ³šæããŠãã ããã ãããã£ãŠããããç®è¡ãªãŒããŒãããŒã«å¯ŸããŠErr
ãè¿ããã©ãããæ€èšãããšãã¯ãããã©ã«ãã¡ãœããã®çŸåšã®ããã©ã«ãå®è£
ãäœããããã«çŠç¹ãåœãŠãã ãã§ãªããä»ã®äººã®ããã«ããããå®è£
ãããŠãŒã¶ãŒã«ãšã£ãŠäœãçã«ããªã£ãŠããããèæ
®ããå¿
èŠããããŸããã¢ãã±ãŒã¿ãŒã
Alloc::alloc_array(0)
ã§ããïŒ
ããããããã
ãã®ç¹æ§ã¯ããŠãŒã¶ãŒãç¬èªã®ã«ã¹ã¿ã ã¢ãã±ãŒã¿ãŒã«å¯ŸããŠå®è£ ã§ããããšãããã³ãããã®ãŠãŒã¶ãŒããããã®ã¡ãœããã®ããã©ã«ãã®å®è£ ããªãŒããŒã©ã€ãã§ããããšã«æ³šæããŠãã ããã ãããã£ãŠããããç®è¡ãªãŒããŒãããŒã«å¯ŸããŠ
Err
ãè¿ããã©ãããæ€èšãããšãã¯ãããã©ã«ãã¡ãœããã®çŸåšã®ããã©ã«ãå®è£ ãäœããããã«çŠç¹ãåœãŠãã ãã§ãªããä»ã®äººã®ããã«ããããå®è£ ãããŠãŒã¶ãŒã«ãšã£ãŠäœãçã«ããªã£ãŠããããèæ ®ããå¿ èŠããããŸããã¢ãã±ãŒã¿ãŒã
ããããŸãããã Alloc
å®è£
ããã«ã¯unsafe impl
ãå¿
èŠã§ãããå®è£
è
ã¯https://github.com/rust-lang/rust/issues/32838#issuecomment-467093527ã«èšèŒãããŠããå®å
šèŠåã«åŸãå¿
èŠããã
远跡ã®åé¡ã®ããã«ããã«æ®ããããã¹ãŠã®APIã¯ã Alloc
ç¹æ§ã§ãããã Alloc
ç¹æ§ã«é¢é£ããŠããŸãã @ rust-lang / libsã httpsïŒ//github.com/rust-lang/rust/issues/42774ã«å ããŠããããéãããŸãŸã«ããŠãããšäŸ¿å©ã ãšæã
ç°¡åãªèæ¯ã®è³ªåïŒZSTã®æè»æ§ã®èåŸã«ããåæ©ã¯äœã§ããïŒ ã³ã³ãã€ã«æã«åãZSTã§ããããšãããã£ãŠããã®ã§ãå²ãåœãŠïŒå®æ°å€ãè¿ãããïŒãšå²ãåœãŠè§£é€ã®äž¡æ¹ãå®å šã«æé©åã§ããããã«æãããŸãã ãããèãããšãç§ãã¡ã¯æ¬¡ã®ãããããèšãã¹ãã ãšç§ã«ã¯æããŸãïŒ
Err
ãè¿ãããšã¯ã§ããŸãããalloc_inner
ã¡ãœãããšãç絡ãè¡ãããã©ã«ãã®å®è£
ãæã€alloc
ã¡ãœããããããŸãã alloc
ã¯ZSTããµããŒãããå¿
èŠããããŸããã alloc_inner
ã¯ZSTã«å¯ŸããŠåŒã³åºãããªãå ŽåããããŸãïŒããã¯ãç絡ããžãã¯ã1ãæïŒç¹æ§å®çŸ©å
ïŒã«é çªã«è¿œå ã§ããããã«ããããã§ããå®è£
è
ã«å®åæãä¿åããããïŒçŸåšã®APIã®æè»æ§ãå¿ èŠãªçç±ã¯ãããŸããïŒ
çŸåšã®APIã®æè»æ§ãå¿ èŠãªçç±ã¯ãããŸããïŒ
ããã¯ãã¬ãŒããªãã§ãã ééããªããAllocãã¬ã€ãã¯å®è£ ããããããé »ç¹ã«äœ¿çšããããããZSTã®çµã¿èŸŒã¿ãµããŒããæäŸããããšã§ãAllocãã§ããã ãç°¡åã«äœ¿çšã§ããããã«ããããšãçã«ããªã£ãŠããå ŽåããããŸãã
ããã¯ãAllocãã¬ã€ãã®å®è£ è ããããåŠçããå¿ èŠãããããšãæå³ããŸãããAllocãã¬ã€ããé²åãããããšãã人ã¯ãAPIãå€æŽããããã³ã«ZSTã念é ã«çœ®ãå¿ èŠãããããšãç§ã«ãšã£ãŠããéèŠã§ãã ãŸããZSTãã©ã®ããã«åŠçããããïŒãŸãã¯ãå®è£ å®çŸ©ãã®å Žåã¯ãããªãå¯èœæ§ãããïŒã説æããããšã«ãããAPIã®ããã¥ã¡ã³ããè€éã«ããŸãã
C ++ã¢ãã±ãŒã¿ãŒã¯ãã®ã¢ãããŒããè¿œæ±ããã¢ãã±ãŒã¿ãŒã¯å€ãã®ç°ãªãåé¡ã解決ããããšããŸãã ããã«ãããå®è£ ãé²åãå°é£ã«ãªã£ãã ãã§ãªããããããã¹ãŠã®åé¡ãAPIã§ã©ã®ããã«çžäºäœçšãããã«ããããŠãŒã¶ãŒãå®éã«äœ¿çšããããšãå°é£ã«ãªããŸããã
ZSTã®åŠçãšrawã¡ã¢ãªã®å²ãåœãŠ/å²ãåœãŠè§£é€ã¯ã2ã€ã®çŽäº€ããç°ãªãåé¡ã§ãããšæããŸãããããã£ãŠãZSTãåŠçããªãã ãã§ãAllocãã¬ã€ãAPIãåçŽã«ä¿ã€å¿ èŠããããŸãã
libstdã®ãããªAllocã®ãŠãŒã¶ãŒã¯ãããšãã°åã³ã¬ã¯ã·ã§ã³ã§ZSTãåŠçããå¿ èŠããããŸãã ããã¯ééããªã解決ãã䟡å€ã®ããåé¡ã§ãããAllocã®ç¹æ§ããã®ããã®å Žæã§ã¯ãªããšæããŸãã ãã®åé¡ã解決ãããŠãŒãã£ãªãã£ãå¿ èŠã«å¿ããŠlibstdå ã«é£ã³åºãããšãæåŸ ããŸãããã®å Žåããã®ãããªãŠãŒãã£ãªãã£ãRFCããŠãstd :: heapã§å ¬éããããšãã§ããŸãã
ããã¯ãã¹ãŠåççã«èãããŸãã
ZSTã®åŠçãšrawã¡ã¢ãªã®å²ãåœãŠ/å²ãåœãŠè§£é€ã¯ã2ã€ã®çŽäº€ããç°ãªãåé¡ã§ãããšæããŸãããããã£ãŠãZSTãåŠçããªãã ãã§ãAllocãã¬ã€ãAPIãåçŽã«ä¿ã€å¿ èŠããããŸãã
ããã¯ãAPIãå®è£ å®çŸ©ã§ã¯ãªããæ瀺çã«ZSTãåŠçããªãããã«ããå¿ èŠãããããšãæå³ããŸãããïŒ IMOãããµããŒããããŠããªãããšã©ãŒã¯ãå®è¡æã«ããŸã圹ã«ç«ã¡ãŸãããããã¯ãåŒã³åºãå ã®å€§å€æ°ããã©ãŒã«ããã¯ãã¹ãå®çŸ©ã§ããªããããZSTããµããŒããããŠããªããšæ³å®ããå¿ èŠãããããã§ãã APIãåçŽåãããµããŒããããŠããªãããšã宣èšããæ¹ãã¯ãªãŒã³ãªããã§ãã
alloc
ãŠãŒã¶ãŒãZSTãåŠçããããã«ç¹æ®åã䜿çšããŸããïŒ ãããšãif size_of::<T>() == 0
ãã§ãã¯ã ãã§ããïŒ
alloc
ãŠãŒã¶ãŒãZSTãåŠçããããã«ç¹æ®åã䜿çšããŸããïŒ ãããšãif size_of::<T>() == 0
ãã§ãã¯ã ãã§ããïŒ
åŸè ã§ååã§ãã é©åãªã³ãŒããã¹ã¯ãã³ã³ãã€ã«æã«ç°¡åã«åé€ãããŸãã
ããã¯ãAPIãå®è£ å®çŸ©ã§ã¯ãªããæ瀺çã«ZSTãåŠçããªãããã«ããå¿ èŠãããããšãæå³ããŸãããïŒ
ç§ã«ãšã£ãŠéèŠãªå¶çŽã¯ããŒããµã€ãºã®å²ãåœãŠãçŠæ¢ããå Žåã Alloc
ã¡ãœããã¯ãæž¡ãããLayout
ããŒããµã€ãºã§ã¯ãªããšæ³å®ã§ããå¿
èŠããããšããããšã§ãã
ãããå®çŸããæ¹æ³ã¯è€æ°ãããŸãã 1ã€ã¯ããã¹ãŠã®Alloc
ã¡ãœããã«å¥ã®Safety
å¥ãè¿œå ããŠã Layout
ãµã€ãºããŒãã®å Žåã®åäœãæªå®çŸ©ã§ããããšã瀺ãããšã§ãã
ãŸãã¯ããŒããµã€ãºã®Layout
çŠæ¢ããããšãã§ããŸãããããããšã Alloc
ã¯ãŒããµã€ãºã®å²ãåœãŠã«ã€ããŠäœãèšãå¿
èŠããªããªããŸããããã¯å®å
šã«å®è¡ã§ããªãããã§ããããããè¡ããšããã€ãã®æ¬ ç¹ããããŸãã
ããšãã°ã HashMap
ãããªäžéšã®ã¿ã€ãLayout
ãè€æ°ã®Layout
ããLayout
ãæ§ç¯ããæåŸã®Layout
ã¯ãŒããµã€ãºã§ã¯ãªãå ŽåããããŸãããäžéã®ãã®ã¯ãããããããŸããïŒäŸãã°HashSet
ïŒã ãããã£ãŠããããã®ã¿ã€ãã¯ãæçµçãªLayout
ãæ§ç¯ããããã«ãäœãä»ã®ãã®ãïŒããšãã°ã LayoutBuilder
ã¿ã€ãïŒã䜿çšããããŒã以å€ã®ãµã€ãºãã®å°åæã«æ¯æãå¿
èŠããããŸãïŒãŸãã¯Layout
ã«å€æãããšãã®_unchecked
ïŒã¡ãœããã
ç¹æ®åã¯ãZSTãåŠçããããã«allocãŠãŒã¶ãŒã«ãã£ãŠäœ¿çšãããŸããïŒ ãŸãã¯ãsize_of ::ã®å Žå
ïŒïŒ== 0ãã§ãã¯ïŒ
ãŸã ZSTã«ç¹åããããšã¯ã§ããŸããã çŸåšããã¹ãŠã®ã³ãŒãã¯size_of::<T>() == 0
ãŸãã
ãããå®çŸããæ¹æ³ã¯è€æ°ãããŸãã 1ã€ã¯ããã¹ãŠã®
Alloc
ã¡ãœããã«å¥ã®Safety
å¥ãè¿œå ããŠãLayout
ãµã€ãºããŒãã®å Žåã®åäœãæªå®çŸ©ã§ããããšã瀺ãããšã§ãã
ãããã³ã³ãã€ã«æã®ä¿èšŒã«ããæ¹æ³ããããã©ãããæ€èšããã®ã¯èå³æ·±ãããšã§ãããã¬ã€ã¢ãŠãããŒã以å€ã®ãµã€ãºã§ãããšããdebug_assert
ã§ããã99ïŒ
ã®ãã°ããã£ããããã®ã«ååãªã¯ãã§ãã
ã¢ãã±ãŒã¿ãŒã«ã€ããŠã®è°è«ã«ã¯æ³šæãæã£ãŠããªãã®ã§ãç³ãèš³ãããŸããã ããããç§ã¯é·ãéãã¢ãã±ãŒã¿ãŒãå²ãåœãŠãŠããå€ã®ã¿ã€ãã«ã¢ã¯ã»ã¹ã§ããããšãæãã§ããŸããã ããã䜿çšã§ããã¢ãã±ãŒã¿èšèšããããããããŸããã
次ã«ãããããC ++ãšåãåé¡ãçºçããŸããããã¯ã¢ãã±ãŒã¿ãŒAPIã§ãã
ããããç§ã¯é·ãéãã¢ãã±ãŒã¿ãŒãå²ãåœãŠãŠããå€ã®ã¿ã€ãã«ã¢ã¯ã»ã¹ã§ããããšãæãã§ããŸããã T
ããã¯äœã®ããã«å¿ èŠã§ããïŒ
@gnzblg @brsonä»æ¥ãå²ãåœãŠãããŠããå€ã®ã¿ã€ãã«ã€ããŠ_äœã_ãç¥ãããã®æœåšçãªãŠãŒã¹ã±ãŒã¹ããããŸããã
ç§ã¯ã3ã€ã®åºç€ãšãªãã¢ãã±ãŒã¿ãŒïŒã¹ã¬ããããŒã«ã«ã¢ãã±ãŒã¿ãŒãããã¯ä»ãã°ããŒãã«ã¢ãã±ãŒã¿ãŒãããã³ã³ã«ãŒãã³ã䜿çšããã¢ãã±ãŒã¿ãŒïŒã®éã§åãæ¿ããããšãã§ããã°ããŒãã«ã¢ãã±ãŒã¿ãŒã«åãçµãã§ããŸã-ãããã¯ãŒã¯æ¥ç¶ãè¡šãã³ã«ãŒãã³ãæ倧ã«å¶éã§ãããšããèãåçã¡ã¢ãªäœ¿çšéïŒã³ã¬ã¯ã·ã§ã³å ã®ã¢ãã±ãŒã¿ãŒãå¶åŸ¡ã§ããªãå Žåãç¹ã«ãµãŒãããŒãã£ã³ãŒãå ïŒ*ã
ã¹ã¬ããéã移åããå¯èœæ§ã®ããå€ïŒArcãªã©ïŒãšç§»åããªãå€ãå²ãåœãŠãŠãããã©ãããç¥ããšäŸ¿å©ãªå ŽåããããŸãã ãŸãã¯ããã§ã¯ãªããããããŸããã ããããããã¯å¯èœãªã·ããªãªã§ãã çŸæç¹ã§ã¯ãã°ããŒãã«ã¢ãã±ãŒã¿ãŒã«ã¯ããŠãŒã¶ãŒãã©ã®ã¢ãã±ãŒã¿ãŒããå²ãåœãŠãè¡ãããæ瀺ããããã«äœ¿çšããã¹ã€ããããããŸãïŒreallocãŸãã¯freeã«ã¯å¿ èŠãããŸããããã®ããã®ã¡ã¢ãªã¢ãã¬ã¹ã確èªã§ããŸãïŒã
* [ãŸããå¯èœãªéãããã¯ãªãã§NUMAããŒã«ã«ã¡ã¢ãªã䜿çšã§ãã1ã³ã¢1ã¹ã¬ããã¢ãã«ã§ã¯ãåèšã¡ã¢ãªäœ¿çšéãå¶éã§ããŸã]ã
@raphaelcohn
ç§ã¯ã°ããŒãã«ã¢ãã±ãŒã¿ãŒã«åãçµãã§ããŸã
ããã¯GlobalAlloc
ãã¬ã€ãã«ã¯åœãŠã¯ãŸããªãïŒãŸãã¯åœãŠã¯ãŸãïŒãšã¯æããŸããã Alloc
ãã¬ã€ãã«ã¯ãåæ
å ±ãå©çšã§ããæ±çšã¡ãœããããã§ã«ãããŸãïŒäŸïŒ alloc_array<T>(1)
ã¯åäžã®T
alloc_array<T>(1)
å²ãåœãŠãŸããããã§ã T
ã¯å®éã®åã§ãããããã¢ãã±ãŒã¿ãŒã¯å²ãåœãŠã®å®è¡æã«åãèæ
®ã«å
¥ããããšãã§ããŸãïŒã ãã®è°è«ã®ç®çã«ã¯ãåæ
å ±ãå©çšããã¢ãã±ãŒã¿ãŒãå®è£
ããã³ãŒããå®éã«èŠãæ¹ã䟿å©ã ãšæããŸãã ãããã®ã¡ãœããããã¢ãã±ãŒã¿ãŒAPIãŸãã¯ä»ã®ã¢ãã±ãŒã¿ãŒç¹æ§ã®äžéšã§ããã ãã§ãªããäžè¬çãªã¢ãã±ãŒã¿ãŒç¹æ§ã®äžéšã§ããå¿
èŠãããçç±ã«ã€ããŠãè¯ãè°è«ãèããããšããããŸããã
Alloc
ã«ãã£ãŠãã©ã¡ãŒã¿ãŒåãããã¿ã€ãã®ã©ãããã¿ã€ãæ
å ±ã䜿çšããã¢ãã±ãŒã¿ãŒãšçµã¿åãããã€ããã§ããããã®çµæãšããŠäœãæåŸ
ããããç¥ãããšãéåžžã«èå³æ·±ããšæããŸãã
AFAICTã¯ã T
çŽæ¥å²ãåœãŠãããããã®ããã®å¯äžã®èå³æ·±ãã¿ã€ãã¯Box
ã§ãã ã»ãšãã©ã®ãã¹ãŠã®ä»ã®ã¿ã€ãstd
å²ãåœãŠãããšã¯ãããŸããT
ããªãã®ã¢ãã±ãŒã¿ã¯äœãç¥ããªãããšããããã€ãã®æ°éã®å
éšåãã ããšãã°ã Rc
ãšArc
ã¯ã (InternalRefCounts, T)
ã List
/ BTreeSet
ãªã©ãå²ãåœãŠãŸããå
éšããŒãã¿ã€ãVec
å²ãåœãŠãŸãã Deque
/ ... T
ã®é
åãå²ãåœãŠãŸããã T
èªäœã¯å²ãåœãŠãŸããã
Box
ãšVec
ãäžäœäºææ§ã®ããæ¹æ³ã§BoxAlloc
ãšArrayAlloc
ç¹æ§ãè¿œå ããã¢ãã±ãŒã¿ãŒãã§ããAlloc
å
æ¬çå®è£
ãè¿œå ã§ããŸãããããã®åé¡ãäžè¬çãªæ¹æ³ã§æ»æããå¿
èŠãããå Žåã¯ããããã®åäœããã€ãžã£ãã¯ããããšã«ç¹åããŠãã ããã ããããã¿ã€ãæ
å ±ãæªçšããããã«ã¢ãã±ãŒã¿ãŒãšå
±è¬ããç¬èªã®MyAllocBox
ããã³MyAllocVec
ã¿ã€ããæäŸããããšããå®è¡å¯èœãªè§£æ±ºçã§ã¯ãªãçç±ã¯ãããŸããïŒ
çŸåšãã¢ãã±ãŒã¿ãŒWGå°çšã®ãªããžããªããããOPã®ãªã¹ããå€ããªã£ãŠããããããã®åé¡ãéããŠããã®æ©èœã®è°è«ãšè¿œè·¡ã1ãæã§è¡ãããšãã§ããŸããïŒ
è¯ãç¹@TimDiekmannïŒ ãã®ãªããžããªå ã®ãã£ã¹ã«ãã·ã§ã³ã¹ã¬ãããåªå ããŠãå ã«é²ãã§ãããéããŸãã
ããã¯ãäžéšã®#[unstable]
å±æ§ãæã远跡ã®åé¡ã§ãã ãããã®æ©èœãå®å®åãŸãã¯éæšå¥šã«ãªããŸã§ãééãã¹ãã§ã¯ãªããšæããŸãã ïŒãŸãã¯ãå¥ã®åé¡ãæãããã«å±æ§ãå€æŽããããšãã§ããŸããïŒ
ãããgit masterã§åç §ãããŠããäžå®å®ãªæ©èœã«ã¯ãééããªãæªè§£æ±ºã®è¿œè·¡ã®åé¡ãããã¯ãã§ãã
åæããŸããã ãŸããOPãžã®éç¥ãšãªã³ã¯ãè¿œå ããŸããã
æãåèã«ãªãã³ã¡ã³ã
@alexcrichton
-> Result<*mut u8, AllocErr>
ãã-> *mut void
ã«åãæ¿ãããšãã決å®ã¯ãã¢ãã±ãŒã¿ãŒRFCã®æåã®éçºã«åŸã£ã人ã ã«ãšã£ãŠå€§ããªé©ããšãªããããããŸãããç§ã¯åæããŠããªãããªããäœãã®ãã€ã³ãããããã«ããããããã人ã ã®ããªãã®æ°ã¯ãã®ãéweightnessããšäžç·ã«æ®ããã«åãã§ãã£ãã§ãããããã«æãã
Result
nullã§ã¯äžè¶³ããŠããå¯èœæ§ã®å¢å ãä»ããŠæ»ãå€ã確èªããŠãã ããããã®é ãå€æŽèªäœã®å¯èŠæ§ãé«ããæ¹æ³ã¯ãããŸããïŒ
1ã€ã®æ¹æ³ïŒé ã®ãŠã£ãºãããïŒïŒ
Allocator
ããŸã äžå®å®ãªç¶æ ã§ãPRèªäœã®ãã¹ã¿ãŒãã©ã³ãã§çœ²åãå€æŽããŸãã ãããŠã誰ãPRã«äžæºãèšã£ãŠããã®ãïŒãããŠèª°ãç¥ã£ãŠããã®ãïŒïŒãèŠãŠãã ããã