ð¢ ìŽ êž°ë¥ìë ì ëŽ ìí¹ ê·žë£¹ìŽ ììµëë€. ì견곌 ì°ë € ì¬í ì ìí¹ ê·žë£¹ì ì ì¥ìì ì§ì 볎ëŽì£Œìžì.
ì볞 ê²ì묌 :
FCP ì ì : https://github.com/rust-lang/rust/issues/32838#issuecomment -336957415
FCP ì²Ží¬ ë°ì€ : https://github.com/rust-lang/rust/issues/32838#issuecomment -336980230
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
( comment )ë¡ ë첎íŽìŒíëì§ ê²°ì (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 ì ìŽê²ìŽ "fits"ì ì ìë¡ ìžíŽ 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
ë 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
ì±ëë¡ êž°ì°šë¥Œ í ëê¹ì§ êž°ë€ëŠ¬ê³ ììµëë€)
ì ë Rust륌 ì²ì ì¬ì©íë¯ë¡ ë€ë¥ž ê³³ìì ë Œì ë ì ìŽ ìë€ë©Ž ì©ìíìžì.
ê°ì²Ž ë³ í ë¹ì륌 ì§ìíë ë°©ë²ì ëí ìê°ìŽ ììµëê¹? ì¬ëëž í ë¹ ì ë° ë§€ê±°ì§ í ë¹ ì ì ê°ì ìŒë¶ í ë¹ìë í¹ì ì íì ë°ìžë©ëìŽ ììŒë©°, ì ê°ì²Žë¥Œ ìì±íê³ , "íŽì ë"ìì± ë ê°ì²Žë¥Œ ìºì±íê³ (ì€ì ë¡ ìì íì§ ìê³ ) ìŽë¯ž ìì± ë ìºì ë ê°ì²Žë¥Œ ë°ííë ìì ì ìíí©ëë€. íìí ê²œì° êž°ë³ž ë©ëªšëŠ¬ë¥Œ Ʞ볞 í ë¹ ìì íŽì íêž° ì ì ê°ì²Žë¥Œ ìì í©ëë€.
íì¬,ìŽ ì ìì ObjectAllocator<T>
ëŒìžì ë°ëŒ ì묎ê²ë í¬íšíì§ ìì§ë§ ë§€ì° ëììŽ ë ê²ì
ëë€. í¹í ë§€ê±°ì§ í ë¹ ì ê°ì²Ž ìºì± ë ìŽìŽ (ì ë§í¬)ì 구íì ìì
ì€ìŽë©°, Allocator
ë§ ëííê³ ìºì±ìì ê°ì²Žë¥Œ ìì±íê³ ìì íë ìì
ì ìí í ì ììµëë€. ë€ë¥ž ê°ì²Ž í ë¹ ì (ì : ì¬ëëž í ë¹ ì)륌 ëííê³ ì§ì ìŒë¡ ìŒë° ìºì± ë ìŽìŽê° ë ì ìë€ë©Ž ì¢ì ê²ì
ëë€.
ê°ì²Ž í ë¹ ì ì í ëë í¹ì±ìŽìŽ ì ìì ì í©í ìì¹ë ìŽëì ëê¹? í¥í RFC륌 ìíŽ ëšê²š ëê¹ì? ë€ë¥ž ê²?
ëë ìŽê²ìŽ ìì§ ë Œìëì§ ììë€ê³ ìê°í©ëë€.
ìì ì ObjectAllocator<T>
ìì±í ë€ì impl<T: Allocator, U> ObjectAllocator<U> for T { .. }
ì ìííì¬ ëªšë ìŒë° í ë¹ìê° ëªšë ê°ì²Žì ëí ê°ì²Ž ë³ í ë¹ ì ìí ì í ì ììµëë€.
í¥í ìì ì ìŒë° ole '(ìŒë°) í ë¹ ì ëì ë žëì ëí í¹ì±ì ì¬ì©íëë¡ ì»¬ë ì ì ìì íë ê²ì ëë€.
ë¿¡ë¿¡
(ìŽ ìì ìì ëë í ë¹ ì íµí©ì ìŒë¶ë¡ std 컬ë ì ì ì¬ì©í ì ìëë¡ ë² í ì±ëë¡ êž°ì°šë¥Œ í ì ìëë¡ # [may_dangle] ì§ìì êž°ë€ëŠ¬ê³ ììµëë€)
ìŽë° ìŒìŽ ìŒìŽë ê² ê°ìì?
@ Ericson2314 ì, ì§ì ìì±íë ê²ì ì€íì ìž ëª©ì ììí ìµì
ìŽì§ë§ ìíž ìŽì©ì± ìž¡ë©Žìì íì€ííë©Ž íšì¬ ë ë§ì ìŽì ìŽ ìë€ê³ ìê°í©ëë€ (ì륌 ë€ìŽ ì¬ë© í ë¹ ìë 구íí ê³íìŽì§ë§ ëŽ ìœëì íì¬ ì¬ì©ìê° ëŽ ì¡ì§ ìºì± ë ìŽìŽì íšê» ëêµ°ê° _else's_ slab í ë¹ì륌 ì¬ì©í ì ìë€ë©Ž ì¢ìµëë€). ëŽ ì§ë¬žì ëšìí ObjectAllocator<T>
í¹ì±ìŽë ê·žì ì ì¬í ê²ìŽ ë
Œì í ê°ì¹ê° ìëì§ ì¬ë¶ì
ëë€. ë€ë¥ž RFCì ê°ì¥ ì í©í ê² ê°ì§ë§? ëšìŒ RFCì ìŒë§ë ë§ì ê²ìŽ ìíëì§, ê·žëŠ¬ê³ ìŽë€ ê²ìŽ ë³ëì 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 ìŒ 21:59ì Joshua 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/ ì€ë ë륌 ììê±°í©ëë€.
ììì ì¬ì©ì ì§ì í ë¹ ìì íšê» íì€ ëŒìŽëžë¬ëŠ¬ 컬ë ì (몚ë í í ë¹ ê°)ì ì¬ì©íê³ ì¶ë€ê³ ìê°í©ëë€. ìŠ, í¹ì ê°ì²Žì êµíëì§ ììµëë€.
2017 ë 1 ì 4 ìŒ 22:01ì John Ericson [email protected] ì ë€ì곌 ê°ìŽ ìŒìµëë€.
@alexreg https://github.com/alexreg ì¬ì©ì ì§ì ê°ì²Ž ë³ í ë¹ ìì íšê» íì€ ëŒìŽëžë¬ëŠ¬ 컬ë ì ì ì¬ì©íë ê²ì ëí ìŽêž° ìì ì ì°žì¡°íììì€.
â
ë¹ì ìŽ ìžêž ëìêž° ë묞ì ìŽê²ì ë°ê³ ììµëë€.
ìŽ ìŽë©ìŒì ì§ì ëµì¥íê±°ë GitHub https://github.com/rust-lang/rust/issues/32838#issuecomment-270499628 ìì 볎거ë https://github.com/notifications/unsubscribe-auth/ ì€ë ë륌 ììê±°í©ëë€.
ë¬Œë¡ ì ëë€.íì§ë§ ê·žê²ìŽ íì€ ëŒìŽëžë¬ëŠ¬ì ìí ì§ë ëªšë¥Žê² ìµëë€. êž°ë¥ìŽë ì ì©ì±ì ìì€ììŽ ë€ë¥ž ììì ìœê² ë€ìŽê° ì ììµëë€.
ì,íì§ë§ ìŒë¶ íì€ ëŒìŽëžë¬ëŠ¬ êž°ë¥ì ì¬ì©íê³ ì¶ì ê²ì ëë€ (ì : @ Ericson2314ê° ì ìí ê²).
ììì ì¬ì©ì ì§ì í ë¹ ìì íšê» íì€ ëŒìŽëžë¬ëŠ¬ 컬ë ì (몚ë í í ë¹ ê°)ì ì¬ì©íê³ ì¶ë€ê³ ìê°í©ëë€. ìŠ, í¹ì ê°ì²Žì êµíëì§ ììµëë€.
ìŽìì ìŒë¡ë ë ê°ì§ ì íì 몚ë íì©íë ê²ìŽ ì¢ìµëë€. ê°ì²Ž ë³ ìºì±ì ì¬ì©íë©Ž ë§€ì° í° ìŽì ìŽ ììµëë€. ì륌 ë€ìŽ, ì¬ëëž í ë¹ê³Œ ë§€ê±°ì§ ìºì±ì 몚ë ë§€ì° ì€ìí ì±ë¥ ìŽì ì ì ê³µí©ëë€. ê¶êží ì ìŽ ììŒë©Ž ììì ë§í¬ í 묞ì륌 ì°žì¡°íììì€.
ê·žë¬ë ê°ì²Ž í ë¹ ì í¹ì±ì ëšìí ìŒë° í ë¹ ì í¹ì±ì íì í¹ì± ìŒ ì ììµëë€. ì ê° ìê°íë í ê°ëší©ëë€. ë¬Œë¡ í¹ì ì íì í ë¹ìë ë²ì© í ë¹ ìë³Žë€ ë íšìšì ìŒ ì ìì§ë§ 컎íìŒë¬ ë íì€ììŽ ì¬ì€ì ì íìê° ììµëë€ (ì€ì ë¡ë ì íìê° ììµëë€).
2017 ë 1 ì 4 ìŒ 22:13ì Joshua 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/ ì€ë ë륌 ììê±°í©ëë€.
ê·žë¬ë ê°ì²Ž í ë¹ ì í¹ì±ì ëšìí ìŒë° í ë¹ ì í¹ì±ì íì í¹ì± ìŒ ì ììµëë€. ì ê° ìê°íë í ê°ëší©ëë€. ë¬Œë¡ í¹ì ì íì í ë¹ìë ë²ì© í ë¹ ìë³Žë€ ë íšìšì ìŒ ì ìì§ë§ 컎íìŒë¬ ë íì€ììŽ ì¬ì€ì ì íìê° ììµëë€ (ì€ì ë¡ë ì íìê° ììµëë€).
ì, 묞ì ë ìë¯žê° ë€ë¥Žë€ë ê²ì
ëë€. Allocator
ë ìì ë°ìŽíž Blobì í ë¹íê³ íŽì í©ëë€. ë°ë©Žì ObjectAllocator<T>
ë ìŽë¯ž ìì± ë ê°ì²Žë¥Œ í ë¹íê³ ìŽë¬í ê°ì²Žë¥Œ ìì íë ìí ëí©ëë€ (ìë¡ í ë¹ ë ê°ì²Žë¥Œ ìì±íë 곌ì ìì ëì€ì ì ë¬ ë ììë ìì± ë ê°ì²Žë¥Œ ìºì í ììë êž°ë¥ í¬íš). , ë¹ìžë€). í¹ì±ì ë€ì곌 ê°ìµëë€.
trait ObjectAllocator<T> {
fn alloc() -> T;
fn free(t T);
}
ìŽê²ì ë©ìëê° ìì í¬ìží°ë¥Œ ì²ëŠ¬íê³ ì í ê°ë
ìŽìë Allocator
ì ížíëì§ ììµëë€. ëí Allocator
s륌 ì¬ì©íë©Ž 뚌ì drop
ê°ì²Žë¥Œ íŽì íë ê²ì ížì¶ìì ì±
ìì
ëë€. ìŽê²ì ì ë§ ì€ìí©ëë€. T
ì íì ëíŽ ìë©Ž ObjectAllocator<T>
ìì T
ì drop
ë©ìë ížì¶ê³Œ ê°ì ìì
ì ìí í ì ììŒë©° free(t)
ë t
륌 free
íê³ , ížì¶ìë 뚌ì t
_cannot_ ëë¡í©ëë€. ëì ObjectAllocator<T>
ì ì±
ìì
ëë€. Ʞ볞ì ìŒë¡ìŽ ë ê°ì§ í¹ì±ì ìë¡ ížíëì§ ììµëë€.
ì ë§ë€. ëëìŽ ì ììŽ ìŽë¯ž ìŽì ê°ì ê²ì í¬íšíë€ê³ ìê°íë€. ìŠ, ë°ìŽíž ìì€ì ëíâìì ìì€âí ë¹ ììŽë€. ìŽ ê²œì° ì벜íê² ê³µì í ì ì!
2017 ë 1 ì 4 ìŒ 22:29ì Joshua Liebow-Feeser [email protected] ì ë€ì곌 ê°ìŽ ìŒìµëë€.
ê·žë¬ë ê°ì²Ž í ë¹ ì í¹ì±ì ëšìí ìŒë° í ë¹ ì í¹ì±ì íì í¹ì± ìŒ ì ììµëë€. ì ê° ìê°íë í ê°ëší©ëë€. ë¬Œë¡ í¹ì ì íì í ë¹ìë ë²ì© í ë¹ ìë³Žë€ ë íšìšì ìŒ ì ìì§ë§ 컎íìŒë¬ ë íì€ììŽ ì¬ì€ì ì íìê° ììµëë€ (ì€ì ë¡ë ì íìê° ììµëë€).
ì, 묞ì ë ìë¯žê° ë€ë¥Žë€ë ê²ì ëë€. Allocatorë ìì ë°ìŽíž Blobì í ë¹íê³ íŽì í©ëë€. ObjectAllocator
ë°ë©Žìë ìŽë¯ž ìì± ë ê°ì²Žë¥Œ í ë¹íê³ ìŽë¬í ê°ì²Žë¥Œ ìì íë ìí ëí©ëë€ (ë¹ì©ìŽ ë§ìŽ ëë ìë¡ í ë¹ ë ê°ì²Žë¥Œ ìì±íë 곌ì ìì ëì€ì ì ë¬ ë ììë ìì± ë ê°ì²Žë¥Œ ìºì í ììë êž°ë¥ í¬íš). í¹ì±ì ë€ì곌 ê°ìµëë€. í¹ì± ObjectAllocator
{
fn alloc ()-> T;
fn free (t T);
}
ìŽê²ì ë©ìëê° ìì í¬ìží°ë¥Œ ì²ëŠ¬íê³ ì í ê°ë ìŽìë Allocatorì ížíëì§ ììµëë€. ëí Allocator륌 ì¬ì©íë©Ž 뚌ì íŽì ëë ê°ì²Žë¥Œ ìì íë ê²ì ížì¶ìì ì± ìì ëë€. ìŽê²ì ì ë§ ì€ìí©ëë€-T íì ì ëíŽ ìë ê²ì ObjectAllocator륌 íì©í©ëë€call Tì drop ë©ìëì ê°ì ìì ì ìííê³ free (t)ê° t륌 freeë¡ ìŽëíêž° ë묞ì ížì¶ìë t륌 뚌ì ëë¡ í ì ììµëë€. ëì ObjectAllocatorì ëë€. ì ì± ì. Ʞ볞ì ìŒë¡ìŽ ë ê°ì§ í¹ì±ì ìë¡ ížíëì§ ììµëë€. â
ë¹ì ìŽ ìžêž ëìêž° ë묞ì ìŽê²ì ë°ê³ ììµëë€.
ìŽ ìŽë©ìŒì ì§ì ëµì¥íê±°ë GitHub https://github.com/rust-lang/rust/issues/32838#issuecomment-270505704 ìì 볎거ë https://github.com/notifications/unsubscribe-auth/ ì€ë ë륌 ììê±°í©ëë€.
@alexreg ì ì, ì ë ê·žë ê² ë°ë¬ìµëë€ :) ì êžì-ë€ë¥ž RFC륌 êž°ë€ë €ìŒ í ê²ì ëë€.
ì, RFC륌 ììíë©Ž ë§ì ì§ììë°ì ì ììµëë€! ê·žëŠ¬ê³ ì€ëª íŽ ì£Œì ì ê°ì¬í©ëë€ (ìŽ RFCì ìžë¶ ì¬íì ì í íì íì§ ëª»íìµëë€).
2017 ë 1 ì 5 ìŒ 00:53ì Joshua 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/ ì€ë ë륌 ììê±°í©ëë€.
ì¬ì©ì ì§ì í ë¹ì륌 í ì€ížíêž°ìí ììê° ì ì©í©ëë€.
ëŽê° ëª
ë°±í ê²ì ëì¹ë€ë©Ž ì©ìíììì€. ê·žë¬ëìŽ RFCì ì€ëª
ë Layout
í¹ì±ìŽ Copy
ë¿ë§ ìëëŒ Clone
륌 구ííì§ ìë ìŽì ê° ììµëê¹? í묌 ìí ì§ë¶?
ëë ì묎ê²ë ìê°í ì ìë€.
íë¡ìžì€ íë°ììŽ ë¬žì 륌 ì êž°íê²ëìŽ ì£ì¡ í©ëë€ë§ ...
ë©ìëê° ìëëŒ íšì ìž dealloc
-like íšìì ëí ì§ìì ì¶ê° í ê°ì¹ê° ììµëê¹? ììŽëìŽë ë©ëªšëŠ¬ìì ë¶ëªš í ë¹ìê°ìë í¬ìží°ìì ì¶ë¡ í ì ìëë¡ ì ë ¬ì ì¬ì©íì¬ ëª
ìì ìž í ë¹ ì ì°žì¡° ììŽë íŽì í ììë ê²ì
ëë€.
ìŽê²ì ì¬ì©ì ì§ì í ë¹ì륌 ì¬ì©íë ë°ìŽí° 구조ì í° ëììŽ ë ì ììµëë€. ìŽë ê²íë©Ž í ë¹ ì ì첎ì ëí 찞조륌 ì ì§íì§ ìê³ ì¬ë°ë¥ž dealloc
íšì륌 ížì¶ í ì ìëë¡ í ë¹ ìì _type_ì ëí ë§€ê° ë³ì ë§ ììŒë©Žë©ëë€. ì륌 ë€ìŽ, Box
ê° ê²°êµ ì¬ì©ì ì§ì í ë¹ì륌 ì§ìíëë¡ ìì ëë©Ž 찞조륌 ì ì¥íêž° ìíŽ ë ëšìŽë¡ íì¥íŽìŒíë ê²ê³Œë ë°ëë¡ ëšìŒ ëšìŽ (í¬ìží° ë§) ë§ ì ì§í ì ììµëë€. í ë¹ ììê²ë.
êŽë š ë©ëªšìì ì ì í ë¹ì륌 íì©íêž° ìíŽ ë¹ ë©ìë alloc
íšì륌 ì§ìíë ê²ë ì ì© í ì ììµëë€. ìŽê²ì ë©ìëê° ìë dealloc
íšìë¡ ë©ì§ê² 구ì±ë©ëë€. ì ì í ë¹ ìì ê²œì° ëšìŒ ì ì ìžì€íŽì€ ë§ ìêž° ë묞ì í ë¹ ìì ëí í¬ìží° ì¶ë¡ ì ìí í íìê° ììµëë€. ì 첎 íë¡ê·žëšì ëí í ë¹ ì.
@joshlf íì¬ ëììžììë í ë¹ìê° (í¬êž°ê° 0 ìž) ëšì ì í (ì : struct MyAlloc;
ì ì¬ì©íì¬ Allocator
í¹ì±ì 구íí ì ììµëë€.
íì ì°žì¡° ëë ì묎ê²ë ì ì¥íì§ ìë ê²ì í ë¹ì륌 ê°ìŒë¡ ì ì¥íë ê²ë³Žë€ ë ìŒë°ì ì
ëë€.
ì§ì í¬íš ë ì íì ê²œì° ì¬ì€ìì ì ì ìì§ë§ ë°ìŽí° êµ¬ì¡°ê° ëì 찞조륌 ì ì§íêž°ë¡ ê²°ì íë©Ž ìŽëšê¹ì? í¬êž°ê° 0 ìž ì íì ëí ì°žì¡°ê° ê³µë°±ì ì°šì§í©ëê¹? ìŠ, ë€ììŽìë ê²œì° :
struct Foo()
struct Blah{
foo: &Foo,
}
Blah
í¬êž°ê° 0ì
ëê¹?
ì€ì ë¡ ê°ë¥íëëŒë í ë¹ ìì í¬êž°ê° 0ìŽëë ê²ì ìíì§ ìì ì ììµëë€. ì륌 ë€ìŽ, _from_ì í ë¹íë í¬êž°ê° 0ìŽ ìë í ë¹ìê°ìì ì ìì§ë§ ìë í ë¹ ìì ëíŽ ìì§ ëª»íë ìíìì ê°ì²Žë¥Œ íŽì í ììë êž°ë¥ìŽ ììµëë€. ìŽê²ì Box
ê° í ëšìŽ ë§ ì¬ì©íëë¡ ë§ëë ë° ì¬ì í ì ì©í©ëë€. í ë¹ì륌 ìžìë¡ ì·šíŽìŒíë Box::new_from_allocator
ì ê°ì ê²ìŽ ììµëë€.-í¬êž°ê° 0ìŽ ìë í ë¹ ììŒ ì ììµëë€.íì§ë§ í ë¹ìê° ìë í ë¹ ì ì°žì¡°ììŽ íŽì 륌 ì§ìíë©Ž ë°í ë Box<T>
ë ìë Box::new_from_allocator
ížì¶ìì ì ë¬ ë í ë¹ ìì ëí 찞조륌 ì ì¥íì§ ìì ì ììµëë€.
ì륌 ë€ìŽ, í ë¹ í í¬êž°ê° 0ìŽ ìë í ë¹ìê° ìì§ë§ ìë í ë¹ ìì ëíŽ ìì§ ëª»íë ìíìì ê°ì²Žë¥Œ íŽì í ììë êž°ë¥ìŽìì ì ììµëë€.
ëë Ʞ볞ì ìŒë¡ ìŽë¬í ìŽì ë¡ ìžíŽ (ëì ì°ê²°íë ì°êŽ ì í곌 íšê») ë¶ëŠ¬ ë í ë¹ ì ë° í ë¹ íŽì ì í¹ì±ì ìžì ë¶íŽíë ê²ì ì€ë ì ì ì ìíë ê²ì êž°ìµí©ëë€.
컎íìŒë¬ê° ìŽë¬í í ë¹ì륌 ì¬ì©íì¬ í ë¹ì ìµì ííëë¡ íì©íŽìŒí©ëê¹?
컎íìŒë¬ê° ìŽë¬í í ë¹ì륌 ì¬ì©íì¬ í ë¹ì ìµì ííëë¡ íì©íŽìŒí©ëê¹?
@Zoxc ë¬Žìš ë»ìŽìŒ?
ëë Ʞ볞ì ìŒë¡ ìŽë¬í ìŽì ë¡ ìžíŽ (ëì ì°ê²°íë ì°êŽ ì í곌 íšê») ë¶ëŠ¬ ë í ë¹ ì ë° í ë¹ íŽì ì í¹ì±ì ìžì ë¶íŽíë ê²ì ì€ë ì ì ì ìíë ê²ì êž°ìµí©ëë€.
íìì ìíŽìŽ ì§ì ì ëª
íííê² ìµëë€ (ì€íëŒìžìì @ 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
ìŽ í¬êž°ê° 0 ìž ì íìŽë©Ž Box<T, A::D>
ì d
íëê° 0 í¬êž°ë¥Œ ì°šì§íë¯ë¡ 결곌 Box<T, A::D>
ë ëšìŒ ëšìŽì
ëë€.
ìŽê²ìŽ ìžì ì°©ë¥ í ê²ìžì§ì ëí íì ëŒìžìŽ ììµëê¹? ëë í ë¹ ì êŽë š ìì ìíê³ ìëë°,ìŽ ë¬Œê±ŽìŽ ëŽê° êµ¬ì¶ í ì ìë€ë©Ž ì¢ì ê²ì ëë€.
êŽì¬ìŽ ìë€ë©Ž ëª ê°ì§ì£Œêž°ë¥Œ ë¹ë € 죌멎 ì¢ê² ì§ ë§, ìëì ìŒë¡ Rust륌 ì²ì ì íŽ ë³Žì êž° ë묞ì ìŽë³Žìì ìœë륌 ê²í íŽìŒíë€ë ì ìì êŽëŠ¬ììê² ë ë§ì ìì ì í ì ììµëë€. ëë ë구ì ë°ëì ë°ê³ ì¶ì§ë ìê³ ì¬ëë€ì ìíŽ ë ë§ì ìŒìíê³ ì¶ì§ë ììµëë€.
ì¢ì, ì°ëŠ¬ë ìµê·Œ ì í ë¹ ìì ìí륌 íê°íêž° ìíŽ ë§ë¬ê³ ìŽê²ì ëí ì¢ì ììë ìë€ê³ ìê°í©ëë€! ìŽë¬í APIì ëí ì§ììŽ ìì§ libstdì í¬íšëì§ ìì ê² ê°ìµëë€.íì§ë§ 몚ë ì¬ëë€ì ì¬ì í ââìžì ëŒë ìŽë¬í APIì ë§ì¡±íê³ ììµëë€!
ì°ëŠ¬ê° ë
Œìí í ê°ì§ë ê°ë¥í ì¶ë¡ 묞ì ë¡ ìžíŽ 몚ë libstd ì íì ë³ê²œíë ê²ìŽ ìœê° ìêž°ìì¡° ìŒ ì ìì§ë§ ê·žì êŽê³ììŽ Allocator
ížë ìŽ ížì Layout
íë ê²ìŽ ì¢ì ìê°ì²ëŒ 볎ì
ëë€ std::heap
몚ëì Layout
ì í!
@joshlf ì¬êž°ìì ëê³ ì¶ë€ë©Ž íì ìŽììŽ ë ê²ìŽëŒê³ ìê°í©ëë€! 첫 ë²ì§ž ì¡°ê°ììŽ RFCì Ʞ볞 ì í / í¹ì±ì íì€ ëŒìŽëžë¬ëŠ¬ë¡ ê°ì ž ìì libstdìì 컬ë ì ì ì€ííê³ ê°ì§ê³ ë ì ììµëë€.
@alexcrichton ë§í¬ê° ê¹šì§ ê² ê°ìì? ì¬êž°ë¥Œ ë€ì ê°ëŠ¬ íµëë€.
ì°ëŠ¬ê° ë Œìí í ê°ì§ë ê°ë¥í ì¶ë¡ 묞ì ë¡ ìžíŽ 몚ë libstd ì íì ë³ê²œíë ê²ìŽ ìœê° ìêž°ì ìŒ ì ìë€ë ê²ì ëë€.
í¹ì±ì ì¶ê°íë ê²ì ì¢ì 첫 ë²ì§ž ëšê³ìŽì§ë§ êž°ì¡Ž API륌 ì¬ì©íì¬ ëŠ¬í©í ë§íì§ ììŒë©Ž ì¬ì©ëìŽ ë§ì§ ììµëë€. https://github.com/rust-lang/rust/issues/27336#issuecomment -300721558ìì ìŠì íì¬ë ë€ì ìì륌 늬í©í°ë§ í ì ìì§ë§ std
ì newtype ëíŒë¥Œ ì¶ê° í ì ìë€ê³ ì ìí©ëë€. ì±ê°ì ìŒìŽì§ë§ ì§ì ì ìŽë£° ì ììµëë€.
@alexcrichton ê°ì²Ž í ë¹ì륌 ê°ì ž ì€ë íë¡ìžì€ë 묎ìì
ëê¹? ì§êžê¹ì§ì ëŽ ì€í (곧 ê³µê° ë ìì ì
ëë€. ížêž°ì¬ìŽ ììŒìë©Ž ë¹ê³µê° GH ì ì¥ìì ì¶ê° í ì ììµëë€). ê·žëŠ¬ê³ ì¬êž° ìì ë
Œìí 결곌 í ë¹ ì í¹ì±ê³Œ ê°ì²Ž ì¬ìŽì ê±°ì ì벜í ëì¹ìŽìì ê²ìŽëŒê³ 믿ê²ëììµëë€. í ë¹ ì í¹ì±. ì, ë¹ì ì (I ë³ê²œê³Œ ê°ìŽíŽìŒí©ëë€ 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 ìŽ Allocator
í¹ì± ë° Layout
ì íì ì ê³µíë PRì ìíë ê²ì²ëŒ ë€ëŠœëë€ . libstd
컬ë ì
ì íµí©ëì§ ìì 겜ì°ìë ë§ì°¬ê°ì§ì
ëë€.
ì ëë¡ ìŽíŽíë©Ž PRì ì¬ëŠŽ ì ììµëë€. ì ìŽë RawVec
ë° Vec
íë¡í íì
곌ì íµí©ì ê³ì ìëíêž° ë묞ì ê·žë ê²íì§ ìììµëë€. (ìŽ ìì ìì RawVec
ìì
ì ìë£íì§ë§ Drain
ë° IntoIter
ì ê°ì ë€ë¥ž ë§ì êµ¬ì¡°ë¡ ìžíŽ Vec
ìŽ (ê°) ì¡°êž ë ìŽë µìµëë€. IntoIter
ë± ...)
ì€ì ë¡ ëŽ íì¬ ëžëì¹ë ì€ì ë¡ ë¹ë í ììë ê²ì²ëŒ 볎ìŽë¯ë¡ (ê·žëŠ¬ê³ RawVec
ìì íµí© í
ì€ížë¥Œ íµê³Œíìµëë€) ê·žëì ê³ìíŽì ê²ìíìµëë€. # 42313
@hawkwê° ë¬Œììµëë€.
ëŽê° ëª ë°±í ê²ì ëì¹ë€ë©Ž ì©ìíììì€. ê·žë¬ëìŽ RFCì ì€ëª ë ë ìŽìì í¹ì±ìŽ ëšì§ PODìŽêž° ë묞ì ë³µì ì ë³µì 륌 구ííì§ ìë ìŽì ê° ììµëê¹?
Layout
Copy
ê° ìë Clone
Layout
ë§ êµ¬ííëë¡ ë§ë ìŽì ë Layout
ì íì ë ë§ì 구조륌 ì¶ê° í ììë ê°ë¥ì±ì ìŽìŽëê³ ì¶ì êž° ë묞ì
ëë€. í¹í, í ë¹ìê° ë€ì ìµì
ì ê°ì§ ì ìëë¡ Layout
구ì±ì ì¬ì© ë ì í 구조 (ì : struct { x: u8, y: [char; 215] }
ì 16 ë°°ìŽ)륌 ì¶ì íë €ê³ ìëíë ë° ì¬ì í êŽì¬ìŽ ììµëë€. íì¬ ìœí
ìž ê° ìŽë€ ì íìì ìì±ëëì§ë³Žê³ íë ê³ìž¡ 룚íŽì ë
žì¶í©ëë€.
ìŽê²ì ê±°ì íì€íê² ì íì êž°ë¥ìŽìŽìŒí©ëë€. ìŠ, ì¡°ìê° ê°ë°ìê° ì íìŽ íë¶í Layout
ìì±ì륌 ì¬ì©íëë¡ ê°ìíë ê²ì ë°ëíë ê²ì²ëŒ 볎ì
ëë€. ë°ëŒììŽ íìì 몚ë ê³ìž¡ì ì í ì 볎ê°ìë í ë¹ì ì²ëŠ¬íêž° ìíŽ "ì ììë ë©ëªšëŠ¬ ëžë¡"ë²ì£Œì ê°ì ê²ì í¬íšíŽìŒí©ëë€.
ê·žëŒìë ë¶êµ¬íê³ ìŽì ê°ì êž°ë¥ìŽ ì ê° Layout
Copy
구ííëë¡ ì ííì§ ìì 죌ë ìŽì Copy
구íìŽ Layout
ì첎ì ëí ì¡°êž° ì ìœìŽ ë ê²ìŽëŒê³ ìê°íìµëë€.
ížì ëŽì ê°êž°
@pnkfelix ê° ìŽê²ì ë€ë£šê³ ìê³ PRìŽ ê²¬ìžì ë°ê³ ìë ê²ì²ëŒ 볎ì ëë€. ì§êž ìŽíŽë³Žê³ ëêžì ë¬ê³ ìëë° ë©ì§ë€ì!
íì¬ Allocator::oom
ì ìëª
ì ë€ì곌 ê°ìµëë€.
fn oom(&mut self, _: AllocErr) -> ! {
unsafe { ::core::intrinsics::abort() }
}
ê·žê²ì í ëŽ êŽì¬ì ëê² ê²ìœìŽ ì ìŽë ì OOMìë¡ í ë¹ í¬êž°ë¥Œ ìê³ ì¢ìíë,íì§ë§. OOMìŽ ë°ìíë ìŽì ì ëíŽ Option<Layout>
ì ê°ì 컚í
ì€ížë¥Œ ì¶ê°íêž° ìíŽ ìì í í ëìŽë¥Œ ê³ ë €í ì ììµëë€.
ë¿¡ ë¹µëš
ì¬ë¬ oom_xxx
ë³íìŽë ë€ë¥ž ìžì ì íì ìŽê±° íì ê°ë ê²ìŽ ê°ì¹ê° ììê¹ì? ì€íš í ììë ë©ìëì ëí ëª ê°ì§ ë€ë¥ž ìëª
ìŽ ììµëë€ (ì : alloc
ë ë ìŽìì, realloc
ì í¬ìží°, ì볞 ë ìŽìì, ì ë ìŽìì ë±). oom
-like ë©ìëê° ìŽë€ 몚ëì ëíŽ ìê³ ì¶ìŽíë 겜ì°ì
ëë€.
@joshlf ë§ìµëë€ , ì,íì§ë§ ê·žê²ìŽ ì ì©í ì§ íì€íì§ ììµëë€. êž°ë¥ì ì¶ê°íê³ ì¶ì§ë ììµëë€. êž°ë¥ì ì¶ê° í ì ìêž° ë묞ì ê³ìíŽì ëꞰ륌 ë¶ì¬ ë°ììŒí©ëë€.
ì¬êž°ì ìì íì ìì ì " fn dealloc
ì ê³µë ì ë ¬ì ëí ì구 ì¬íì íìž"íë ê²ì
ëë€. Windowsìì dealloc
ì íì¬ êµ¬í ì align
륌 ì¬ì©íì¬ ë°©ë²ì ê²°ì í©ëë€. ì¬ë°ë¥Žê² 묎ë£ì
ëë€. @ruuda ìŽ ì¬ì€ì êŽì¬ìŽìì ì ììµëë€.
ì¬êž°ì ìì íì ìì ì "
fn dealloc
ì ê³µë ì ë ¬ì ëí ì구 ì¬íì íìž"íë ê²ì ëë€. Windowsììdealloc
ì íì¬ êµ¬íìalign
륌 ì¬ì©íì¬ ë°©ë²ì ê²°ì í©ëë€. ì¬ë°ë¥Žê² 묎ë£ì ëë€.
ì, ìŽê²ìŽ ì ê° ì²ìì ìŽë° ìŒì 겪ì ë°©ë²ìŽëŒê³ ìê°í©ëë€. ìŽ ë묞ì ëŽ íë¡ê·žëšìŽ Windowsìì 충ëíìµëë€. HeapAlloc
ë ì ë ¬ì 볎ì¥íì§ ìêž° ë묞ì allocate
ë ë í° ììì í ë¹íê³ í€ëì ìë í¬ìží°ë¥Œ ì ì¥íì§ë§ ìµì íë¡ ì ë ¬ ì구 ì¬íìŽ ì¶©ì¡±ëë€ë©Ž íŒí ì ììµëë€. ìŽ ìµì í륌 ìì§ ìê³ HeapAlloc
륌 ì ë ¬ì íìë¡íì§ ìë ì ë ¬ ìžì í ë¹ ìë¡ ë³ííë ë°©ë²ìŽ ìëì§ ê¶êží©ëë€.
룚ë€
HeapAlloc
ì ì ë ¬ì 볎ì¥íì§ ììµëë€.
32 ë¹ížì ê²œì° 8 ë°ìŽíž ëë 64 ë¹ížì ê²œì° 16 ë°ìŽížì ìµì ì ë ¬ 볎ì¥ì ì ê³µíì§ë§ ê·žë³Žë€ ëì ì ë ¬ì 볎ì¥íë ë°©ë²ì ì ê³µíì§ ììµëë€.
Windowsì CRTìì ì ê³µíë _aligned_malloc
ë ë ëì ì ë ¬ì í ë¹ì ì ê³µ í ì ìì§ë§ í¹í _aligned_free
륌 ì¬ì©íì¬ free
_aligned_free
ì ìì ìŽë£šìŽìŒí©ëë€ . ë°ëŒì í ë¹ìŽ malloc
ëë _aligned_malloc
륌 íµíŽ ìíëìëì§ ì¬ë¶ë¥Œ 몚륎ë ê²œì° Windowsìì alloc_system
ìŽ (ê°) ìí ë ê²ê³Œ ëìŒí ììê»ëŒì ê°íê²ë©ëë€. deallocate
ëí ì ë ¬ì ìê³ ììµëë€. CRTë free
ì ìì ìŽë£° ììë íì€ aligned_alloc
êž°ë¥ì ì ê³µíì§ ììŒë¯ë¡ Microsoftì¡°ì°šëìŽ ë¬žì 륌 íŽê²°í ì ìììµëë€. (ë¹ë¡ ê·žê²ìŽ C11 êž°ë¥ìŽë©°, ê·ž ìœí ìžì ê·žëì ë§ìŽí¬ë¡ ìíížë C11륌 ì§ìíì§ ììµëë€.)
deallocate
ì (ë) ì ë ¬ìë§ ì 겜ì ìšì ì ë ¬ìŽ ê³Œëíê² ì ë ¬ëìëì§ ì¬ë¶ë¥Œ ìêž° ë묞ì ì€ì ê° ì첎ë êŽë šìŽ ììµëë€. ì§ì ìŒë¡ ì ë ¬ì ë
늜ì ìž deallocate
ì ìíë€ë©Ž 몚ë í ë¹ì 곌ëíê² ì ë ¬ í ì ìì§ë§ ìì í ë¹ì ë§ì ë©ëªšëŠ¬ë¥Œ ëë¹íê²ë©ëë€.
@alexcrichton ì ë€ì 곌 ê°ìŽ ìŒìµëë€ .
íì¬
Allocator::oom
ì ìëª ì ë€ì곌 ê°ìµëë€.fn oom(&mut self, _: AllocErr) -> ! { unsafe { ::core::intrinsics::abort() } }
ê·žê²ì í ëŽ êŽì¬ì ëê² ê²ìœìŽ ì ìŽë ì OOMìë¡ í ë¹ í¬êž°ë¥Œ ìê³ ì¢ìíë,íì§ë§. OOMìŽ ë°ìíë ìŽì ì ëíŽ
Option<Layout>
ì ê°ì 컚í ì€ížë¥Œ ì¶ê°íêž° ìíŽ ìì í í ëìŽë¥Œ ê³ ë €í ì ììµëë€.
AllocErr
ìë 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::heap
몚ëì ìŽêž° íšì€ìë ë³ëì ìì í ížëììì ê°ë¥ì±ìŽìë libs íì ìì¬ì ë
Œì륌 íµíŽ.
í ë¹ êŽë š 묞ì 륌 ê²í íë ëì ëë ëí ì°ì°í https://github.com/rust-lang/rust/issues/30170 ë€ì ì ì @pnkfelixìë€. OSX ìì€í í ë¹ìê° ëì ì ë ¬ë¡ ë²ê·žê°ìë ê²ì²ëŒ 볎ìŽë©° jemallocìŒë¡ íŽë¹ íë¡ê·žëšì ì€íí ë ì ìŽë Linuxìì í ë¹ íŽì ì€ì segfaultingìŽ ë°ìí©ëë€. ìì í ì€ì ê³ ë €í ê°ì¹ê° ììµëë€!
0 í¬êž° í ë¹ìŽ ìì² ë ì ë ¬ê³Œ ìŒì¹íŽìŒíëì§ ì¬ë¶ì ëí 구첎ì ìž ì§ë¬žì ë Œìíêž° ìíŽ # 42794륌 ìŽììµëë€.
(ì€ ì ê¹, í¬êž°ê° 0 ìž í ë¹ì ì¬ì©ì í ë¹ ììì ë¶ë² ì ëë€!)
alloc::heap::allocate
íšìì ì¹êµ¬ë€ìŽ ìŽì Nightlyìì ì¬ëŒì¡êž° ë묞ììŽ ìë¡ìŽ API륌 ì¬ì©íëë¡ Servo륌 ì
ë°ìŽížíìµëë€. ìŽê²ì diffì ìŒë¶ì
ëë€.
-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;
ì ë ìžì²Ž ê³µíìŽ ì¢ì§ ìë€ê³ ìê°í©ëë€. ì°ëŠ¬ë íëì í목ì ê°ì ž ì€ë ê²ìì ë ê°ì ë€ë¥ž 몚ëìì 3 ê°ì í목ì ê°ì ž ììµëë€.
allocator.alloc(Layout::from_size_align(âŠ))
ëí ížëŠ¬í ë°©ë²ì ì¬ì©íë ê²ìŽ í©ëŠ¬ì ì
ëê¹?<Heap as Alloc>::_
ë©ìë륌 ë¬Žë£ íšì ëë ê³ ì ë©ìëë¡ ì¬ì©í ì ìëë¡íë ê²ìŽ í©ëŠ¬ì ìŒê¹ì? (ê°ì žì¬ í목ì íë ì€ìŽë €ë©Ž Alloc
ížë ìŽ ížê° íìí©ëë€.)ëë Alloc
í¹ì±ìŽ ì 죌곡ì í¬íšë ì ììµëê¹? ìëë©Ž ì¬ì© ì¬ë¡ì íì ìì¥ì
ëê¹?
@SimonSapin IMOë ìŽë¬í ì ìì€ APIì ìžì²Ž ê³µíì ìµì ííë ë° ë³ ìë¯žê° ììµëë€.
ë¿¡ ë¹µëš
ì ë ìžì²Ž ê³µíìŽ ì¢ì§ ìë€ê³ ìê°í©ëë€. ì°ëŠ¬ë íëì í목ì ê°ì ž ì€ë ê²ìì ë ê°ì ë€ë¥ž 몚ëìì 3 ê°ì í목ì ê°ì ž ììµëë€.
ëë ëŽ ìœëë² ìŽì€ìì ëê°ì ëëì ë°ìë€. ì§êžì ꜀ í¬ë°íë€.
allocator.alloc(Layout::from_size_align(âŠ))?
ëí ížëŠ¬í ë°©ë²ìŽìë ê²ìŽ í©ëŠ¬ì ìŒê¹ì?
Alloc
í¹ì±ì ì믞í©ëê¹, ìëë©Ž Heap
ë§ì ì믞í©ëê¹? ì¬êž°ì ê³ ë €íŽìŒ í í ê°ì§ë ìŽì ìž ë²ì§ž ì€ë¥ ì¡°ê±ŽìŽ ìë€ë ê²ì
ëë€. Layout::from_size_align
ë Option
ë°ííë¯ë¡ í ë¹ í ë ì»ì ììë ìŒë° ì€ë¥ì ì¶ê°íì¬ None
륌 ë°í í ì ììµëë€. .
ëë
Alloc
í¹ì±ìŽ ì 죌곡ì í¬íšë ì ììµëê¹? ìëë©Ž ì¬ì© ì¬ë¡ì íì ìì¥ì ëê¹?
IMOë ìŽë¬í ì ìì€ APIì ìžì²Ž ê³µíì ìµì ííë ë° ë³ ìë¯žê° ììµëë€.
ëë ê·žê²ìŽ ì곡ì ë£êž°ìë ë묎 ë®ì ìì€ìŽëŒë ë° ëìíì§ë§ ì¬ì í ìžì²Ž ê³µíì ìµì ííë ë° ê°ì¹ê° ìë€ê³ ìê°í©ëë€ (ì ìŽë ìŽêž°ì ìŒë¡, ê·žê²ì ì ë§ ì±ê°ì 늬 í©í° ð).
@SimonSapin ì ì OOMì std
ììë std::heap
몚ëìì ìž ê°ì§ ì íì 몚ë ì¬ì©í ì ììµëë€ (íëì 몚ëì ììŽìŒ íš). ëí ìŽì ìë í¬êž°ê° ëì¹ ê²œì°ë¥Œ ì²ëŠ¬íì§ ìììµëê¹? ìëë©Ž ì ë¡ í¬êž° ì í?
ì ì OOMì ë€ë£šì§ ìììµëê¹?
alloc::heap::allocate
íšìë Result
ììŽ í¬ìží°ë¥Œ ë°ííìŒë©° OOM ì²ëŠ¬ìì ì í ì¬íì ëšêž°ì§ ìììµëë€. ëë ê·žê²ìŽ íë¡ìžì€ë¥Œ ì€ëšíë€ê³ ìê°í©ëë€. ìŽì ì€ë ë륌 ë¹í©ìí€êž° ìíŽ .unwrap()
륌 ì¶ê°íìµëë€.
íëì 몚ëì ììŽìŒí©ëë€.
ìŽì heap.rs
ì pub use allocator::*;
í¬íšëìŽ ììµëë€. ëŽê° íŽëŠ í ë Alloc
ìí rustdoc íìŽì§ì ëììë IMPLì Heap
Iê° ì ì¡ ë alloc::allocator::Alloc
.
ëëšžì§ë ì¡°ì¬íì§ ìììµëë€. ëª ë ì ì ìì±ë ìœë ë믞륌 ìë¡ìŽ 컎íìŒë¬ë¡ ìŽìíê³ ììµëë€. ì ë ìŽê²ìŽ C ëŒìŽëžë¬ëŠ¬ ìž FreeTypeì ìœë°±ìŽëŒê³ ìê°í©ëë€.
ì¡Žì¬íì ë alloc :: heap :: allocate íšìë 결곌ììŽ í¬ìží°ë¥Œ ë°ííê³ OOM ì²ëŠ¬ì ì í ì¬íì ëšêž°ì§ ìììµëë€.
ê·žê²ì ë¹ì ìê² ì íê¶ì죌ììµëë€. ë°í ë í¬ìží°ë í í ë¹ìê° í ë¹ì ì€íšíìì ëíëŽë ë í¬ìží° ìŒ ì ììµëë€. ìŽê²ìŽ ì ê° Result
ë¡ ì ííì¬ ì¬ëë€ìŽ ê·ž ì¬ê±Žì ì²ëŠ¬íë ê²ì ìì§ ìëë¡ êž°ë»íë ìŽì ì
ëë€.
ì€ êžìì, ìë§ë FreeTypeìŽ ê²°êµ null ê²ì¬ë¥Œíì ìë ììµëë€. ìŽìšë , ì, 결곌륌 ë°ííë ê²ì ì¢ìµëë€.
# 30170 ë° # 43097ì ê°ìí ë ì¬ì©ì ê° ì ë ¬ì ìì²í 1 << 32
ì§ì íì¬ ìì²ëê² í° ì ë ¬ë¡ OS X 묞ì 륌 íŽê²°íê³ ì¶ìµëë€.
ìŽ ìí í ì죌 ì¬ìŽ ë°©ë² : ë³ê²œ Layout
ìží°íìŽì€ ê·žëì align
aë¡ íìëë€ 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
ì ííë ê²ìŽ í©ëŠ¬ì ìŒë¡ 볎ì
ëë€!
@rfcbot fcp ë³í©
ì¢ì,ìŽ í¹ì±ê³Œ ê·ž ì íì íëì 구ìì¡ê³ ëí ì²ìë¶í° íì€ ì»¬ë ì ì Ʞ볞 구íìŽììµëë€. ì ë í¹í 볎ìì ìž ìŽêž° ì€íŒë§ìŒë¡ ììíë ê²ì ì ìí©ëë€. ìŠ, ë€ì ìží°íìŽì€ ë§ ìì ííë ê²ì ëë€.
pub struct Layout { /* ... */ }
extern {
pub type void;
}
impl Layout {
pub fn from_size_align(size: usize, align: usize) -> Option<Layout>;
pub unsafe fn from_size_align_unchecked(size: usize, align: usize) -> Layout;
pub fn size(&self) -> usize;
pub fn align(&self) -> usize;
}
pub unsafe trait Alloc {
unsafe fn alloc(&mut self, layout: Layout) -> *mut void;
unsafe fn alloc_zeroed(&mut self, layout: Layout) -> *mut void;
unsafe fn dealloc(&mut self, ptr: *mut void, layout: Layout);
// all other methods are default and unstable
}
/// The global default allocator
pub struct Heap;
impl Alloc for Heap {
// ...
}
impl<'a> Alloc for &'a Heap {
// ...
}
/// The "system" allocator
pub struct System;
impl Alloc for System {
// ...
}
impl<'a> Alloc for &'a System {
// ...
}
ìë ì ì
pub struct Layout { /* ... */ }
impl Layout {
pub fn from_size_align(size: usize, align: usize) -> Option<Layout>;
pub unsafe fn from_size_align_unchecked(size: usize, align: usize) -> Layout;
pub fn size(&self) -> usize;
pub fn align(&self) -> usize;
}
// renamed from AllocErr today
pub struct Error {
// ...
}
impl Error {
pub fn oom() -> Self;
}
pub unsafe trait Alloc {
unsafe fn alloc(&mut self, layout: Layout) -> Result<*mut u8, Error>;
unsafe fn dealloc(&mut self, ptr: *mut u8, layout: Layout);
// all other methods are default and unstable
}
/// The global default allocator
pub struct Heap;
impl Alloc for Heap {
// ...
}
impl<'a> Alloc for &'a Heap {
// ...
}
/// The "system" allocator
pub struct System;
impl Alloc for System {
// ...
}
impl<'a> Alloc for &'a System {
// ...
}
í¹í :
alloc
, alloc_zeroed
ë° dealloc
ìš ë°©ë² Alloc
ì§êž í¹ì±ì. ìŽê²ìŽ ì€ëë ì°ëŠ¬ê° ê°ì§ê³ ìë ê°ì¥ ìêží 묞ì 륌 íŽê²°íê³ ì»€ì€í
êžë¡ë² í ë¹ì륌 ì ìíë€ê³ ìê°í©ëë€.Error
ì íì ì ê±°íììì€.u8
ì íì void
Layout
ì íì ì ê±° ë ë²ì ì
ëë€.dealloc
ë° ì ë ¬ (ì íí ì ë ¬? ì í©? íì€íì§ ìì)ìŒë¡ 묎ììíŽìŒíëì§ì ëí ì§ë¬žìŽ ìì§ ëšì ìì§ë§ APIê° ìë ê°ë¥ì±ìŽ ëìŒë¯ë¡ FCP ì€ì íŽê²°í ì ìꞰ륌 ë°ëëë€. ëžë ìŽí¹ 첎ìžì§.
묎ìžê°ë¥Œ ìì ìí€ë ë° +1!
AllocErr
ìError
ë¡ ë°êŸžê³ ìží°íìŽì€ë¥Œ ì¢ ë 볎ìì ìŒë¡ ìŽëí©ëë€.
í ë¹ìê° Unsupported
륌 ì§ì íë ìµì
ì ì ê±°í©ëê¹? ëŽê° ë§ìŽ í륎 ííŽìš ê²ì ëíŽ ë ë§ìŽ í륎 í í ìíìŽ ìì§ë§, ëë # 44557ìŽ ì¬ì í 묞ì ëŒê³ ìê°í©ëë€.
Layout
Layout
ìì ìŒë¶ ë©ìë륌 ì ê±°í ê² ê°ìµëë€. ë¹ì ìŽ ë¹ ëšëŠ° ê²ë€ì ì€ì ë¡ ì ê±°íë €ê³ íìµëê¹, ìëë©Ž ê·žë¥ ë¶ìì íê² ëììµëê¹?
impl Error { pub fn oom() -> Self; }
ìŽê²ìŽ ì€ë AllocErr::Exhausted
ì ìì±ìì
ëê¹? ê·žë ë€ë©Ž Layout
ë§€ê° ë³ìê° ììŽìŒíì§ ììµëê¹?
@alexcrichton íì ìŽìŽë¥Œ ë³í© í ê²ì ì ìíìµëë€. ë€ì ëšê³ë íê·žê° ì§ì ë ëëšžì§ íì ê²í ì ëë€.
ì°ë € ì¬í :
ìŽë¬í ê²í ìê° í©ìì ëë¬íë©Ž ìµì¢ ì견 êž°ê°ìŽ ììë©ëë€. ìŽ ê³Œì ìì ìì§ ì êž°ëì§ ìì 죌ì 묞ì 륌 ë°ê²¬íë©Ž ìë €ì£Œìžì!
íê·ž ë íììŽ ëìê² ì€ ììë ëª ë ¹ì ëí ì 볎ë ìŽ ë¬žì 륌 ì°žì¡°íììì€.
ìŽ ìì ì ìŒë¶ë¥Œ ìì ííê²ëìŽ ì ë§ êž°ì©ëë€!
í ê°ì§ ì§ë¬ž : ìì ì€ë ëìì @joshlf ë° @ Ericson2314 ë alloc
ì¬ë¡ë¥Œ ìµì ííêž° ìíŽ Alloc
ë° Dealloc
í¹ì±ì ë¶ëŠ¬ í ê°ë¥ì±ì ëíŽ í¥ë¯žë¡ìŽ ì ì ì êž°íìµëë€ alloc
ìë ìŒë¶ ë°ìŽí°ê° íìíì§ë§ dealloc
ìë ì¶ê° ì ë³Žê° íìíì§ ììŒë¯ë¡ Dealloc
ì íì 0 í¬êž°ê° ë ì ììµëë€.
ìŽ ì§ë¬žìŽ íŽê²° ëììµëê¹? ë í¹ì±ì ë¶ëŠ¬ í ëì ëšì ì 묎ìì ëê¹?
í
í ë¹ìê° ì§ìëì§ ììì ì§ì íë ìµì ìŽ ì ê±°ë©ëê¹?
ì, ìëì€, ìŽë¬í ìì ì ìì ë ë ¹ìì ìŠì ì§ìëì§ ìì§ë§ ë¶ìì í Rustìì ê³ì ì§ìí ì ììì ì믞í©ëë€.
ë¹ì ìŽ ë¹ ëšëŠ° ê²ë€ì ì€ì ë¡ ì ê±°íë €ê³ íìµëê¹, ìëë©Ž ê·žë¥ ë¶ìì íê² ëììµëê¹?
곌ì°! ë€ì í ë² ìì ì ìž API íë©Žì ì ì ìíê³ ìì§ë§ ë€ë¥ž 몚ë ë©ìëë ë¶ìì í ìíë¡ ë ì ììµëë€. ìê°ìŽ ì§ëšì ë°ëŒ ë ë§ì êž°ë¥ì ê³ì ìì í í ì ììµëë€. ìµëí 볎ìì ìŒë¡ ììíë ê²ìŽ ìµì ìŽëŒê³ ìê°í©ëë€.
ë¿¡ ë¹µëš
ìŽê²ìŽ ì€ë AllocErr :: Exhaustedì ìì±ìì ëê¹? ê·žë ë€ë©Ž ë ìŽìì ë§€ê° ë³ìê° ììŽìŒíì§ ììµëê¹?
ìí ì¢ì ì§ì ! ëë ì°ëŠ¬ê° ì ë§ë¡ íìíë€ë©Ž Error
í¬êž°ë¥Œ ì ë¡ë¡ ë§ë€ ììë ê°ë¥ì±ì ëšê²šëê³ ì¶ìì§ë§, ë¬Œë¡ ë ìŽìì-ì·šë ë°©ë²ì ë¶ìì íê² ì ì§íê³ íìí ê²œì° ìì íìí¬ ì ììµëë€. ìëë©Ž ë ìŽììì ì ì§íë Error
ìŽ ì²« ë²ì§ž íšì€ìì ìì íëìŽìŒíë€ê³ ìê°íìëê¹?
ë¿¡ ë¹µëš
ëë ê°ìžì ìŒë¡ ìì§ ê·žë° ì§ë¬ž / ì°ë € ì¬íì ë³Žì§ ëª»íì§ë§ (ëë ê·žê²ì ëì¹ ê² ê°ë€!), ê°ìžì ìŒë¡ ê·žë§í ê°ì¹ê° ìë€ê³ ë³Žì§ ìì ê²ìŽë€. ì륌 ë€ìŽ 몚ë ì¬ëìŽ ì»¬ë ì
ì Alloc + Dealloc
륌 ì
ë ¥íŽìŒíë¯ë¡ ë ê°ì§ í¹ì±ì ìŒë°ì ìŒë¡ ìì©êµ¬ì ë ë°°ì
ëë€. ëë ê·žë¬í í¹ìí ì¬ì©ìŽ ë€ë¥ž 몚ë ì¬ì©ìê° ê°ìžì ìŒë¡ ì¬ì©íê²ëë ìží°íìŽì€ì ìëŠ¬ê³ ì¶ì§ ìì ê²ìŽëŒê³ êž°ëí©ëë€.
ížì ëŽì ê°êž°
ëë ê°ìžì ìŒë¡ ìì§ ê·žë° ì§ë¬ž / ì°ë € ì¬íì ë³Žì§ ëª»íì§ë§ (ëë ê·žê²ì ëì¹ ê² ê°ë€!), ê°ìžì ìŒë¡ ê·žë§í ê°ì¹ê° ìë€ê³ ë³Žì§ ìì ê²ìŽë€.
ìŒë°ì ìŒë¡ ëë Box
í ê°ì§ ììžë¥Œ ê°ì§ê³ ê·žë§í ê°ì¹ê° ìë€ë ë° ëìí©ëë€. Box<T, A: Alloc>
ë Alloc
ì íì¬ ì ì륌 ê³ ë €í ë ìµìí ë ëšìŽ ìŽììŽìŽìŒí©ëë€ (ìŽë¯ž ê°ì§ê³ ìë í¬ìží°ì ìµìí Alloc
ì ëí ì°žì¡°). ) êžë¡ë² ì±êž í€ (ZSTë¡ êµ¬í ë ì ìì)ì 겜ì°ë¥Œ ì ìžíê³ . ìŽë¬í ê³µíµì ìŽê³ Ʞ볞ì ìž ì íì ì ì¥íë ë° íìí ê³µê°ìì 2x (ëë ê·ž ìŽì) íë°ìŽ ì ìê² ì°ë €ë©ëë€.
íí
ìŽì 몚ë ì¬ëìŽ ì»¬ë ì ì Alloc + Deallocì ì ë ¥íŽìŒíë¯ë¡
ë€ì곌 ê°ìŽ ì¶ê° í ì ììµëë€.
trait Allocator: Alloc + Dealloc {}
impl<T> Allocator for T where T: Alloc + Dealloc {}
ìŽë¬í ê³µíµì ìŽê³ Ʞ볞ì ìž ì íì ì ì¥íë ë° íìí ê³µê°ìì 2x (ëë ê·ž ìŽì) íë°
íë¡ìžì€ ì ììŽ ìë ì¬ì©ì ì§ì í ë¹ì륌 ì¬ì©í ëë§ íŽë¹ë©ëë€. std::heap::Heap
(Ʞ볞ê°)ì í¬êž°ê° 0ì
ëë€.
ìëë©Ž ë ìŽìì 볎졎 ì€ë¥ê° 첫 ë²ì§ž íšì€ìì ìì íëìŽìŒíë€ê³ ìê°íìëê¹?
@alexcrichton ìŽ ì ì ë 첫 ë²ì§ž íšì€ê° ì ê·žë°ì§ ìŽíŽíì§ ëª»í©ëë€. Vec
륌 ëšì©íì¬ ìŽë¯ž í ììë ê²ë³Žë€ ê²šì° ë§ìŒë©°, ì륌 ë€ìŽ https://crates.io/crates/jemallocator 륌 ì¬ì©íêž°ì 충ë¶íì§ ììµëë€
ì 첎륌 ìì ìí€êž° ìíŽ ì¬ì í íŽê²°íŽìŒ í ê²ì 묎ìì ëê¹?
íë¡ìžì€ ì ììŽ ìë ì¬ì©ì ì§ì í ë¹ì륌 ì¬ì©í ëë§ íŽë¹ë©ëë€. std :: heap :: Heap (Ʞ볞ê°)ì í¬êž°ê° 0ì ëë€.
ê·žê²ì íëŒ ë©ížëŠ í ë¹ì륌 ê°ë 죌ì ì¬ì© ì¬ë¡ì²ëŒ 볎ì ëë€. ë묎ì ëí ë€ì곌 ê°ì ê°ëší ì ì륌 ììíŽë³Žììì€.
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
ìŽ í¹ì±ìŽëë ìì ì
ëë€.
ë¿¡ ë¹µëš
ë€ì곌 ê°ìŽ ì¶ê° í ì ììµëë€.
ì°ëŠ¬ë ëí ì€ì í¹ì± ë³ì¹ì ê°ì§ ê²ì ëë€ :) https://github.com/rust-lang/rust/issues/41517
@glaebhoerl ì, ê·žë¬ë ìì§ êµ¬íìŽ ìêž° ë묞ì ìì íë ì¬ì í Allocator
ì ìë impls륌 ë¹íì±ííë©Ž ížë ìŽ íž ë³ì¹ìŽ ëì°©íì ë ì íží ì ìŒë¡ ì í í ì ìë€ê³ ìê°í©ëë€;)
í
ìŽë¬í ê³µíµì ìŽê³ Ʞ볞ì ìž ì íì ì ì¥íë ë° íìí ê³µê°ìì 2x (ëë ê·ž ìŽì) íë°ìŽ ì ìê² ì°ë €ë©ëë€.
ì€ëë ì 몚ë 구íì í¬êž°ê° 0 ìž ì í ëë í° í¬ìží°ëŒê³ ìê°í©ëë€. ìŒë¶ í¬ìží° í¬êž° ì íìŽ 0 í¬êž°ê° ë ììë ê°ë¥í ìµì íê° ìëê°ì? (ëë ê·žë° ê²?)
ë¿¡ ë¹µëš
ë€ì곌 ê°ìŽ ì¶ê° í ì ììµëë€.
곌ì°! íì§ë§ ì°ëŠ¬ë íëì í¹ì±ì ìž ê°ì§ ë¡ ê°ì ž ììµëë€. 곌거ì ì°ëŠ¬ë ê·žë¬í í¹ì±ì ëíŽ ì¢ì 겜íì í ì ìŽ ììµëë€. ì륌 ë€ìŽ Box<Both>
ë Box<OnlyOneTrait>
ìºì€ížëì§ ììµëë€. ëë ì°ëŠ¬ê° ìžìŽ êž°ë¥ìŽìŽ 몚ë ê²ì ë¶ëëœê²íꞰ륌 êž°ë€ëŠŽ ì ìë€ê³ íì íì§ë§, êž°ê»íŽìŒ 뚌 êžžìž ê² ê°ìµëë€.
ë¿¡ ë¹µëš
ì 첎륌 ìì ìí€êž° ìíŽ ì¬ì í íŽê²°íŽìŒ í ê²ì 묎ìì ëê¹?
ëªšë¥Žê² ìŽì. ì ë ê°ì¥ ìì ê²ë¶í° ììíê³ ì¶ììµëë€.
ì€ëë ì 몚ë 구íì í¬êž°ê° 0 ìž ì í ëë í° í¬ìží°ëŒê³ ìê°í©ëë€. ìŒë¶ í¬ìží° í¬êž° ì íìŽ 0 í¬êž°ê° ë ììë ê°ë¥í ìµì íê° ìëê°ì? (ëë ê·žë° ê²?)
ì, ììŽëìŽë í ë¹ ì ì íìì í ë¹ ë ê°ì²Žì ëí í¬ìží°ê° 죌ìŽì§ë©Ž ìŽë€ ìžì€íŽì€ìì ìëì§ ììëŒ ì ìë€ë ê²ì ëë€ (ì : ìžëŒìž ë©í ë°ìŽí° ì¬ì©). ë°ëŒì í ë¹ì íŽì íŽìŒíë ì ìŒí ì 볎ë ë°íì ì ë³Žê° ìë ì í ì 볎ì ëë€.
í ë¹ íŽì ì ëí ì ë ¬ë¡ ëìê°ë €ë©Ž ë ê°ì§ ë°©ë²ìŽ ììµëë€.
ì ì ëëë¡ ìì íí©ëë€ (í ë¹ íŽì ì ì ë ¬). Layout
ê° í¬íšëì§ ììŒë©Ž ìëìŒë¡ í ë¹ ë ë©ëªšëŠ¬ì ìì ê¶ì í¬êž°íë ê²ì ë¶ê°ë¥í©ëë€. í¹í Vec
ëë Box
ëë String
ëë êž°í std
컚í
ìŽë륌 íìë³Žë€ ë ì격í ì ë ¬ë¡ êµ¬ì¶íë ê²ì ë¶ê°ë¥í©ëë€ (ì : ëì€ì ìëìŒë¡ íŽì²Žíê³ í ë¹ íŽì íì§ ìê³ (íì ìµì
ì ìë) ë°ì€í ììê° ìºì ëŒìžì 걞ì³ìë ê²ì ìíì§ ììµëë€. ë¶ê°ë¥í ë ë€ë¥ž ìë simd ì°ì°ì ì¬ì©íì¬ Vec
륌 ì±ìŽ ë€ììŽë¥Œ í¬êž°íë ê²ì
ëë€.
í ë¹ íŽì ì ì ë ¬ì ì구íì§ ìê³ Windowsì HeapAlloc
êž°ë° alloc_system
ìì ìê·ëªš í ë¹ ìµì í 륌 ì ê±° @alexcrichton , ê·ž ìœë륌 컀ë°íì ë ì ì²ìì ê±°êž°ì ë£ìëì§ êž°ìµíìëê¹? ì€ì ìì© íë¡ê·žëšìì ìë¹í ìì ë©ëªšëŠ¬ë¥Œ ì ìœíë€ë ìŠê±°ê° ììµëê¹? (ë§ìŽí¬ë¡ ë²€ì¹ ë§í¬ë¥Œ ì¬ì©íë©Ž í ë¹ í¬êž°ì ë°ëŒ ê²°ê³Œê° ëì€ëë¡ í ì ììµëë€. HeapAlloc
ê° í¬êž°ë¥Œ ë°ì¬ëŠŒíì§ ìë í)
ìŽìšë ìŽê²ì ë§€ì° ìŽë €ìŽ ížë ìŽë ì€íì ëë€. ë©ëªšëŠ¬ ë° ì±ë¥ì 믞ì¹ë ìí¥ì ì í늬ìŒìŽì ì íì ë°ëŒ í¬ê² ë¬ëŒì§ë©° ìµì í í í목ë ì í늬ìŒìŽì ë³ë¡ ë€ëŠ ëë€.
ëë ì°ëŠ¬ê° ì€ì ë¡ Just Fine (TM)ìŽëŒê³ ìê°í©ëë€. Alloc
묞ì ìžì© :
ìŒë¶ ë°©ë²ììë ë ìŽìììŽ ë©ëªšëŠ¬ ëžë¡ì ë§ììŒ í©ëë€.
ë ìŽìììŽ ë©ëªšëŠ¬ ëžë¡ì "ì í©"íë€ë ì믞 (ëë
ë§ì°¬ê°ì§ë¡, ë©ëªšëŠ¬ ëžë¡ìŽ ë ìŽììì "ì í©"íë €ë©Ž)
ë€ì ë ê°ì§ ì¡°ê±ŽìŽ ì ì§ëìŽìŒí©ëë€.
ëžë¡ì ìì 죌ìë
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
(ëìŒí í¬êž°) ë ìŽìììŒë¡ í ë¹ ë ê°ì²Žì ë§ìµëë€.
ìŽê²ìŽ ì믞íë ë°ë í¹ì ì íì íìí ìµì ì ë ¬ë³Žë€ í° ì ë ¬ì í ë¹ í ë€ì ë€ë¥ž ìœëê° ìµì ì ë ¬ë¡ í ë¹ì íŽì íëë¡ íì©íŽìŒíë€ë ê²ì ëë€.
ìŒë¶ í¬ìží° í¬êž° ì íìŽ 0 í¬êž°ê° ë ììë ê°ë¥í ìµì íê° ìëê°ì? (ëë ê·žë° ê²?)
ìµê·Œì ìŽì ëí RFCê° ììê³ ížíì± ë¬žì ë¡ ìžíŽ ìí í ììì ê² ê°ì§ ììµëë€ : https://github.com/rust-lang/rfcs/pull/2040
ì륌 ë€ìŽ
Box<Both>
ëBox<OnlyOneTrait>
ìºì€ížëì§ ììµëë€. ëë ì°ëŠ¬ê° ìžìŽ êž°ë¥ìŽìŽ 몚ë ê²ì ë¶ëëœê²íꞰ륌 êž°ë€ëŠŽ ì ìë€ê³ íì íì§ë§, êž°ê»íŽìŒ 뚌 êžžìž ê² ê°ìµëë€.
ë°ë©Žì í¹ì± ê°ì²Ž ì ìºì€í ì ë Œëì ì¬ì§ê°ììŽ ë°ëì§í ê²ìŒë¡ 볎ìŽë©° ëë¶ë¶ìŽë¥Œ 구ííêž°ìí ë žë ¥ / ëìí / ìì§ì 묞ì ì ëë€. ìµê·Œ ì€ë ëê° ììµëë€ : https://internals.rust-lang.org/t/trait-upcasting/5970
@ruuda ëë ìë alloc_system
구íì ìì±í ì¬ëìŽììµëë€. alexcrichtonì ëšì§ <time period>
ì ìëí í ë¹ ì 늬í©í°ë§ ëìì ê·žê²ì ìŽëíìµëë€.
íì¬ êµ¬í ììë 죌ìŽì§ ë©ëªšëŠ¬ ëžë¡ì í ë¹ í ë ì§ì í ê²ê³Œ ëìŒí ì ë ¬ë¡ í ë¹ì íŽì alloc_system
ê° ë³ê²œ ë ëê¹ì§ 몚ë ì¬ëìŽ ì€ìíŽìŒíë íì¬ íì€ì
ëë€.
Windowsì í ë¹ì íì MEMORY_ALLOCATION_ALIGNMENT
ì ë°°ì륌 ì¬ì©í©ëë€ (ë°ìŽížì í ë¹ í í¬êž°ë¥Œ êž°ìµíì§ë§). MEMORY_ALLOCATION_ALIGNMENT
ë 32 ë¹ížìì 8ìŽê³ 64 ë¹ížìì 16ì
ëë€. ì ë ¬ìŽë³Žë€ í¬êž° ë묞ì overaligned ì í, MEMORY_ALLOCATION_ALIGNMENT
ìêž° ì€ë² í€ëë¡ ìží alloc_system
64 ë°ìŽíž ì ë ¬ í ë¹ ì€ë² í€ëì 64 ë°ìŽíž ê²ìŽë€ëëë¡ ì§ì ì ë ¬ì ìì ì§ìì ìŽë€.
곌ëíê² ì ë ¬ ë ížëŠì 몚ë í ë¹ìŒë¡ íì¥íêž°ë¡ ê²°ì í ê²œì° (í ë¹ í ë ì§ì í ê²ê³Œ ëìŒí ì ë ¬ë¡ í ë¹ì íŽì íŽìŒíë ì구 ì¬íìŽ ì ê±°ëš) ë ë§ì í ë¹ì ì€ë² í€ëê° ë°ìí©ëë€. ì ë ¬ìŽ MEMORY_ALLOCATION_ALIGNMENT
ëìŒí í ë¹ì MEMORY_ALLOCATION_ALIGNMENT
ë°ìŽížì ìì ì€ë² í€ë륌 겪ìµëë€. ì ë ¬ìŽ MEMORY_ALLOCATION_ALIGNMENT
믞ë§ìž í ë¹ì ëëµ ì ë° ì ìê° MEMORY_ALLOCATION_ALIGNMENT
ë°ìŽížì ì€ë² í€ëê° ë°ìí©ëë€. MEMORY_ALLOCATION_ALIGNMENT
ë¡ ë°ì¬ëŠŒ ë í ë¹ í¬êž°ê° í ë¹ í¬êž°ì í¬ìží° í¬êž°ë¥Œ ëí ê°ë³Žë€ í¬ê±°ë ê°ìŒë©Ž ì€ë² í€ëê° ììµëë€. ê·žë ì§ ììŒë©Ž ì€ë² í€ëê° ììµëë€. í ë¹ì 99.99 %ê° ê³Œëíê² ì ë ¬ëì§ ìëë€ë ì ì ê³ ë €í ë ìŽë¬í 몚ë í ë¹ì ëíŽ ìŽë¬í ì¢
ë¥ì ì€ë² í€ë륌 ë°ììí€ê³ ì¶ìµëê¹?
룚ë€
ê°ìžì ìŒë¡ Windowsìì alloc_system
구ííë ê²ìŽ Vec
ì ê°ì ë€ë¥ž 컚í
ìŽëì ëí í ë¹ ìì ê¶ì ìëíë ê²ë³Žë€ ë í° ìŽì ìŽëŒê³ ìê°í©ëë€. AFAIKë íì ì ë ¬ë¡ íšë©íê³ í ë¹ íŽì ì ëí ì ë ¬ì ì구íì§ ìë ìí¥ì ìž¡ì í ë°ìŽí°ê° ììµëë€.
í
Windowsìì alloc_system
ë í ë¹ì ì ë¬ ë ê²ê³Œ ëìŒí ì ë ¬ìŽ í ë¹ íŽì ì ì ë¬ëë€ë ì ìì ì§ì íë¯ìŽ 죌ììŽ ì못ëìë€ê³ ìê°í©ëë€.
í ë¹ì 99.99 %ê° ê³Œëíê² ì ë ¬ëì§ ìëë€ë ì ì ê³ ë €í ë ìŽë¬í 몚ë í ë¹ì ëíŽ ìŽë¬í ì¢ ë¥ì ì€ë² í€ë륌 ë°ììí€ê³ ì¶ìµëê¹?
ì€ë² í€ëê° ì€ìíì§ ì¬ë¶ì ë©ëªšëŠ¬ ëë ì±ë¥ ìµì í ì¬ë¶ë ì í늬ìŒìŽì ì ë°ëŒ ë€ëŠ ëë€. ëŽ ìì¬ì ëë¶ë¶ì ìì© íë¡ê·žëšìì êŽì°®ì§ ë§ ììì ììê° ë©ëªšëŠ¬ì ëíŽ ê¹ìŽ êŽì¬ì ê°ê³ ììŒë©° ì€ì ë¡ ì¶ê° ë°ìŽížë¥Œ ê°ë¹í ì ìë€ë ê²ì ëë€. ê·žëŠ¬ê³ ë ë€ë¥ž ììì ììë ì ë ¬ì ì ìŽíŽìŒíëë° ì ë§ íìí©ëë€.
íí
Windowsìì
alloc_system
ë í ë¹ì ì ë¬ ë ê²ê³Œ ëìŒí ì ë ¬ìŽ í ë¹ íŽì ì ì ë¬ëë€ë ì ìì ì§ì íë¯ìŽ 죌ììŽ ì못ëìë€ê³ ìê°í©ëë€.
Windowsìì alloc_system
ìŽ ì€ì ë¡ Alloc
í¹ì±ì ì ëë¡ êµ¬ííì§ ìëë€ë ìë¯žê° ìëëê¹ (ë°ëŒì Alloc
í¹ì±ì ì구 ì¬íì ë³ê²œíŽìŒ í ìë ììµëë€)?
ë¿¡ë¿¡
ê·íì ì견ì ì¬ë°ë¥Žê² ìœê³ ìë€ë©Ž ë€ë¥ž ì ë ¬ë¡ í ë¹ì ì·šì í ì ìëì§ ì¬ë¶ì êŽê³ììŽ ëªšë í ë¹ì ëíŽ ì ë ¬ ì€ë² í€ëê° ì¡Žì¬íì§ ììµëê¹? ìŠ, 64 ë°ìŽíž ì ë ¬ë¡ 64 ë°ìŽížë¥Œ í ë¹íê³ 64 ë°ìŽíž ì ë ¬ë¡ë í ë¹ì íŽì íë©Ž ì€ëª í ì€ë² í€ëê° ì¬ì í ì¡Žì¬í©ëë€. ë°ëŒì 볎íµë³Žë€ í° ì ë ¬ì ìì²íë êž°ë¥ìŽë¯ë¡ ë€ë¥ž ì ë ¬ë¡ í ë¹ì íŽì í ììë êž°ë¥ìŽ ìëëë€.
@joshlf alloc_system
ìží ì€ë² í€ëë íì¬ ì ìë³Žë€ í° ì ë ¬ì ìì²íêž° ë묞ì
ëë€. ì ë ¬ìŽ MEMORY_ALLOCATION_ALIGNMENT
ë³Žë€ ìê±°ë ê°ìŒë©Ž alloc_system
ìží ì€ë² í€ëê° ììµëë€.
ê·žë¬ë ë€ë¥ž ì ë ¬ë¡ í ë¹ íŽì 륌 íì©íëë¡ êµ¬íì ë³ê²œíë©Ž ì ë ¬ì êŽê³ììŽ ê±°ì 몚ë í ë¹ì ì€ë² í€ëê° ì ì©ë©ëë€.
ì ìê² ìµëë€. ë§ìŽëë€.
í곌 í 몚ëì ëíŽ Allocì 구ííë€ë ì믞ë 묎ìì ëê¹? ìŽë€ 겜ì°ì ì¬ì©ìê° ìŽë¬í impls ì€ íë륌 ì¬ì©í©ëê¹?
*mut u8
ê° "묎ììŽë ì ëí í¬ìží°"륌 ì믞íë ìµìŽì íì€ ëŒìŽëžë¬ëŠ¬ APIì
ëê¹? String :: from_raw_partsê° ìì§ë§ ì€ì ë¡ë ë°ìŽížì ëí í¬ìží°ë¥Œ ì믞í©ëë€. ëë "묎ììŽë ì ëí í¬ìží°"륌 ì믞íë *mut u8
ì í¬ìŽ ìëëë€. Cì¡°ì°šë ë ì¢ìµëë€. ë€ë¥ž ìµì
ì 묎ìì
ëê¹? ë¶í¬ëª
í ì íì ëí í¬ìží°ê° ë ì믞ê°ìì ì ììµëë€.
@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
륌 ê³ ìíë €ë ëêž°ê° ì¶©ë¶íì§ ìì ê² ê°ìµëë€ (ê³µì íê² ë§íë©Ž íì€íì§ ìì).
ëí * mut ()ì í¥í 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,
}
ìŽì ëšìŒ í ë¹ìì í¬êž° 7ì 묞ììŽë¡ Node<V>
ì í ë¹íë €ê³ í©ëë€. ìŽìì ìŒë¡ë í¬êž° 16 í ë¹ì 4ë¡ ë§ì¶ê³ ê·ž ìì 몚ë ê²ì ë§ì¶ê³ ì¶ìµëë€ : u32
ê²œì° 4, V
ê²œì° 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>
í ë¹íë©Ž ì¶ê° ë°ìŽí°ë¥Œ ê°ì ž ì€ë €ê³ íë©Ž ë®ìŽ ìž ì ììì ì믞í©ëë€.)
(ì°žê³ , btw : 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
ê° ìëêž° ë묞ì Excess(ptr, usize)
ëŒë ìŽëŠìŽ ìœê° í·ê° 늬ì§ë§ total
í ë¹ í¬êž°.
IMO Total
, Real
, Usable
ëë í ë¹ì ìŽ í¬êž° ëë ì€ì í¬êž°ê° "ìŽê³Œ"ë³Žë€ ë«ë€ë ê²ì ì ë¬íë ìŽëŠ ì€íŽì ìì§ê° ììµëë€. _excess
ë©ìëìë ëìŒíê² ì ì©ë©ëë€.
ìì @gnzlbgì ëìíë©° ìŒë° (ptr, usize) ííìŽ êŽì°®ì ê²ìŽëŒê³ ìê°í©ëë€.
Excess
ë 첫 ë²ì§ž íšì€ìì ìì íëëë¡ ì ìëì§ ììµëë€.
ì°ë €íë ì¬ëë€ìŽìë redditì ëí í ë¡ ì ìíŽìŽ ì€ë ë륌 ê²ìíìµëë€. https://www.reddit.com/r/rust/comments/78dabn/custom_allocators_are_on_the_verge_of_being/
ì€ë @ 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
륌 ì¬ì©íë ê²ìŽ ë§€ì° ížëŠ¬íë€ë ê²ì ëë€.
íì ëŒìŽëžë¬ëŠ¬ë€ìì ì°ëŠ¬ë ëí ì ì impl *mut void { fn offset }
ì 충ëíì§ ìë륌 êž°ì¡Ž offset
ì ëíŽ ì ì T: Sized
. byte_offset
ìë ììµëë€.
*mut void
ë° byte_offset
ì¬ì©ì ëí +1. extern ì í êž°ë¥ì ìì íì 묞ì ê° ììµëê¹, ìëë©Ž ì ì ë§ ë¶ìì íê³ (ê·žëŠ¬ê³ liballocì ëŽë¶ì ìŒë¡ ë¶ìì í ìŒì í ì ìì) ì¬ì©ìŽ ìëêž° ë묞ì (ì : let a: *mut void = ...
ë¶ìì íì§ ìì)?
ì, ì°ëŠ¬ë ìžë¶ ì í ìì í륌 ì°šëší íìê° ììµëë€. extern ì í ì§ììŽ ìì ëëëŒë ìŽì ëíŽ ì ìí void
ë íì ë§ë² ì íì ìµì
ì 겜ì°ê° ë ì ììµëë€.
libs íììì Alloc
ì Dealloc
ê° ë³ê°ì í¹ì±ìŽìŽìŒíëì§ ì¬ë¶ì ëí ì¶ê° ë
Œìê° ìììµëê¹?
ì°ëŠ¬ë ê·žê²ì ëíŽ êµ¬ì²Žì ìŒë¡ ë€ë£šì§ ììì§ë§ ìŒë°ì ìŒë¡ ì°ëŠ¬ê° ê·žë ê² í í¹ë³í ìŽì ê° ìì§ ìë í ì í êž°ì ìì ì ííŽìë ìëë€ê³ ëêŒìµëë€. í¹í C ++ì Allocator ê°ë ì ì ì¬í ë¶í ìŽ ììµëë€.
ìŽ ê²œì°ì ìŽê²ìŽ ì ì í ë¹êµìžì§ íì í ì ììµëë€. C ++ììë 몚ë ê²ìŽ ëª
ì ì ìŒë¡ íŽì ëë¯ë¡ ì첎 í ë¹ ìì ë³µì¬ë³ž (ëë ì°žì¡°)ì ì ì¥íŽìŒíë Box
íŽë¹íë íëª©ìŽ ììµëë€. ê·žê²ìŽ ì°ëŠ¬ìê² í° íë°ì ììžì
ëë€.
std::unique_ptr
ë "ìì ì"ìì ìŒë°ì ì
ëë€ .
@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)
}
}
ëë¶ë¶ì ì¬ì© ì¬ë¡ìì ê±±ì í í¹ì±ìŽ íë ì ìµëë€.
- allocì ë°í ì íì * mut voidë¡ ë³ê²œíì¬ ê²°ê³Œì ì€ë¥ë¥Œ ì ê±°í©ëë€.
ìë§ë ê°ì¥ ë ŒëìŽëë ê²ì ë§ì§ë§ ìì ìŒ ê²ìŽë¯ë¡ ìŽì ëíŽìë ììží ì€ëª íê³ ì¶ìµëë€. ìŽê²ì ì€ë libs í곌ì ë Œììì ëìê³ , í¹í (a) 결곌 êž°ë° ìží°íìŽì€ê° í¬ìží° ë°í ìží°íìŽì€ë³Žë€ ë íšìšì ìž ABI륌 ê°ê³ (b) ì€ëë "íë¡ëì "í ë¹ìê° íìµ ë¥ë ¥ì ì ê³µíì§ ìë ë°©ë²ì ì€ì¬ìŒë¡ ì§íëììµëë€. "ìŽê² ë§ OOM'd"ìŽìì ëë€. ì±ë¥ì ìíŽ ì°ëŠ¬ë ëë¶ë¶ ìžëŒìž ë±ì ì¬ì©íì¬ ë¬žì륌 ìì±í ì ìì§ë§ ì€ë¥ë ê°ì¥ ë®ì ê³ìžµìì ì ê±°íêž° ìŽë €ìŽ ì¶ê° íìŽë¡ëì ëë€.
ìŽê²ì nullì íìžíì§ ìê³ ë°í ë í¬ìží°ë¥Œ ì¬ì©íë ê²ì ë§€ì° ìœê² ë§ë€ ê²ìŽëŒê³ ì°ë €í©ëë€. Result<NonZeroPtr<void>, AllocErr>
륌 ë°ííê³ AllocErr
í¬êž°ë¥Œ 0ìŒë¡ ë§ë€ìŽ ìŽë¬í ìíì ì¶ê°íì§ ìê³ ì€ë² í€ë륌 ì ê±° í ìëìë ê² ê°ìµëë€.
( NonZeroPtr
ë https://github.com/rust-lang/rust/issues/27730#issuecomment-316236397ì ì ì ëëë¡ ptr::Shared
ë° ptr::Unique
ê° ë³í© ë ê²ì
ëë€.)
@SimonSapin Result<NonZeroPtr<void>, AllocErr>
ì ê°ì ê²ì ìì í륌 ìíŽ ìž ê°ì§ ì íìŽ íìí©ëë€.ìŽ void
ì ê°ì ê²ì íìíì§ë ìê³ ê°ì§ê³ ììŽë ì¢ë€ (ì ìê°ìë).
"nullì íìžíì§ ìê³ ì¬ì©íêž° ìœë€"ë ì ì ëìí©ëë€. ê·žë¬ë ìŽê²ì ë€ì í ë² ê³Œëíê² ì¬ì©ëëë¡ ìëëì§ ìì ë§€ì° ë®ì ìì€ì APIìŽë¯ë¡ ížì¶ì ìžì²Ž ê³µíì ìµì ííŽìë ìëë€ê³ ìê°í©ëë€.
ì¬ëë€ì Result<NonZeroPtr<void>, AllocErr>
ì ê°ìŽ ë ë³µì¡í ë°í ì íì ê°ì§ ììë ë®ì ìì€ì alloc
ìì alloc_one
곌 ê°ì ë ëì ìì€ì ì¶ìí륌 êµ¬ì¶ í ìë ììµëë€.
ëë AllocErr
ìŽ ì€ì ë¡ ì ì©íì§ ìë€ë ë° ëìíì§ë§ Option<NonZeroPtr<void>>
ìŽë»ìµëê¹? ì€ë² í€ëììŽ ì°ë°ì ìŒë¡ ì€ì© í ììë APIë Rust륌 Cì ì°šë³ííë ìì ì€ íëìŽë©° C ì€íìŒì ë í¬ìží°ë¡ ëìê°ë ê²ì ì ìê² í 걞ì ë€ë¡ 묌ë¬ëë ëëì
ëë€. "ë§ìŽ ì¬ì©íì§ ìë ë§€ì° ë®ì ìì€ì API"ëŒê³ ë§íë ê²ì ìŒë°ì ìŽì§ ìì ë§ìŽí¬ë¡ 컚ížë¡€ë¬ ìí€í
ì²ì ë©ëªšëŠ¬ ìì ì±ìŽ ë§€ì° ë®ê³ ë§ìŽ ì¬ì©ëì§ ìêž° ë묞ì ì 겜 ì°ì§ ë§ììŒíë€ê³ ë§íë ê²ê³Œ ê°ìµëë€.
í ë¹ ììì 몚ë ìíž ìì©ìëìŽ íšìì ë°í ì íì êŽê³ììŽ ìì íì§ ìì ìœëê° í¬íšë©ëë€. ë°í ì íìŽ Option<NonZeroPtr<void>>
ìžì§ *mut void
ìžì§ ë®ì ìì€ì í ë¹ APIë ì€ì© í ì ììµëë€.
Alloc::alloc
í¹í ë®ì ìì€ìŽë©°, ë§ìŽ ì¬ì©í ì ììµëë€ API륌ìŽë€. Alloc::alloc_one<T>
ëë Alloc::alloc_array<T>
ì ê°ì ë©ìëë ë ë§ìŽ ì¬ì©ëë©° "ë ì¢ì"ë°í ì íì ê°ë ëìì
ëë€.
ìí ì ì¥ AllocError
ë ê·žë§í ê°ì¹ê° ìì§ë§ ì€ë¥ë¥Œ 구ííê³ Display
ì allocation failure
Display
ì (륌) ê°ë í¬êž°ê° 0 ìž ì íìŽ ììŒë©Ž ì¢ìµëë€. ì°ëŠ¬ê° ê° ê²œì° NonZeroPtr<void>
êžžì, ëë 볌 Result<NonZeroPtr<void>, AllocError>
ê²ìŽ ë°ëì§ìŒë¡ Option<NonZeroPtr<void>>
.
ìì ì ìíŽ ìë륎ë ìŽì :( !! Result<NonZeroPtr<void>, AllocErr>
ë íŽëŒìŽìžížê° ì¬ì©íêž°ì ëí ëìììŽ ì¢ì ê²ì
ëë€. ìŽê²ìŽ ì¢ì íìê°ìë "ë§€ì° ë®ì ìì€ì API"ëŒê³ ë§íë ê²ì ì°ìží ì ëë¡ ìŒì¬ìŽ ììµëë€. 몚ë ìì€ì ìœëë ë€ì곌 ê°ììŒí©ëë€. ê°ë¥í í ìì íê³ ì ì§ êŽëŠ¬ í ì ââììµëë€. ê³ì ížì§ëì§ ìë (ë°ëŒì ì¬ëë€ì ëšêž° êž°ìµì íìŽì§ê° íìëë) 몚íží ìœëë ëì± ê·žë ìµëë€!
ê²ë€ê° ì¬ì©ìê° ìì±í í ë¹ ë€íì± ì»¬ë ì ì ê°ì§ë €ë©Ž í ë¹ì륌 ì§ì ì¬ì©íë ìë¹í ë³µì¡í ìœëê° íìí©ëë€.
ì¬ ì²ëŠ¬, ìŽìì ì°ëŠ¬ë ížëŠ¬ êž°ë° ì»¬ë ì
ë¹ í ë²ë§ alloactor륌 ì°žì¡° / ë³µì íꞰ륌 ìí©ëë€. ìŠ, íꎎëë ê° custom-allocator-boxì í ë¹ì륌 ì ë¬íë ê²ì ì믞í©ëë€. ê·žë¬ë ì í ì íììŽ RustìììŽë¥Œ ê°ì¥ ì ìííë ë°©ë²ì ëí ìŽëŠ° 묞ì ì
ëë€. ìŽì ì견곌ë ë¬ëŠ¬, ìŽìì ìž ì¬ì© ì¬ë¡ê° ë¶í í ë¹ ì ë° í ë¹ íŽì í¹ì±ì 구íìŽ ìë Box
구íì ë³ê²œíêž° ë묞ì 컬ë ì
구íìì ìì íì§ ìì ìœëì ëíŽ êŽì°®ìµëë€. ìŠ, ì íì±ì ì°šëšíì§ ìê³ ë ìì ì ìž ì§íì í ì ììµëë€.
@sfackler ì ë í ë¹ ìì í ë¹ì륌 ì°ê²°íë ëª ê°ì§ êŽë š ì íìŽ íìíë€ê³ ìê°í©ëë€. ê°ì¥ìŽ ë¶ê°ë¥í ì ììµëë€.
@ Ericson2314 ì¬ëë€ìŽ íì€ ìžê³ì ì€ì ì¬ë¬Œì í ë¹ì륌 ì¬ì©íꞰ륌 ìíêž° ë묞ì ìì í륌ìí "ìë륎 êž°"ê° ììµëë€. ìŽê²ì 곌í íë¡ì ížê° ìëëë€.
êŽë š ì íì 묎ìì ì¬ì©ë©ëê¹?
@sfackler ì¬ëë€ì ì¬ì í ââìŒê°ì íì ê³ ì í ì ììŒë©° ìŽë¬í ì¢ ë¥ì ê³ êž êž°ë¥ì êŽì¬ìŽìë ì íì ì¬ëë€ì ê·žë ê²íë ê²ìŽ ížìíŽìŒí©ëë€. [묞ì ê° ë¶ìì í rustc ë ë¶ìì í RustëŒë©Ž, ì ì± ìì ìŽ íìí ë€ë¥ž 묞ì ì ëë€.] ë°ëë¡ íížìë APIë¡ ë² ìŽí¹íë©Ž ìíê³ë¥Œ ìë¡ìŽ 2.0 íì€ìŒë¡ ë¶í íê³ ì¶ì§ ìì í ì°ëŠ¬ë¥Œ ììí êŽŽë¡ íëë€.
êŽë š ì íì í ë¹ íŽì ìì í ë¹ì륌 êŽë šìíµëë€. ìŽê²ìŽ ìëíë €ë©Ž ê°ìê° ìë¡ì ëíŽ ìììŒí©ëë€. [ì¬ë°ë¥ž ì íì ì못ë (ë¹) í ë¹ì륌 ì¬ì©íë 묞ì ë ì¬ì í ìì§ë§ ì묎ë ìŽì ëí íŽê²°ì± ì ì격ìŒë¡ ì ìíì§ ìì ìì ìžì í©ëë€.]
ì¬ëë€ìŽ ìŒê°ìë§ ê³ ì í ì ìë€ë©Ž ì ì°ëŠ¬ë ìì ì ìž ë¹ë륌 ê°ì§ê³ ììµëê¹? í ë¹ ì APIì ì§ì ìíž ìì©íë ì¬ëë€ì ì륌 ë€ìŽ êžë¡ë² í ë¹ì륌 êµì²Žíì¬ ìŽë¬í API륌 íì©íë €ë ì¬ëë€ë³Žë€ íšì¬ ì ìµëë€.
í ë¹ íŽì ìê° ì°ê²°ë í ë¹ ìì ì íì ìììŒíë ìŽì 륌 볎ì¬ì£Œë ìœë륌 ìì±í ì ììµëê¹? C ++ì í ë¹ ì APIì ì ì¬í 맀íìŽ íìí ìŽì ë 묎ìì ëê¹?
ì¬ëë€ìŽ ìŒê°ìë§ ê³ ì í ì ìë€ë©Ž ì ì°ëŠ¬ë ìì ì ìž ë¹ë륌 ê°ì§ê³ ììµëê¹?
ìžìŽ ìì ì±ì ëíë ëë€. ìŽ ë²ì ì ëíŽ ìì±í ìœëë ì ëë¡ ê¹šì§ì§ ììµëë€. ìµì 컎íìŒë¬ìì. ë묎 ëì ê²ìŽ íìí ë ìŒê°ì ê³ ì íë¯ë¡ 볎ìŠí ë§í íì§ë¡ ê°ì£Œëë êž°ë¥ì ìµì¢ ë°ë³µì êž°ë€ëŠŽ ê°ì¹ê° ììµëë€.
í ë¹ ì APIì ì§ì ìíž ìì©íë ì¬ëë€ì ì륌 ë€ìŽ êžë¡ë² í ë¹ì륌 êµì²Žíì¬ ìŽë¬í API륌 íì©íë €ë ì¬ëë€ë³Žë€ íšì¬ ì ìµëë€.
ìí! ìŽê²ì jemallocì ë묎ìì ì®êž°êž°ìí ê²ìŒê¹ ì? ì묎ë ì ì í ë¹ì륌 ì íí ììë ëì°í íŽí¹ì ìì ííë ë°©ë²ì ì ìíì§ ìììµëë€. ìëë©Ž ì ìì ì못 ìœììµëê¹?
êžë¡ë² í ë¹ì륌 ì íí ììë ëì°í íŽí¹ìŽ ìì íëëë¡ ì ìëììµëë€. ìŽë ì°ëŠ¬ê° jemallocì ížëŠ¬ìì ì®êžž ììë ê²ì ì ë°ì ëë€. ìŽ ë¬žì ë ëëšžì§ ì ë°ì ëë€.
#[global_allocator]
ìì± ìì í : https://github.com/rust-lang/rust/issues/27389#issuecomment -336955367
Yikes
@ Ericson2314 êžë¡ë² í ë¹ì륌 ì ííë ëì°íì§ ìì ë°©ë²ì 묎ììŽëŒê³ ìê°íìëê¹?
(https://github.com/rust-lang/rust/issues/27389#issuecomment-342285805ì ìëµ)
ì ìì * mut void륌 ì¬ì©íëë¡ ìì ëììµëë€.
@rfcbot íŽê²° * mut u8
@rfcbot ê²í
IRCì ëíŽ ë
Œìí í Alloc
ìì Box
ì ë€ëŠì ìì í í ìëê° _ ìë _ìŽ ìëëŒ ìŒë¶ Dealloc
í¹ì±ì ëíŽ ì¬êž° @sfacklerê° ì ìí ì ì í ëŽì impl. ìë륌 ì€íŽ í ê²œì° ìë €ì£Œìžì.
@cramertj ëª
íííêž° ìíŽ, ì°ëŠ¬ê° ì¬êž°ì ìì ííê³ ìë Alloc
ì ì륌 깚ëšëŠ¬ì§ ìê³ ê·ž ëžëí· implì ì¬ì€ ë€ì ì¶ê°íë ê²ìŽ ê°ë¥í©ëê¹?
@joshlf ì, ë€ì곌 ê°ìŽ ë³ŽìŒ ê²ì ëë€ : https://github.com/rust-lang/rust/issues/32838#issuecomment -340959804
죌ìŽì§ Alloc
ëíŽ Dealloc
ì ìŽë»ê² ì§ì í©ëê¹? ìŽë° 걞 ììí ê¹ì?
pub unsafe trait Alloc {
type Dealloc: Dealloc = Self;
...
}
ëë ê·žê²ìŽ ì°ëŠ¬ë¥Œ ê°ì ìì WRT https://github.com/rust-lang/rust/issues/29661 ì ëì ê²ìŽëŒê³ ìê°í©ëë€
ì, Dealloc
ì ì¶ê°ê° Ʞ볞ê°ììŽ Alloc
ì êž°ì¡Ž ì ì (êŽë š ì íìŽ ìì)ì ì ížíëëë¡íë ë°©ë²ìŽ ìë€ê³ ìê°í©ëë€.
í ë¹ ìì íŽë¹íë í ë¹ íŽì ì륌 ìëìŒë¡ í볎íë €ë©Ž ì°ê²°ë ì í ìŽììŽ íìíì§ë§ í ë¹ íŽì ê°ì ìì±íë íšìê° íìí©ëë€.
ê·žë¬ë ìŽê²ì Alloc
ëŒë ë³ëì íì í¹ì±ì íŽë¹ í목ì 첚ë¶íì¬ í¥í ì²ëŠ¬ í ì ââììµëë€.
@sfackler ëŽê° ìŽíŽíëì§ ì ëªšë¥Žê² ìµëë€. ëììžì Box::new
ì ìëª
ì ìž ì ììµëê¹?
ìŽê²ì ë°°ì¹ êµ¬ë¬žê³Œ 몚ë ê²ì 묎ìíë ê²ìŽì§ë§ í ììë í ê°ì§ ë°©ë²ì
pub struct Box<T, D>(NonZeroPtr<T>, D);
impl<T, D> Box<T, D>
where
D: Dealloc
{
fn new<A>(alloc: A, value: T) -> Box<T, D>
where
A: Alloc<Dealloc = D>
{
let ptr = alloc.alloc_one().unwrap_or_else(|_| alloc.oom());
ptr::write(&value, ptr);
let deallocator = alloc.deallocator();
Box(ptr, deallocator)
}
}
í¹í, ì°ëŠ¬ë ê·ž ì íì ìë ê²ìŽ ìëëŒ ì€ì ë¡ í ë¹ íŽì ìì ìžì€íŽì€ë¥Œ ìì± í ì ììŽìŒí©ëë€. ëí ë§€ê° ë³ìí í ì Box
ìŽìì Alloc
ë° ì ì¥ A::Dealloc
ëì , íì
ì¶ë¡ ììë íì ëìì. Dealloc
ë° deallocator
륌 ë³ëì ížë ìŽ ížë¡ ìŽëíì¬ ìì í íììŽ ìì
ì ìí í ì ììµëë€.
pub trait SplitAlloc: Alloc {
type Dealloc;
fn deallocator(&self) -> Self::Dealloc;
}
íì§ë§ Drop
ì implì ìŽë»ê² ì게ìê¹ ì?
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
ë ê·žë€ì§ ì ì©íì§ ìì ê² ê°ìµëë€. í ë²ì íëë§ í ë¹ í ì ììµëë€.
ì°êŽë ì í Ʞ볞ê°ìŽ 묞ì ê° ëììµëê¹?
ì€, êŽë š ì í Ʞ볞ê°ì ì°ëŠ¬ê° ì 뢰í ì ììë§íŒ ë©ëŠ¬ ëšìŽì ž ìë€ê³ ìê°í©ëë€.
ê·žëë ë ê°ëš í ì ììµëë€.
unsafe trait Dealloc {
fn dealloc(&mut self, ptr: *mut void, layout: Layout);
}
impl<T> Dealloc for T
where
T: Alloc
{
fn dealloc(&self, ptr: *mut void, layout: Layout) {
<T as Alloc>::dealloc(self, ptr, layout)
}
}
unsafe trait Alloc {
type Dealloc: Dealloc;
fn deallocator(&mut self) -> Self::Dealloc;
...
}
구íìê° ìœê°ì ìì©êµ¬ë¥Œ ìì±íëë¡ ì구í©ëë€.
í ë¹ ìì ëí ë³ê²œ ê°ë¥í ì°žì¡° ìž
Dealloc
ë ê·žë€ì§ ì ì©íì§ ìì ê² ê°ìµëë€. í ë²ì íëë§ í ë¹ í ì ììµëë€.
ë€, ì¢ì ì§ì ì ëë€. ìŽìšë ë€ë¥ž ì견ì ê°ìí ë ìë§ë ë Œìì ì¬ì§ê° ììµëë€.
deallocator
ê° self
, &self
ëë &mut self
ê°ì ž ê°ìŒí©ëê¹?
ìë§ë &mut self
ë ë€ë¥ž ë°©ë²ê³Œ ìŒì¹í©ëë€.
ì륌 ë€ìŽ ìí륌 ë³µì í íìê° ìëë¡ ìì ì ê°ì¹ë¡ ì·šíë ê²ì ì ížíë í ë¹ìê° ììµëê¹?
self
륌 ê°ìŒë¡ ê°ì žê°ë 묞ì ë Dealloc
ì»ì ë€ì ê³ì í ë¹ í ì ìë€ë ê²ì
ëë€.
ëë ê°ìì "ìì·"í ë¹ì륌 ìê°íê³ ìì§ë§ ê·žê²ìŽ ìŒë§ë ì€ì ì ìž ê²ìžì§ë ëªšë¥Žê² ìµëë€.
ìŽë¬í í ë¹ìë ì¡Žì¬í ì ìì§ë§ 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
}
ê³ íµ ì€ëœë€ë ê²ì ìê³ ìì§ë§ ì¬êž°ì ë Œìíë ë³ê²œ ì¬íì ë¶í í ë¹ / í ë¹ í¹ì±ìŒë¡ ì§ííêž°ë¡ ê²°ì í ê²œì° ëšŒì íì€ìì ìëí ë€ì ë€ì FCP륌 ìëíŽìŒ í ë§íŒ 충ë¶í í° ê² ê°ìµëë€.
ìŽ íëª©ìŽ êµ¬íëꞰ륌 êž°ë€ëŠ¬ë ìŒì ì ìŽë»ê² ëëì?
grow_in_place
ë©ìëë ìŽë€ ì¢
ë¥ì ìŽê³Œ ì©ëë ë°ííì§ ììµëë€. íì¬ ë ìŽìì곌 íšê» usable_size
륌 ížì¶íê³ í ë¹ììŽ ë ìŽììì ë§ê² _at least_ë¡ íì¥íì§ë§ í ë¹ìŽ íŽë¹ ë ìŽìì ìŽììŒë¡ íì¥ëë©Ž ì¬ì©ìë ì ë°©ë²ìŽ ììµëë€.
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
ë°íì 0ì
ëë€. ë¹ì©ë ë§ì°¬ê°ì§ì
ëë€.
ìŽê³Œ ëì ê³ì°íë ë° ìœê°ì ë¹ì©ìŽìì ì ììŒë©° íì€í ë ë³µì¡í APIê° ììŒë¯ë¡ ìŽê³Œ ì©ëì ëíŽ ì 겜 ì°ì§ ìë ìœëê° ë¹ì©ì ì§ë¶íŽìŒíë ê²ì²ëŒ 볎ìŽì§ ììµëë€.
ì§êžì 몚ëê° ìŽë¯ž ë©ëªšëŠ¬ í ë¹ììí ë ê°ì API륌 ê°ì§ í ë¹ ì í¹ì±ì ëê°ë¥Œ ì§ë¶íê³ ììµëë€. ê·žëŠ¬ê³ Excess
-full one` ìì Excess
-less API륌 ë¹ë í ì ìì§ë§ ê·ž ë°ëë ì¬ì€ìŽ ìëëë€. ê·žëì ì ìŽë ê²ëì§ ìëì§ ê¶êží©ëë€.
Alloc
ížë ìŽ íž ë©ìëë íì Excess
ë°íí©ëë€.Alloc
ë©ìëìì Excess
ì ê±°íë ExcessLessAlloc
í¹ì±ì ì¶ê°íì¬ 1) Alloc
륌 ì¬ì©í ë§íŒ 충ë¶í ì 겜ì ì°ì§ë§ 2) ì¬ì©íì§ ìë 몚ë ì¬ì©ì륌 ìíŽ íì¬ í ë¹ëê³ ìë ì€ì ë©ëªšëŠ¬ ìì êŽì¬ìŽ ììµëë€ (ëìê² íì ìì¥ì²ëŒ 볎ìŽì§ë§ ì¬ì í ê·žë¬í APIê° ììŒë©Ž ì¢ë€ê³ ìê°í©ëë€)Alloc
ì ëí ë¹ ë¥ž 겜ë¡ìì ators Excess
- ë ë°©ë²ì, ì°ëŠ¬ë íìì ì¬ì©ì ì§ì 구íì ì ê³µ í ì ExcessLessAlloc
ê·žê²ì ëíí©ëë€.FWIW Alloc
ìì ëŽê° ìíë ê²ì 구íí ì ìêž° ë묞ì ë°©êžìŽ ì€ë ë륌 ë€ì ììíìµëë€. ìŽì ì grow_in_place_excess
ê° ëëœëìë€ê³ ìžêžíì§ë§ alloc_zeroed_excess
ë ëëœ ëìêž° ë묞ì ë€ì ë§íìµëë€.
ì¬êž°ì ìì íê° ëšŒì Excess
-full API륌 ìì ííë ë° ìŽì ì ë§ì¶ë©Ž ë ížì í ê²ì
ëë€. APIê° ëªšë ì©ëì ê°ì¥ ìžì²Ž ê³µíì ìŽì§ë ìëëŒë ìŽë¬í APIë ìµìí ì€ê³ì ê²°íšìŽ ììì 볎ì¬ì£Œë ë° íìí 몚ë ì©ë륌 íì©í©ëë€.
ì륌 ë€ìŽ ì€ ì ììµëê¹? ë©ëªšëŠ¬ë¥Œ í ë¹ í ì ìì§ë§ ì€ì ë¡ í ë¹íë ë©ëªšëŠ¬ ìì ìì§ ëª»íë í ë¹ ì (
Excess
ë ì€ì í ë¹ ë ë©ëªšëŠ¬ ìì ëë€. ìŽëŠì ë°ê¿ëë€).
ì€ëë ëë¶ë¶ì í ë¹ìë í¬êž° íŽëì€ë¥Œ ì¬ì©íëë°, ê° í¬êž° íŽëì€ë í¹ì ê³ ì í¬êž°ì ê°ì²Ž ë§ í ë¹íê³ í¹ì í¬êž° íŽëì€ì ë§ì§ ìë í ë¹ ìì²ì ëŽë¶ì ë§ë ê°ì¥ ìì í¬êž° íŽëì€ë¡ ë°ì¬ëŠŒë©ëë€. ìŽ ì²Žê³ììë í¬êž° íŽëì€ ê°ì²Žì ë°°ìŽì 볎ì í ë€ì classes[size / SIZE_QUANTUM].alloc()
륌 ìííë ê²ê³Œ ê°ì ìì
ì ìííë ê²ìŽ ìŒë°ì ì
ëë€. ê·ž ìžê³ìì ìŽë€ í¬êž° íŽëì€ê° ì¬ì©ëëì§ íì
íë €ë©Ž let excess = classes[size / SIZE_QUANTUM].size
ê°ì ì¶ê° ì§ì¹šìŽ íìí©ëë€. ë§ì§ë ìì ì ìì§ë§ ê³ ì±ë¥ í ë¹ ì (ì : jemalloc)ì ì±ë¥ì ëšìŒ íŽë¡ ì£Œêž°ë¡ ìž¡ì ëë¯ë¡ í¹í íŽë¹ í¬êž°ê° ìŒë šì íšì ë°íì íµê³Œíë ê²œì° ì믞ìë ì€ë² í€ë륌 ëíëŒ ì ììµëë€.
ì륌 ë€ìŽ ì€ ì ììµëê¹?
ìµìí alloc_jemallocì ââëí PRìì alloc_excess
ë alloc
ë³Žë€ ë ë§ì ìœë륌 ì€ííê³ ììµëë€ : https://github.com/rust-lang/rust/pull/45514/files.
ìŽ ë°©ìììë í¬êž° íŽëì€ ê°ì²Žì ë°°ìŽì ê°ê³ íŽëì€ [size / SIZE_QUANTUM] .alloc ()륌 ìííë ê²ê³Œ ê°ì ìì ì ìííë ê²ìŽ ìŒë°ì ì ëë€. ê·ž ìžê³ìì ìŽë€ í¬êž°ì íŽëì€ê° ì¬ì©ëëì§ ììëŽë ê²ì ì¶ê°ì ìž ì§ì륌 íìë¡í©ëë€ : ì륌 ë€ìŽ, let exceed = 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ì ë²ê·ž ìì (perf ìì ìŽ ìë)ìŽìê³ , íì¬ jemalloc ë ìŽìŽì perf-wise ìíìë ë§ì 묞ì ê° ìì§ë§ ê·ž PR ìŽíë¡ ì ìŽëíŽìŒ í ìŒì ë°íí©ëë€.
nallocx
ë GCC ì믞ìì const
íšì, ìŠ ì§ì í ìì íšìì
ëë€. ìŠ, ë¶ìì©ìŽìê³ , ê·ž 결곌ë ìžììë§ ìì¡Žíê³ , ì ì ìíì ì¡ìžì€íì§ ììŒë©°, ìžìê° í¬ìží°ê° ìëë©° (ë°ëŒì íšìê° ì ì ìíì ì¡ìžì€ í ì ììŒë¯ë¡) LLVMìŽìŽë¥Œ ì¬ì©í ì ììµëë€. ê²°ê³Œê° ì¬ì©ëì§ ìë ê²œì° ížì¶ì ì ê±°íêž°ìí ì 볎. AFAIK Rustë íì¬ FFI C íšì륌 const fn
ëë ìŽì ì ì¬í ê²ìŒë¡ íì í ì ììµëë€. ë°ëŒì ìŽê²ì ìì ë ììë 첫 ë²ì§ž 묞ì ìŽë©° ìžëŒìž ë° ìµì íê° ì ëë¡ ìëíë í ìŽê³Œë¶ì ì¬ì©íì§ ìë ì¬ëë€ìê² realloc_excess
ì ë¡ ë¹ì©ìŽ ë ê²ì
ëë€.nallocx
ë íì mallocx
ëŽë¶ì ì ë ¬ ë í ë¹ì ëíŽ ê³ì°ë©ëë€. ìŠ, 몚ë ìœëê° ìŽë¯žìŽë¥Œ ê³ì°íê³ ìì§ë§ mallocx
ë 결곌륌 ë²ëŠ¬ë¯ë¡ ì¬êž°ì ì€ì ë¡ ë ë² ê³ì°í©ëë€. , ê·žëŠ¬ê³ ìŽë€ 겜ì°ìë nallocx
ê° mallocx
ë§íŒ ë¹ìëë€ ... ì ë ëžëì¹ìì ìŽì ê°ì ê²ì ëí ë²€ì¹ ë§í¬ê°ìë jemallocator í¬í¬ 륌 ê°ì§ê³ ìì§ë§, ìŽê²ì ì
ì€ížëŠŒì ìíŽ ìì ëìŽìŒí©ëë€. ìŽê²ì ë²ëŠ¬ì§ ìë API륌 ì ê³µíšìŒë¡ìš jemalloc. ê·žë¬ëìŽ ìì ì¬íì íì¬ Excess
ì¬ì©ì€ìž 겜ì°ìë§ ìí¥ìì€ëë€.ì, ë ë§ì ìœëì²ëŒ 볎ìŽì§ë§ìŽ ì¶ê° ìœëë ì€ì ë¡ ë ë² ížì¶íë ìœëì ëë€. ì²ì ížì¶íì ë 결곌륌 ë²ë žìµëë€. ê³ ì¹ë ê²ì ë¶ê°ë¥íì§ ìì§ë§ ìì§ í ìê°ì ì°Ÿì§ ëª»íìµëë€.
ížì§ : @sfackler ëë ì€ë ê·žê²ì ìíŽ ìœê°ì ìê°ì í볎 í ì ììê³ jemallocs ë늰 겜ë¡ìì alloc
ì êŽë šíì¬ alloc_excess
"묎ë£"륌 ë§ë€ ì ììê³ ~ 1nsì ì€ë² í€ë ë§ ììµëë€. jemallocsì ë¹ ë¥ž 겜ë¡. ë¹ ë¥ž 겜ë¡ë¥Œ ììží ìŽíŽë³ž ì ì ìì§ë§ìŽë¥Œ ë ê°ì í ìë ììµëë€. ììží ëŽì©ì ì¬êž° : https://github.com/jemalloc/jemalloc/issues/1074#issuecomment -345040339
ê·žê² ë€ìŒ?
ì.
ë°ëŒì ìŽê²ìŽ ìì ë ììë 첫 ë²ì§ž 묞ì ìŽë©° ìžëŒìž ë° ìµì íê° ì ëë¡ ìëíë í ìŽê³Œë¶ì ì¬ì©íì§ ìë ì¬ëë€ìê² realloc_excess륌 ì ë¡ ë¹ì©ìŒë¡ ë§ë€ ê²ì ëë€.
ì ì í ë¹ ìë¡ ì¬ì©íë©ŽìŽ ì€ ìŽë ê²ë ìžëŒìž ë ì ììµëë€.
APIê° ëªšë ì©ëì ê°ì¥ ìžì²Ž ê³µíì ìŽì§ë ìëëŒë ìŽë¬í APIë ìµìí ì€ê³ì ê²°íšìŽ ììì 볎ì¬ì£Œë ë° íìí 몚ë ì©ë륌 íì©í©ëë€.
alloc_excess
륌 ížì¶íë Githubìë 묞ì ê·žëë¡ ìœëê° ììµëë€. ìŽê²ìŽ ë§€ì° ì€ìí êž°ë¥ìŽëŒë©Ž ì ì묎ë ê·žê²ì ì¬ì©íì§ ìììµëê¹? C ++ì í ë¹ APIë ìŽê³Œ ì©ëì ëí ì¡ìžì€ë¥Œ ì ê³µíì§ ììµëë€. ì±ë¥ì í¥ì ìíšë€ë ì€ì 구첎ì ìž ìŠê±°ê° ìê³ ì€ì ë¡ ì¬ì©íêž°ì 충ë¶í êŽì¬ìŽìë ì¬ëìŽëŒë©Ž í¥í ìŽë¬í êž°ë¥ì ìŽì ë²ì 곌 ížíëë ë°©ììŒë¡ ì¶ê° / ìì ííë ê²ìŽ ë§€ì° ê°ëš íŽ ë³Žì
ëë€.
ì ì í ë¹ ìë¡ ì¬ì©íë©ŽìŽ ì€ ìŽë ê²ë ìžëŒìž ë ì ììµëë€.
ê·žë ë€ë©Ž ê·žê²ì ìµìí LTO ë¹ëì ê²œì° íŽê²°íŽìŒ í 묞ì ì
ëë€. jemalloc
ì ê°ì ì ì í ë¹ìê° ìŽê²ì ìì¡Žíêž° ë묞ì
ëë€. nallocx
ë _by design_ ë°©ììŽë©° 첫 ë²ì§ž ê¶ì¥ ì¬íì
ëë€. jemallocì ê°ë°ìê° alloc_excess
ì±ë¥ê³Œ êŽë šíì¬ ì°ëŠ¬ë¥Œ ë§ë€ììµëë€. ìŽë¬í ížì¶ì ìžëŒìžíŽìŒíê³ C ìì±ì ì ëë¡ ì ííŽìŒ 컎íìŒë¬ê° ê·žë ì§ ìì ížì¶ ì¬ìŽížìì nallocx
ížì¶ì ì ê±°í©ëë€. C ë° C ++ 컎íìŒë¬ì²ëŒ Excess
ì¬ì©íììì€.
ì°ëŠ¬ë í ì ììµëë€ ê²œì°ìë Excess
APIë ì¬ì í íšì¹íì¬ ì ë¡ ë¹ì©ì ë§ë€ ì ììµëë€ jemalloc
API륌 (ëŽ ë
¹ LANG ìŽë¬í íšì¹ì ìŽêž° 구íì / jemalloc í¬í¬). API륌 ì§ì ì ì§íê±°ë ì
ì€ížëŠŒì ë°°ì¹ í ì ìì§ë§, ì
ì€ížëŠŒì ëë¬íë €ë©Ž ë€ë¥ž ìžìŽê° ìŽë¬í ìµì í륌 ìí í ì ìê³ Rustê° ìí í ììë ìŽì ì ëíŽ ì¢ì ì¬ë¡ë¥Œ ë§ë€ìŽìŒí©ëë€. ìŽ ìë¡ìŽ API ìëê° ë§€ì° ë¹ ë¥Žê³ ë³Žë€ì²ëŒ ìëë©Ž, ë ë€ë¥ž ìžìê° ììŽìŒí©ëë€ mallocx + nallocx
íìì± ìë ì¬ì©ì륌 ìíŽ Excess
.
ìŽê²ìŽ ë§€ì° ì€ìí êž°ë¥ìŽëŒë©Ž ì ì묎ë ê·žê²ì ì¬ì©íì§ ìììµëê¹?
귞걎 ì¢ì ì§ë¬žìŽìŒ. std::Vec
ë Excess
API륌 ì¬ì©íêž°ìí í¬ì€í° ìììŽì§ë§ íì¬ë ì¬ì©íì§ ììµëë€. "ìŽê²ìŽ Excess
ìì ëëœëììµëë€. API "ë ì ê° Vec
ì¬ì©íëë¡ ë§ë€ë €ê³ íìµëë€. Excess
API :
Excess
륌 ì í ë°ííì§ ìììµëë€ : https://github.com/rust-lang/rust/pull/45514grow_in_place_excess
ë° alloc_zeroed_excess
ì ê°ì êž°ë¥ìŽ ììµëë€.ì묎ëìŽ API륌 ì¬ì©íì§ ìë ìŽì 륌 ì ì ììµëë€. ê·žë¬ë std
ëŒìŽëžë¬ëŠ¬ì¡°ì°šë ë°ìŽí° 구조ì ì¬ì©í ì ìë€ë ì ì ê°ìí ë ( Vec
)ì ê°ì¥ ì í©í©ëë€. ì¶ìž¡íŽìŒíë€ë©Ž 죌ë ìŽì ë ë€ì곌 ê°ìµëë€. ìŽ APIë íì¬ ììëììµëë€.
ë ììží ì¶ìž¡íŽìŒíë€ë©ŽìŽ API륌 ì€ê³ í ì¬ëì¡°ì°šë ì¬ì©íì§ ììë€ê³ ë§í ì ììµëë€. ì£Œë¡ ëšìŒ std
컬ë ì
ìì ì¬ì©íì§ ìêž° ë묞ì
ëë€ (ìŽ APIê° ì²ìì í
ì€íž ë ê²ìŒë¡ ììíë ê³³ì
ëë€). , ëí _excess
ë° Excess
륌 ì¬ì©íì¬ usable_size
/ allocation_size
) ì믞íë ê²ì íë¡ê·žëšì ë§€ì° íŒë ì€ëœê±°ë ì±ê°ìêž° ë묞ì
ëë€.
ìŽë ìë§ë Excess
-less APIì ë ë§ì ìì
ìŽ í¬ì
ëìêž° ëë¬žìŒ ê²ì
ëë€. ë ê°ì APIê°ìë ê²œì° ëêž°í륌 ì ì§íêž° ìŽë µê³ ì¬ì©ìê° ë ë€ ë°ê²¬íê³ ìŽë€ ê²ì ì¬ì©íŽìŒíëì§ ìêž° ìŽë µìµëë€. ë§ì§ë§ìŒë¡ ì¬ì©ìê° ì¬ë°ë¥ž ìŒìíë ê²ë³Žë€ ížëŠ¬íšì ì ížíêž°ê° ìŽë µìµëë€.
ìŠ, ë ê°ì 겜ì APIê° ìê³ ìì ì 100 %륌 íëì ê°ì ì, ìì ì 0 %륌 ë€ë¥ž íëì ê°ì ì í¬ì íë€ë©Ž, íëê° ì€ì ë¡ í¬ê² ìëíê³ ìë€ë ê²°ë¡ ì ëë¬íë ê²ì ëëŒìŽ ìŒìŽ ìëëë€. ë€ë¥ž ê²ë³Žë€ ë«ìµëë€.
ëŽê° ì ììë í, ë€ìì Githubì jemalloc í
ì€íž ìžë¶ìì nallocx
ëí ì ìŒí ë ë²ì ížì¶ì
ëë€.
https://github.com/facebook/folly/blob/f2925b23df8d85ebca72d62a69f1282528c086de/folly/detail/ThreadLocalDetail.cpp#L182
https://github.com/louishust/mysql5.6.14_tokudb/blob/4897660dee3e8e340a1e6c8c597f3b2b7420654a/storage/tokudb/ft-index/ftcxx/malloc_utils.hpp#L91
ë ë€ íì¬ alloc_excess
APIì ë¹ì·íì§ ìì§ë§ í ë¹ í¬êž°ë¥Œ ê³ì°íêž° ì ì ë
늜íìŒë¡ ì¬ì©ë©ëë€.
Apache Arrowë 구íì nallocx
륌 ì¬ì©íë ë°©ë²ì ìŽíŽ 볎ìì§ë§ ì ëë¡ ìëíì§ ìë ê²ìŒë¡ ëíë¬ìµëë€.
https://issues.apache.org/jira/browse/ARROW-464
ìŽê²ë€ì Ʞ볞ì ìŒë¡ ëŽê° ì°Ÿì ììë nallocx
ëí ì ìŒí ì°žì¡°ì
ëë€. í ë¹ ì APIì ìŽêž° 구íìŽ ìŽë¬í 몚íží êž°ë¥ì ì§ìíë ê²ìŽ ì ì€ìíê°ì?
ëŽê° ì ììë í, ë€ìì Githubì jemalloc í ì€íž ìžë¶ìì nallocxì ëí ì ìŒí ë ë²ì ížì¶ì ëë€.
ëŽ ëšžëŠ¬ êŒëêž°ìì ëë ì ìŽë íìŽì€ ë¶ì ë²¡í° ì íìŽ íìŽì€ ë¶ì malloc 구í ( malloc ë° fbvector ì±ì¥ ì ì±
ì íµíŽ ì¬ì©íê³ ììì ìê³ ììµëë€. ìŽë íìŽì€ ë¶ìì C ++ 벡í°ì í° ë©ìŽëŠ¬ê° ìŽê²ì ì¬ì©í©ëë€) ê·žëŠ¬ê³ ì±íìŽ 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ê° ê³Œëíì§ ìì êŽë š êž°ë¥ì ëììžì í° ìí¥ì ë¯žì¹ ê²ìŒë¡ ììí©ëë€. ìì í ì ê±°ë©ëë€.
ê·žë¬ë©Ž ëêž°íëì§ ìì ë ê°ì APIê° ìê³ ìŽê³Œ APIê° ê³Œëíì§ ìì APIë³Žë€ êž°ë¥ìŽ ì ì íì¬ ìí©ì ë°©ì§ í ì ììµëë€. 곌ëíê² ê°ë ì°¬ API ìì 곌ëíì§ ìì API륌 ë¹ë í ì ìì§ë§ ê·ž ë°ëë ì¬ì€ìŽ ìëëë€.
Excess
륌 ë²ëŠ¬ê³ ì¶ì ì¬ëì ê·žë¥ ë²ë €ìŒí©ëë€.
ëª
ííê² ë§íë©Ž, ìŽì ë²ì 곌 ížíëë ë°©ììŒë¡ ì¬ì€ ë€ì alloc_excess
ë©ìë륌 ì¶ê°íë ë°©ë²ìŽ ìë€ë©Ž êŽì°®ìê¹ì? (ë¬Œë¡ alloc_excess
ììŽ ìì ííë€ë ê²ì ëì€ì ì¶ê°íë ê²ìŽ í° ë³íê° ë ê²ìŽëŒë ê²ì ì믞í©ëë€. ì ë ê·íì ì¶ë¡ ì ìŽíŽíëë¡ ìì²íë ê²ì
ëë€.)
@joshlf ê·žë ê²íë ê²ì ë§€ì° ê°ëší©ëë€.
: bell : ì§êžì ì ì ì ë°ëŒ ìµì¢ ëêž êž°ê°ì ì ë ¥í©ëë€ . :벚:
Excess륌 ë²ëŠ¬ê³ ì¶ì ì¬ëì ê·žë¥ ë²ë €ìŒí©ëë€.
ëë ìŽê³Œ ì©ëì êŽì¬ìŽìë 0.01 %ì ì¬ëë€ìŽ ë€ë¥ž ë°©ë²ì ì¬ì©í ì ììµëë€.
@sfackler ìŽê²ì ë ¹ìì 2 죌ê°ì íŽìì ì·ší 결곌ì ëë€-Ʞ볞 ë©ìë impls륌 ììŽ ë²ë žìµëë€. :)
ëë ìŽê³Œ ì©ëì êŽì¬ìŽìë 0.01 %ì ì¬ëë€ìŽ ë€ë¥ž ë°©ë²ì ì¬ì©í ì ììµëë€.
ìŽ ë²ížë ìŽëì ì»ëì?
ëŽ ëªšë Rust ë°ìŽí° 구조ë ë©ëªšëŠ¬ìì ííí©ëë€. ê·žë ê² í ììë ë¥ë ¥ìŽ ëŽê° Rust륌 ì¬ì©íë ì ìŒí ìŽì ì
ëë€. 몚ë ê²ì Box í ì ìë€ë©Ž ë€ë¥ž ìžìŽë¥Œ ì¬ì©í ê²ì
ëë€. ê·žëì ì ë Excess
ì 0.01%
ì ëíŽ ì 겜 ì°ì§ ìê³ íì ì 겜 ìëë€.
ëë ìŽê²ìŽ ëë©ìžì ë°ëŒ ë€ë¥Žë©° ë€ë¥ž ëë©ìžììë ì¬ëë€ìŽ Excess
ì ëíŽ ì í ì 겜 ì°ì§ ìì ê²ìŽëŒë ê²ì ìŽíŽíì§ë§, Rust ì¬ì©ìì 0.01 %ë§ìŽ ìŽê²ì ëíŽ ì 겜 ì°ë ê² ê°ì§ ììµëë€ (ë§ì ì¬ëë€ìŽ Vec
ì¬ì©íšì ì믞í©ëë€) String
, ìŽë Excess
ì í¬ì€í°-íì ë°ìŽí° 구조ì
ëë€.
ëë mallocì ì¬ì©íë ê²ë€ì ë¹íŽ nallocx륌 ì¬ì©íë ìŽ 4 ê°ì§ê° ìë€ë ì¬ì€ìì ê·ž ì«ì륌 ì»ê³ ììµëë€.
ë¿¡ë¿¡
ì²ìë¶í° "ì¬ë°ë¥Žê²"íë€ë©Ž fn alloc(layout) -> (ptr, excess)
ìê³ fn alloc(layout) -> ptr
ë ì í ìì ê²ìŽëŒê³ ì ì íëê°? ê·žê²ì ëìê² ëª
ë°±íì§ ìì ê² ê°ìµëë€. ìŽê³Œê° ì¬ì© ê°ë¥íëëŒë alloc_excess(layout).0
ë¡ êµ¬í ëëëŒë ìŽê³Œê° ì€ìíì§ ìì ì¬ì© ì¬ë¡ (ì : ëë¶ë¶ì ížëŠ¬ 구조)륌 ìíŽ íìì API륌 ì¬ì©íë ê²ìŽ ìì°ì€ë¬ì 볎ì
ëë€.
ë¿¡ë¿¡
ê·žê²ì ëìê² ëª ë°±íì§ ìì ê² ê°ìµëë€. ìŽê³Œê° ì¬ì© ê°ë¥íëëŒë ìŽê³Œê° ì€ìíì§ ìì ì¬ì© ì¬ë¡ (ì : ëë¶ë¶ì ížëŠ¬ 구조)륌 ìíŽ íìì API륌 ì¬ì©íë ê²ì ë¹ì°í ê² ê°ìµëë€. ìŽë alloc_excess (layout) .0ìŒë¡ 구í ë 겜ì°ìë ë§ì°¬ê°ì§ì ëë€.
íì¬, 곌ì-í APIë 곌ì-ì ì API ìì 구íë©ëë€. ìŽê³Œíì§ ìë í ë¹ì륌 ìíŽ Alloc
륌 구ííë €ë©Ž ì¬ì©ìê° alloc
ë° dealloc
ë©ìë륌 ì ê³µíŽìŒí©ëë€.
ê·žë¬ë 곌ëíê² ê°ë ì°¬ í ë¹ ìì ëíŽ Alloc
륌 구ííë €ë©Ž ë ë§ì ë©ìë륌 ì ê³µíŽìŒí©ëë€ (ìµì alloc_excess
,íì§ë§ realloc_excess
ë¡ ìŽëíë©Ž 컀ì§ëë€. alloc_zeroed_excess
, grow_in_place_excess
, ...).
ë€ë¥ž ë°©ë²ìŒë¡íë©Ž, ìŠ, 곌ëíê² ê°ë ì°¬ API ìì 곌ëíì§ ìì API륌 구í í ë€ì alloc_excess
ë° dealloc
충ë¶í©ëë€. ë ê°ì§ ì íì í ë¹ ì.
ì 겜 ì°ì§ ìê±°ë ìŽê³Œë¶ì ë°ííê±°ë ì§ì í ììë ì¬ì©ìë ì ë ¥ í¬êž° ë ë ìŽììì ë°í í ì ìì§ë§ (ìì ë¶íž íš), ìŽê³Œë¶ì ì²ëŠ¬ í ì ââìê³ ì²ëŠ¬íë €ë ì¬ì©ìë 구íí íìê° ììµëë€. ë ë§ì ë°©ë².
ë¿¡ë¿¡
ëë mallocì ì¬ì©íë ê²ë€ì ë¹íŽ nallocx륌 ì¬ì©íë ìŽ 4 ê°ì§ê° ìë€ë ì¬ì€ìì ê·ž ì«ì륌 ì»ê³ ììµëë€.
Rust ìíê³ìì _excess
ì¬ì©ì ëí ë€ì ì¬ì€ì ê°ìí ë :
_excess
_excess
ë rust std ëŒìŽëžë¬ëŠ¬ìì Vec
ë° String
ì¡°ì°šë rust std
ëŒìŽëžë¬ëŠ¬ìì _excess
API륌 ì ëë¡ ì¬ì©í ì ììµëë€._excess
APIë ë¶ìì íê³ ê³Œëíì§ ìì APIì ëêž°íëì§ ìììŒë©° ìµê·Œê¹ì§ ë²ê·žê° ë°ìíìµëë€ ( excess
ë ë°ííì§ ìì ì) ...
ë€ë¥ž ìžìŽìì _excess
ì¬ì©ì ëí ë€ì ì¬ì€ì ê³ ë €íë©Ž :
jemallocì APIë ìŽì ë²ì 곌ì ížíì±ìŒë¡ ìžíŽ C ëë C ++ íë¡ê·žëšìì Ʞ볞ì ìŒë¡ ì§ìëì§ ììµëë€.
ìŽ ë ê°ì§ 죌ì¥ì ëìê² ê·žëŽë¯ íŽ ë³Žìžë€.
excess
ìì API std
ê·žë¬ë¯ë¡, ì¬ì©í ì ììµëë€ std
ë ë
¹ ìíê³ìì í ë²ë ì¬ì©íì§ ìë ìŽì ì
ëë€, ëŒìŽëžë¬ëŠ¬ë¥Œ ì¬ì©í ì ììµëë€, ë°ëŒì ì묎ë ìº .ë¹ì ì ì£Œì¥ :
_excess
API륌 ì¬ì©íì§ ìêž° ë묞ì 0.01 %ì ì¬ëë€ ë§ìŽ êŽì¬ì ê°ê³ ììµëë€.íì§ ììµëë€.
@alexcrichton -> Result<*mut u8, AllocErr>
ìì -> *mut void
ë¡ ì ííêž°ë¡ í ê²°ì ì í ë¹ ì RFCì ìë ê°ë°ì ë°ë¥Žë ì¬ëë€ìê² í° ëëŒììŒë¡ ë€ê°ì¬ ì ììµëë€.
ëë ë¹ì ì ì ìì ëìíì§ ìì§ë§, ê·žëŒìë ë¶êµ¬íê³ ìë¹ìì ì¬ëë€ìŽ nullì ëì¹ ê°ë¥ì±ìŽ ëìì§ ê²ë³Žë€ Result
ì "묎거ì"ìŒë¡ ìŽêž°ë¥Œ ìíì ê² ê°ìë€. ë°í ë ê°ì íìžíììì€.
ì°ëŠ¬ê° ê·ž ìì²Žë¡ ëŠì ë³íì ëí ê°ìì±ì ìŠê° ì»ì ììë ëª ê°ì§ ë°©ë²ìŽ ìëì?
í ê°ì§ ë°©ë² (ëŽ ëšžëŠ¬ êŒëêž°ìì ë²ìŽëš) : ë§ì€í° ëžëì¹ìì ì첎 PRë¡ ìëª
ì ë³ê²œ íê³ Allocator
ë ì¬ì í ë¶ìì í©ëë€. ê·žëŠ¬ê³ ëê° PRì ëíŽ ë¶ííëì§ (ê·žëŠ¬ê³ ëê° ì¶ííëì§!)
ë°í ì¬ë¶ì 죌ì ì *mut void
ëë ë°ííë Result<*mut void, AllocErr>
: ê·žê²ì ê°ë¥í ë
Œì ë ë°ì ê°ìŽ ì°ëŠ¬ë "ë®ì ìì€"í ë¹ í¹ì±ì ë³ëì 'ëì ìì€'ì ììŽëìŽë¥Œ ì¬ ë°©ë¬ž í ê²ì í ë¹ ì RFCì II .
(ë¶ëª
í *mut void
ë°í ê°ì ëíŽ ì¬ê°í ìŽìê° ìë€ë©Ž fcpbotì íµíŽ ì°ë € ì¬íìŒë¡ ì ì¶í ê²ì
ëë€. ê·žë¬ëìŽ ìì ìì ì ë libs íì íëšì ê±°ì ì 뢰íê³ ììµëë€. ìŽ í ë¹ ì ì¬ê°ì ëí íŒë¡ë¡ ìžíŽ ìŒë¶ ë¶ë¶.)
ë¿¡ë¿¡
-> Result<*mut u8, AllocErr>
ìì-> *mut void
ë¡ ì ííêž°ë¡ í ê²°ì ì í ë¹ ì RFCì ìë ê°ë°ì ë°ë¥Žë ì¬ëë€ìê² í° ëëŒììŽ ë ì ììµëë€.
íìë ë
Œìíë¯ìŽ ì°ëŠ¬ê° íííê³ ìíë ì ìŒí ì€ë¥ë OOMìŽëŒë ê²ì ì믞í©ëë€. ë°ëŒì ì€ìë¡ ìží ì€ë¥ íìž ì€íšì ëí 볎ížì ìŽì ìŽìë ìœê° ë ê°ë²ŒìŽ ì€ê° í¬êž°ë -> Option<*mut void>
ì
ëë€.
ë¿¡ë¿¡
stdì ìŽê³Œ APIë ì¬ì©í ì ììŒë¯ë¡ std ëŒìŽëžë¬ëŠ¬ê° ì¬ì©í ì ììŒë¯ë¡ ì묎ë ì¬ì©í ì ìêž° ë묞ì Rust ìíê³ìì í ë²ë ì¬ì©ëì§ ììµëë€.
ê·žëŒ ê°ì ê³ ì¹ìžì.
ë¿¡ë¿¡
mut void 륌 ë°íí ì§ ìëë©Ž < mut void, AllocErr> : take IIìì ë Œì ë ê²ì²ëŒ ë³ëì "ê³ ìì€"ë° "ì ìì€"í ë¹ ì í¹ì±ì ëí ììŽëìŽë¥Œ ë€ì ê²í íŽìŒ í ê°ë¥ì±ìŽ ììµëë€. í ë¹ ì RFCì.
ê³ ìì€ APIê° alloc_one
, alloc_array
ë±ìŒë¡ Alloc
ì첎ììì ê²ìŽëŒë ì ì ì ìžíë©Ž Ʞ볞ì ìŒë¡ ì°ëŠ¬ì ìê°ìŽììµëë€. ìíê³ìì íì¥ìŒë¡ 뚌ì ê°ë°í ìë ììµëë€. ì¬ëë€ìŽ ìŽë€ APIì ìë Žíëì§ íìží©ëë€.
ë¿¡ë¿¡
ëŽê° Layoutì Copyê° ìë Clone ë§ êµ¬ííëë¡ ë§ë ìŽì ë Layout ì íì ë ë§ì 구조륌 ì¶ê° í ììë ê°ë¥ì±ì ìŽìŽëê³ ì¶ì êž° ë묞ì ëë€. í¹í, ë ìŽìììŽ ê·žê²ì 구ì±íë ë° ì¬ì©ëë 몚ë ì í 구조 (ì : 16 ë°°ìŽì struct {x : u8, y : [char; 215]})륌 ì¶ì íë €ê³ ìëíì¬ í ë¹ìê° íì¬ ìœí ìž ê° ìŽë€ ì íìì ìì±ëëì§ë³Žê³ íë ê³ìž¡ 룚íŽì ë žì¶íë ìµì ì ëë€.
ìŽê²ìŽ ìŽëê°ìì ì€í ëììµëê¹?
@sfackler ìŽë¯ž ëë¶ë¶ì ìì
ì ìííìŒë©° ë³µì ë APIë¡ ëªšë ìì
ì ìí í ì ììµëë€ (곌ì + _excess
ë©ìë ìì). ì§êžì ë ê°ì APIê° ìê³ ìì í _excess
APIê° ììŽë êŽì°®ìµëë€.
ì¬ì í ë륌 ê±±ì íë ì ìŒí ê²ì í ë¹ì륌 구ííë €ë©Ž alloc + dealloc
륌 구ííŽìŒíì§ë§ alloc_excess + dealloc
ë ìëíŽìŒíë€ë ê²ì
ëë€. ëì€ì alloc_excess
ìž¡ë©Žìì alloc
ì Ʞ볞 구íì ì ê³µ í ì ììµëê¹? ìëë©Ž ë¶ê°ë¥íê±°ë 죌ì ë³ê²œ ì¬íì
ëê¹? ì€ì ë¡ ëë¶ë¶ì í ë¹ìë ìŽìšë ëë¶ë¶ì ë©ìë륌 구íí ê²ìŽë¯ë¡ ìŽê²ì í° ë¬žì ë ìëì§ë§ ìì곌 ë¹ì·í©ëë€.
jemallocator
ë Alloc
ë ë² êµ¬íí©ëë€ ( Jemalloc
ë° &Jemalloc
). ì¬êž°ì method
ëí Jemalloc
구íì ë€ì곌 ê°ìµëë€. &Jemalloc
구íì ë©ìë ížì¶ì ì ë¬íë (&*self).method(...)
ìŠ, Alloc
ëíŽ Jemalloc
Alloc
ì ë 구íì 몚ë ìëìŒë¡ ëêž°ííŽìŒí©ëë€. &/_
구íì ëíŽ ë€ë¥ž ëìì ì»ë ê²ìŽ ë¹ê·¹ì ìŒ ì ìëì§ ì¬ë¶ë ëªšë¥Žê² ìµëë€.
ì¬ëë€ìŽ ì€ì ë¡ Alloc
í¹ì±ìŒë¡ ì€ì ë¡ ë¬Žììíê³ ìëì§ ììëŽë ê²ìŽ ë§€ì° ìŽë µë€ë ê²ì ìê²ëììµëë€. ëŽê° ê·žê²ì ì¬ì©íë ì ìŒí íë¡ì ížë ìŽìšë (ì볎, ì°í íì) ìŒê° ì¬ì©ì ì ì§íê³ êžë¡ë² í ë¹ì륌 ë³ê²œíë ë°ë§ ì¬ì©í©ëë€. 컬ë ì
ì í ë§€ê° ë³ìë¡ ì¬ì©íë íë¡ì ížë¥Œ ì°Ÿì ì ìë€ë ê²ìŽ ë§ìŽ ê±±ì ë©ëë€ (ìë§ë ìŽìŽ ì¢ì§ ììê³ ìŒë¶ê° ììµëê¹?). í¹í Vec
-like ì í ìì SmallVec
ë° ArrayVec
구í ìì 륌 ì°Ÿê³ ìììµëë€ ( std::Vec
ìë Alloc
ê° ììŒë¯ë¡ Vec
sì ë€ë¥ž Alloc
ator) ê°ì ë³µì ê° ìŽë»ê² ìëíëì§ ê¶êží©ëë€ ( Box
ë³µì ìë ëìŒíê² ì ì©ëš) Alloc
). ìŽë¬í 구íìŽ ìŽëê°ì ìŽë»ê² 볎ìŽëì§ì ëí ìê° ììµëê¹?
ëŽê° ê·žê²ì ì¬ì©íë ì ìŒí íë¡ì ížë ìŽìšë ë°€ë§ë€ ì¬ì©íê² ë ê²ì ëë€ (ì볎, ì°í íì)
ê·žë§í ê°ì¹ë¥Œ ìíŽ Servoë ê°ë¥í ê²œì° ë¶ìì í êž°ë¥ìì ë²ìŽëë €ê³ ë žë ¥íê³ ììµëë€ : https://github.com/servo/servo/issues/5286
ìŽê²ì ëí ëê³ êž°ì ë¬ê± 묞ì ì
ëë€. ë§ì íë¡ì ížë ìì§ ë¶ìì íêž° ë묞ì Alloc
ì¬ì©íì§ ììµëë€.
ì ìŽì _excess API륌 ìì í 볎ìíŽìŒíë ìŽì ê° ëª ííì§ ììµëë€. ìëë jemallocì ì€íì ìž * allocm API륌 ë°ìíêž° ìíŽ ì¡Žì¬íì§ë§ ì 첎 API íë©Žì ë³µì íì§ ìêž° ìíŽ ëª ë ì 4.0ìì ì ê±°ëììµëë€. ì°ëŠ¬ê° ê·žë€ì 늬ë륌 ë°ë¥Œ ììì ê² ê°ìµëê¹?
ëì€ì alloc_excess ìž¡ë©Žìì allocì ââꞰ볞 구íì ì ê³µ í ì ììµëê¹? ìëë©Ž ë¶ê°ë¥íê±°ë 죌ì ë³ê²œ ì¬íì ëê¹?
alloc_excess
ìž¡ë©Žìì alloc
ì Ʞ볞 구íì ì¶ê° í ì ìì§ë§ alloc_excess
ìë alloc
ìž¡ë©Žìì Ʞ볞 구íìŽ ììŽìŒí©ëë€. íë ëë ë ë€ë¥Œ 구ííë©Ž 몚ë ê²ìŽ ì ìëíì§ë§ ë ì€ íë륌 구ííì§ ììŒë©Ž ìœëê° ì»ŽíìŒëì§ë§ 묎í ë°ë³µë©ëë€. ìŽê²ì ìŽì ì (ìë§ë Rand
?ì ëí ê²ì
ëë€), ì°ëŠ¬ë ë¹ì ìŽ ê·ž íšìë€ ì€ ì ìŽë íë륌 구ííŽìŒíë€ê³ ë§í ììë ë°©ë²ì ê°ì§ ì ìì§ë§ ì°ëŠ¬ë ìŽë€ ê²ì ì 겜 ì°ì§ ììµëë€.
컬ë ì ì í ë§€ê° ë³ìë¡ ì¬ì©íë íë¡ì ížë¥Œ ì°Ÿì ì ìë€ë ê²ìŽ ë§ìŽ ê±±ì ë©ëë€ (ìë§ë ìŽìŽ ì¢ì§ ììê³ ìŒë¶ê° ììµëê¹?).
ëë ê·žë° ìŒìíë ì¬ëì ëªšëŠ ëë€.
ëŽê° ê·žê²ì ì¬ì©íë ì ìŒí íë¡ì ížë ìŽìšë ë°€ë§ë€ ì¬ì©íê² ë ê²ì ëë€ (ì볎, ì°í íì)
ìŽê²ìŽ ììŒë¡ ëìê°ë ê²ì ë§ë í ê°ì§ í° ì ì stdlib 컬ë ì
ìŽ ìì§ íëŒ ë©ížëŠ í ë¹ì륌 ì§ìíì§ ìëë€ë ê²ì
ëë€. ëë¶ë¶ì ìžë¶ 컬ë ì
ì ëŽë¶ 컬ë ì
( Box
, Vec
ë±)ì ì¬ì©íêž° ë묞ì ëë¶ë¶ì ë€ë¥ž ììë ì ìžë©ëë€.
ëŽê° ê·žê²ì ì¬ì©íë ì ìŒí íë¡ì ížë ìŽìšë ë°€ë§ë€ ì¬ì©íê² ë ê²ì ëë€ (ì볎, ì°í íì)
ìŽê²ìŽ ììŒë¡ ëìê°ë ê²ì ë§ë í ê°ì§ í° ì ì 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
ìíŽ ë§€ê° ë³ìíëëë¡íê³ ì¶ìµëë€.
ë¿¡ë¿¡
ì ìŽì _excess API륌 ìì í 볎ìíŽìŒíë ìŽì ê° ëª ííì§ ììµëë€. ìëë jemallocì ì€íì ìž * allocm API륌 ë°ìíêž° ìíŽ ì¡Žì¬íì§ë§ ì 첎 API íë©Žì ë³µì íì§ ìêž° ìíŽ ëª ë ì 4.0ìì ì ê±°ëììµëë€. ì°ëŠ¬ê° ê·žë€ì 늬ë륌 ë°ë¥Œ ììì ê² ê°ìµëê¹?
íì¬ shrink_in_place
ë ì€ì í ë¹ í¬êž°ë¥Œ ë°ííë xallocx
륌 ížì¶í©ëë€. shrink_in_place_excess
ìŽ ì¡Žì¬íì§ ìêž° ë묞ììŽ í¬êž°ë¥Œ ë²ëŠ¬ê³ ì¬ì©ìë nallocx
륌 ížì¶íì¬ ì¬ ê³ì°íŽìŒí©ëë€. ë¹ì©ì í ë¹ í¬êž°ì ë°ëŒ ë¬ëŒì§ëë€.
ë°ëŒì ì°ëŠ¬ê° ìŽë¯ž ì¬ì©íê³ ìë ì ìŽë ìŒë¶ jemalloc í ë¹ íšìê° ì¬ì© ê°ë¥í í¬êž°ë¥Œ ë°ííê³ ìì§ë§ íì¬ APIììëìŽë¥Œ ì¬ì©í ì ììµëë€.
ë¿¡ë¿¡
ì¥ëê° ì»€ëì ìì í ë í ë¹ìê° ì€ì ë ëê¹ì§ í ë¹ìŽ ë°ìíì§ ìëë¡ êžë¡ë² í ë¹ì륌 íŒíë ê²ë ì ì 목íììµëë€. ëŽê° í ì¬ëìŽ ìëëŒë ììì ë£ê²ëìŽ êž°ì©ëë€!
Ʞ볞 ì ì í ë¹ ìì Heap
ëŒë ëšìŽê° ë§ìì ë€ì§ ììµëë€. Default
ìë ìŽì ë 묎ìì
ëê¹?
ë ë€ë¥ž ì€ëª
: RFC 1974ë ìŽ ëªšë ê²ì std::alloc
ë§ íì¬ std::heap
ììµëë€. ìì í륌 ìíŽ ìŽë€ ìì¹ê° ì ìëê³ ììµëê¹?
@jethrogb "Heap"ì "mallocìŽ í¬ìží°ë¥Œ ì ê³µíë ê²"ì ëí ꜀ ì ì ì©ìŽì ëë€.ìŽ ì©ìŽì ëíŽ ì°ë €íë ì ì 묎ìì ëê¹?
ë¿¡ë¿¡
"mallocìŽ ë¹ì ìê² í¬ìží°ë¥Œ ì ê³µíë ê²"
ëŽ ë§ì ììì ê·žê²ìŽ System
ê²ì ì ìžíê³ .
ì ë¬Œë¡ ì
ëë€. Global
ë ë€ë¥ž ìŽëŠìŒê¹ì? #[global_allocator]
륌 ì¬ì©íì¬ ì ííêž° ë묞ì
ëë€.
ì¬ë¬ í í ë¹ìê°ìì ì ììµëë€ (ì : libc ë° ì ëì¬ jemalloc). std::heap::Heap
ì std::heap::Default
, #[global_allocator]
ì #[default_allocator]
ë°êŸžë ê²ì ìŽë»ìµëê¹?
ë¬ëŠ¬ ì§ì íì§ ììŒë©Ž ì»ì ì ìë€ë ì¬ì€ (ì륌 ë€ìŽ Vec
ê° í ë¹ ìì ëí ì¶ê° ì í ë§€ê° ë³ì / íë륌 ì»ë 겜ì°)ìŽ "per"ê° ìë€ë ì¬ì€ë³Žë€ ë ì€ìí©ëë€. -instances "ìí (ëë ì€ì ë¡ ìžì€íŽì€).
ìŽì ìµì¢ ëêž êž°ê°ìŽ ìë£ëììµëë€.
FCPì êŽë šíì¬ ìì í륌 ìíŽ ì ì ë API ë¶ë¶ ì§í©ì ë§€ì° ì íì ìŒë¡ ì¬ì©ëë€ê³ ìê°í©ëë€. ì륌 ë€ìŽ jemallocator
ììë ì§ìíì§ ììµëë€.
ìŽë€ ë°©ììŒë¡? jemallocatorë êž°ë¥ íëê·ž ë€ììë ë¶ìì í ë©ìëì ìŒë¶ë¥Œ íìíŽìŒ í ìë ìì§ë§ ê·žê² ì ë¶ì ëë€.
ê²œì° jemallocator
ë
¹ ì륌 ë€ìŽ 구íí ì ììµëë€ ìì ì Alloc::realloc
ížì¶íì¬ je_rallocx
Ʞ볞 ALLOCì ìì¡Žíì§ë§, ì구, ë€ìì ëí íì© ë첎 +ì dealloc IMPL ìëë€ ë³µì¬ + íì€ ëìêŽì alloc_jemalloc
ìì IMO.
ë¬Œë¡ , ë¹ì ì 컎íìŒ ëê°ë¥Œ ì»ì ì ìì§ë§, í¹í ì ì©í ê²ì ìëë€.
ì? C ++ë í ë¹ ì APIì ì í ì¬ í ë¹ ê°ë ìŽ ììŒë©° ìžìŽë¥Œ ìììí€ì§ ìë ê² ê°ìµëë€. ë¶ëª í ìŽìì ìŽì§ë ìì§ë§ ì ë°ì ë€ìŒ ì ìëì§ ìŽíŽí ì ììµëë€.
C ++ 컬ë ì ì ìŒë°ì ìŒë¡ reallocì ì¬ì©íì§ ììµëë€. C ++ ìŽë ìì±ìë reallocìŽ ì ì©íì§ ìêž° ë묞ì ììì ìœë륌 ì€íí ì ìêž° ë묞ì ëë€.
ê·žëŠ¬ê³ ë¹êµë C ++ê° ìëëŒ ëŽì¥ ë jemalloc ì§ììŽìë íì¬ Rust íì€ ëŒìŽëžë¬ëŠ¬ì ë¹êµë©ëë€. Alloc
APIììŽ íì ì§í© ë§ ì¬ì©íì¬ íì€ì ë²ìŽë í ë¹ ìë¡ ì ííë ê²ì íê·ì
ëë€.
ê·žëŠ¬ê³ realloc
ê° ìì
ëë€. jemallocatorë íì¬ alloc_zeroed
, alloc_excess
, usable_size
, grow_in_place
ë±ì 구íí©ëë€.
alloc_zeroedë ìì íëëë¡ ì ìëììµëë€. ëŽê° ë§í ììë í (look upthread), 묞ì ê·žëë¡ alloc_excess
ì ì¡Žì¬íì§ ììµëë€. Ʞ볞 구íìŒë¡ ëì ê°ë©Ž íê·íë ìœë륌 볎ì¬ì€ ì ììµëê¹?
ê·žë¬ë ë ìŒë°ì ìŒë¡, ìŽê²ìŽ ìŽë¬í APIì ìŒë¶ë¥Œ ìì ííë ê²ì ë°ëíë ìŽì 륌 ì ì ììµëë€. jemallocator륌 ì¬ì©íì§ ììŒë €ë©Ž ê³ì ì¬ì©í ì ììµëë€.
Layout::array<T>()
const fnìŒë¡ ë§ë€ ì ììµëê¹?
ë¹ì¥ì ë¹í© í ì ììµëë€.
ë¹ì¥ì ë¹í© í ì ììµëë€.
ìê² ìµëë€ ... Layout::<T>::repeat(1).0
ììíë ë¹í©ì€ëœì§ ìì const fn Layout::array_elem<T>()
í©ëë€.
@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) ì
ì¢ìì, êµ¬ì¡°ì²Žê° ì ë ¬ì íšë© ë ê²ìŒë¡ ë°íì¡ì§ë§ AFAIK ìŽê²ì #[repr(C)]
ì ìžíê³ ë ìì ì ìž ë³Žì¥ìŽ ìëëë€.
ìŽìšë Layout::new
ì const fnìŒë¡ ë§ëë ê²ë íì í ê²ì
ëë€.
ìŽê²ì ìì ë íšìì 묞ìí ë (ë°ëŒì ë³Žì¥ ë) ëìì ëë€.
https://doc.rust-lang.org/std/mem/fn.size_of.html
ì íì í¬êž°ë¥Œ ë°ìŽíž ëšìë¡ ë°íí©ëë€.
ë³Žë€ êµ¬ì²Žì ìŒë¡ ìŽê²ì ì ë ¬ íšë©ì í¬íšíì¬ íŽë¹ í목 ì íìŽìë ë°°ìŽì ì°ì ìì ì¬ìŽì ë°ìŽíž ëšì ì€íì ì ëë€. ë°ëŒì 몚ë ì í
T
ë° êžžìŽn
겜ì°[T; n]
ì í¬êž°ën * size_of::<T>()
ì ëë€.
ê°ì¬. Layout::new
ì 결곌륌 ê³±íë 몚ë const fnì 볞ì§ì ìŒë¡ ì°šë¡ë¡ ë¹í© í ê²ìŽëŒë ê²ì 깚ë¬ììŒë¯ë¡ ( saturating_mul
ëë ìŒë¶ë¡ ìííì§ ìë í) ë€ì ìì ìŒë¡ ëì ììµëë€. const fn ì¶ì 묞ì ì íšëì ëí ì§ë¬žì ê³ìí©ëë€.
panic!()
맀í¬ë¡ë íì¬ ìì ííììì ì§ìëì§ ìì§ë§ íìž ë ì°ì ì íšëì 컎íìŒë¬ì ìíŽ ìì±ëë©° íŽë¹ ì íì ìí¥ìë°ì§ ììµëë€.
error[E0080]: constant evaluation error
--> a.rs:1:16
|
1 | const A: i32 = i32::max_value() * 2;
| ^^^^^^^^^^^^^^^^^^^^ attempt to multiply with overflow
error: aborting due to previous error
ìŽê²ì Alloc::realloc
ì êŽë šìŽ ìì§ë§ ìµì ìží°íìŽì€ì ìì íìë êŽë šìŽ ììµëë€ ( realloc
ë ìŒë¶ê° ìë).
íì¬ ë묞ì Vec::reserve/double
ížì¶ RawVec::reserve/double
íë ížì¶ Alloc::realloc
ì Ʞ볞 IMPL Alloc::realloc
ë³µì¬í©ëë€ (죜ì ë²¡í° ìì [len(), capacity())
ë²ì) . capacity() + 1
ìì륌 ìœì
íì¬ ì¬ í ë¹íë €ë ê±°ëí ë¹ ë²¡í°ì í°ë¬Žëìë 겜ì°ì 몚ë ë©ëªšëŠ¬ë¥Œ 걎 ë늬ë ë° ëë ë¹ì©ì ì€ìíì§ ììµëë€.
ìŽë¡ ì ìŒë¡ Ʞ볞 Alloc::realloc
구íë "bytes_used"ë²ì륌 ì¬ì©íë ê²œì° ì¬ í ë¹ì êŽë š ë¶ë¶ ë§ ë³µì¬ í ì ììµëë€. ì€ì ë¡ ì ìŽë jemallocì Alloc::realloc
ížì¶ë¡ rallocx
Alloc::realloc
Ʞ볞 implì ì¬ì ìí©ëë€. êŽë š ë©ëªšëŠ¬ ë§ ë³µì¬íë alloc
/ dealloc
ëì€ë¥Œíë ê²ìŽ rallocx
ížì¶ë³Žë€ ë¹ ë¥Žê±°ë ë늰 ì§ ì¬ë¶ë ìë§ë ì¬ë¬ ê°ì§ì ë¬ë €ìì ê²ì
ëë€ ( rallocx
ì ì늬ìì ëžë¡ì íì¥íë €ë©Ž ìŒë§ë ë§ì ë¶íìí ë©ëªšëŠ¬ë¥Œ rallocx
ë³µì¬í ê¹ì? ë±).
https://github.com/QuiltOS/rust/tree/allocator-error ì ë êŽë š ì€ë¥ ì íìŽ ìŒë°í ì첎륌 ìííì¬ ì»¬ë ì ë° ì€ë¥ ì²ëŠ¬ 묞ì 륌 íŽê²°íë€ê³ ìê°íë ë°©ë²ì 볎ì¬ì£Œêž° ììíìµëë€. í¹í 몚ëìì ëŽê° ìŽë»ê² ë³ê²œíëì§ ì£Œëª©íììì€.
Result<T, A::Err>
ì ëí 구í T
구íunwrap
ëë êž°í ë¶ë¶ì oom(e)
ìžë¶íì§ AbortAdapter
.ìŽê²ì ëŽê° ë§ëë ë³ê²œìŽ ë§€ì° ìì íê³ ë¬Žì믞íë€ë ê²ì ì믞í©ëë€! ì€ë¥ ë°í ë° ì€ë¥ ì€ëšì 몚ë ì²ëŠ¬íë €ë©Ž ì ì ì ë¶ë³ì±ì ì ì§íêž° ìíŽ ì¶ê° ë žë ¥ìŽ íìíì§ ìììŒí©ëë€. ì í ê²ì¬êž°ê° 몚ë ìì ì ìíí©ëë€.
ëë êž°ìµíë€ --- @Gankro ì RFCìì ìê° íëê°? ëë pre-rfc ì€ë ë --- Gecko / Servo ì¬ëë€ì 컬ë ì
ì ì€ë¥ë¥Œ ìì ì ì íì í¬íšìí€ì§ ìë ê²ìŽ ì¢ìë€ê³ ë§íìµëë€. ì, #[repr(transparent)]
륌 AbortAdapter
íì¬ ì»¬ë ì
ì Foo<T, A>
ìì Foo<T, AbortAdapter<A>>
(ìì ëíŒ ëŽìì)ê°ì ìì íê² ë³ííì¬ ìì ë¡ê² ì¬ì©í ì ìëë¡ í ì ììµëë€. 몚ë ë°©ë²ì ë³µì íì§ ìê³ ìë€ë¡ ì íí©ëë€. [back-compatì ê²œì° íì€ ëŒìŽëžë¬ëŠ¬ 컬ë ì
ì 몚ë ìŽë²€ížìì ë³µì ëìŽìŒíì§ë§ ì¬ì©ì ë©ìëê° Result<T, !>
ìŒ íìë ììµëë€. ììŠìë ìì
íêž°ê° ë§€ì° ìœìµëë€.]
ë¶ííë ìœëë lang í목 (ìì)ì ì í ë§€ê° ë³ì륌 ë³ê²œíë©Ž 컎íìŒë¬ë¥Œ íŒëíêž° ë묞ì ìì í ì í ê²ì¬ê°ëì§ ììµëë€ (ëëìµëë€!). ICE륌 ì ë°íë ë°ì€ 컀ë°ì ë§ì§ë§ ê²ì
ëë€. @eddyb ì # 47043ìì
@joshlf ížì§ https://github.com/rust-lang/rust/pull/45272 ì ëíŽ ìë €ì£Œê³ ì¬êž°ì íµí©íìµëë€. ê°ì¬!
ì구 ë©ëªšëŠ¬ (ì : http://pmem.io )ë ê·ž ë€ììŒë¡ í° ìí ìíë©° Rustê° ì ìëíëë¡ ë°°ì¹ëìŽìŒí©ëë€.
ìµê·Œì ì구 ë©ëªšëŠ¬ í ë¹ ì (í¹í libpmemcto)륌ìí Rust ëíŒ ìì ì íŽììµëë€. ìŽ APIì ìì íì êŽë šíì¬ ìŽë€ ê²°ì ì ëŽëŠ¬ ë ë€ìì ìííŽìŒí©ëë€.
ì ì³ëê³ , pmem.io ê°ë° (ìží ì PMDK)ì ìì ë jemalloc í ë¹ì륌 ìì²ëê² ì¬ì©í©ëë€. ë°ëŒì jemallocì ìì API ìë¹ìë¡ ì¬ì©íë ê²ìŽ íëª í ê² ê°ìµëë€.
컬ë ì
ìì Alloc
ators륌 ì¬ì©íë ë° ë ë§ì 겜íì ìì ëê¹ì§ GlobalAllocator
ë§ í¬íšíëë¡ìŽ ë²ì륌 ì€ìŽë ê²ìŽ ê°ë¥í ê¹ì?
IIUC ìŽê²ì ìŽë¯ž servo
ì ì구륌 충족ìí¬ ê²ìŽë©° ì°ëŠ¬ê° ë³ë ¬ë¡ ë§€ê° ë³ìí 컚í
ìŽë륌 ì€í í ììê² íŽì€ ê²ì
ëë€. ììŒë¡ë GlobalAllocator
ëì ì¬ì©íëë¡ ì»¬ë ì
ì ìŽëíê±°ë Alloc
ëíŽ GlobalAllocator
Alloc
ì ëžëí· implì ì¶ê°íì¬ ëªšë 컬ë ì
ì ì¬ì©í ì ììµëë€.
ìê°?
@gnzlbg #[global_allocator]
ìì±ìŽ ì ì©íë €ë©Ž ( heap::System
륌 ì ííë ê² ìŽì) Alloc
ížë ìŽ ížë ìì ì ìŽìŽìŒ https : / ì ê°ì ììë¡ êµ¬íí ì ììµëë€ GlobalAllocator
ëŒë ì íìŽë í¹ì±ìŽ ììµëë€. ìë¡ìŽ API륌 ì ìíê³ ììµëê¹?
íì¬ GlobalAllocatorëŒë ì íìŽë í¹ì±ìŽ ììµëë€. ìë¡ìŽ API륌 ì ìíê³ ììµëê¹?
ëŽê° ì ìí ê²ì @alexcrichtonìŽ ì¬êž° ìì ìì í íëŒê³ ì ìí "ìµì"APIì ìŽëŠì 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ë³Žë€ ë íšìšì ìŒ ì ììŒë¯ë¡ ì ê±°íë©Ž ì±ë¥ìŽ ì íë©ëë€.ë ì 몚ë ìë¯žê° ììµëë€. ìŽ êž°ë¥ì ìì í륌 í¬ê² ê°ìí í ììë ì ìŒí ë°©ë²ì 컬ë ì ì ë§€ê° ë³ìííë ë° ì¢ì í¹ì±ìŽëë ì¢ ìì±ì ì€ìŽë ê² ë¿ìŽëŒê³ ìê°íìµëë€.
[ìë³Žê° (ìì | ê³µì 몚ì§ëŒ ìì)ì ê°ì ì ìê³ íë¬ŒìŽ ìŽê²ì ê°ì íì¬ ì¬êž°ìì ìœê°ì ìë ¥ì ì ê±° í ì ìë€ë©Ž ì¢ì ê²ì ëë€.]
@ 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륌 ê°ì§ ì ììµëë€.
ìŒëš ì°ëŠ¬ê° ê±°êž°ì ëì°©íë©Ž ìì ìŒë¡ ë§ìŽê·žë ìŽì íë €ë ì¬ì©ìë ê·žë ê² í ì ìì§ë§ ë¶ìì í APIë¡ ìžíŽ ì±ë¥ìŽ ì í ë ì ììµëë€.
ìŽ ìì ìì ì±ë¥ ì íë¡ ìžíŽ ìì ì ìŒë¡ ìŽëí ììë ì¬ì©ì륌 ì¬íê°íê³ ìŽ API륌 íì¥íê³ ìì ííë ë°©ë²ì ê²°ì í ì ììµëë€.
std
컬ë ì
ìì ì¬ì©ì ì§ì í ë¹ì륌 ì§ìí©ëë€.첫짞, ìŽê²ì ìŽë µ êž° ë묞ì ê²°ìœ ìŒìŽëì§ ìì ìë ìê³ ê²°ìœ ìŒìŽëì§ ìë ê²ìŽ ëì ê²ìŽ ìëëŒê³ ìê°í©ëë€.
ì¬ì©ì ì§ì í ë¹ ìë¡ ì»¬ë ì ì ë§€ê° ë³ìííê³ ì¶ì ë ì±ë¥ 묞ì ë ì¬ì©ì± 묞ì ê° ììµëë€.
ì¬ì©ì± 묞ì ê°ìë ê²œì° ìŒë°ì ìŒë¡ SliceDeque
í¬ë ìŽížì ê°ìŽ ì¬ì©ì ì§ì í ë¹ ìì êž°ë¥ì íì©íë ë€ë¥ž 컬ë ì
API륌 ìí©ëë€. ì¬ì©ì ì§ì í ë¹ ìì ìí 컬ë ì
ë§€ê° ë³ìíë ì¬êž°ì ëììŽëì§ ììµëë€.
ì±ë¥ 묞ì ê°ìë ê²œì° ì¬ì©ì ì§ì í ë¹ìê° ë륌 ëì죌ë ê²ìŽ ì¬ì í ë§€ì° ìŽë €ìž ê²ì
ëë€. Vec
ë ëŽê° ê°ì¥ ì죌 ë€ì 구í í 컬ë ì
ìŽêž° ë묞ì ë€ì ì¹ì
ììë§ ê³ ë €í ê²ì
ëë€.
ìì€í
í ë¹ ìì ëí ížì¶ ì륌 ì€ìŽêž° ìíŽ Vec
ê°ì²Ž ëŽë¶ì ìŒë¶ ìì륌 í ë¹íë €ë©Ž ì€ëì SmallVec<[T; M]>
í©ëë€. ê·žë¬ë SmallVec
ë Vec
ê° ìëëë€.
Vec
ìŽëì ìì ììì O (1)ìŽì§ë§ SmallVec<[T; M]>
ì N <M ë° O (1) ìŽíì O (N)ì
ëë€.
Vec
ììì ëí í¬ìží°ë len() <= M
ìë ê²œì° ìŽëì 묎íšíë©ëë€. ìŠ, into_iter
ì ê°ì len() <= M
ìì
ìŽ ìì륌 ëšì§ í¬ìží°ë¥Œ ì·šíë ëì ë°ë³µêž° ê°ì²Ž ì첎.
ìŽê²ì ì§ìíêž° ìíŽ í ë¹ì륌 íµíŽ Vec
ì ë€ëŠì ë§ë€ ì ììµëê¹? 몚ë ê²ìŽ ê°ë¥íì§ë§ ê°ì¥ ì€ìí ë¹ì©ì ë€ì곌 ê°ìµëë€.
Vec
구íìŽ ë ë³µì¡íŽì žìŽ êž°ë¥ì ì¬ì©íì§ ìë ì¬ì©ììê² ìí¥ì ë¯žì¹ ì ììµëë€.Vec
ì 묞ìë ìŒë¶ ìì
ì ëììŽ í ë¹ ìì ë°ëŒ ë¬ëŒì§êž° ë묞ì ë ë³µì¡íŽì§ ê²ì
ëë€.ìŽë¬í ë¹ì©ì 묎ìí ììë ìì€ìŽëŒê³ ìê°í©ëë€.
Vec
ì ì±ì¥ ìžìë í¹ì í ë¹ ìì ë§ê² ì¡°ì ë©ëë€. std
ììë ìŒë° í ë¹ ìì ë§ê² ì¡°ì í ì ììµëë€. jemalloc
/ malloc
/ ...íì§ë§ ì¬ì©ì ì§ì í ë¹ì륌 ì¬ì©íë 겜ì°ìë ì°ëŠ¬ê° ì íí ì±ì¥ ììžìŽ ë ê°ë¥ì±ìŽ ììµëë€. Ʞ볞ì ìŒë¡ ì¬ì© ì¬ë¡ì ê°ì¥ ì í©íì§ ììµëë€. 몚ë í ë¹ìê° vecì ì ì¬í í ë¹ íšíŽì ëí ì±ì¥ ìžì륌 ì§ì í ì ììŽìŒí©ëê¹? ëë 몚륎ì§ë§ ëŽ ì§ê°ì ëìê² ë§íë€ : ìë§ ìë ê²ìŽë€.
ì륌 ë€ìŽ ì€ë² ì»€ë° í ë¹ìë ëë¶ë¶ì Tier 1 ë° Tier 2 ëììì ì¬ì©í ì ììµëë€. Linux ê³ìŽ ë° Macos ìì€í
ìì í í ë¹ìë Ʞ볞ì ìŒë¡ ì€ë² 컀ë°íë ë°ë©Ž Windows APIë ë©ëªšëŠ¬ë¥Œ ììœíë ë° ì¬ì©í ììë VirtualAlloc
륌 ë
žì¶íê³ (ì : Vec::reserve/with_capacity
) push
ìì ë©ëªšëŠ¬ë¥Œ 컀ë°í©ëë€.
íì¬ Alloc
í¹ì±ì ë©ëªšëŠ¬ ì»€ë° ë° ììœ ê°ë
ì ë¶ëŠ¬íì§ ìêž° ë묞ì Windowsìì ìŽë¬í í ë¹ì륌 구ííë ë°©ë²ì ë
žì¶íì§ ììµëë€ (늬ë
ì€ììë ë¹ ê³Œë í ë¹ìê° íŽí¹ ë ì ììµëë€. ê° íìŽì§ë¥Œ í ë²ë§ í°ì¹íë©Žë©ëë€). ëí í ë¹ìê° alloc
ìì Ʞ볞ì ìŒë¡ ì€ë² ì»€ë° ì¬ë¶ë¥Œ ì§ì íë ë°©ë²ì ê³µê°íì§ ììµëë€.
ìŠ, Vec
ëíŽìŽë¥Œ ì§ìíêž° ìíŽ Alloc
API륌 íì¥íŽìŒíë©°, ìŽë ìœê°ì ì¹ëŠ¬ë¥Œìí 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 ëšê³ë¡ ë¹ ë¥Žê² ìŽëíë ê°ì¥ ì¢ì ë°©ë²ì ì°ëŠ¬ê° ëì°©í ëê¹ì§ 귞늌ìì 컬ë ì
ì ì ìžíë ê²ì
ëë€.
ìŒëš ì°ëŠ¬ê° ê±°êž°ì ëì°©íë©Ž ìì ìŒë¡ ë§ìŽê·žë ìŽì íë €ë ì¬ì©ìë ê·žë ê² í ì ìì§ë§ ë¶ìì í APIë¡ ìžíŽ ì±ë¥ìŽ ì í ë ì ììµëë€.
ì¬ì©ì ì§ì í ë¹ì륌 ì ííë ê²ì ìŒë°ì ìŒë¡ ì±ë¥ í¥ìì êŽí ê²ìŽë¯ë¡ìŽ ìŽêž° ìì íê° ë구ìê² ì ê³µ ë ì§ ëªšë¥Žê² ìµëë€.
ì¬ì©ì ì§ì í ë¹ì륌 ì ííë ê²ì ìŒë°ì ìŒë¡ ì±ë¥ í¥ìì êŽí ê²ìŽë¯ë¡ìŽ ìŽêž° ìì íê° ë구ìê² ì ê³µ ë ì§ ëªšë¥Žê² ìµëë€.
ê°ì 몚ë? ì ìŽë ì§êžì. ë¶ë§ì ì êž°íë ëë¶ë¶ ì ë°©ë²ì ìŽêž° ìì í ì ì (ì alloc_excess
)ì ëëœëìŽ ììŒë©° ìì§ íì€ ëŒìŽëžë¬ëŠ¬ìì ì¬ì©ëì§ ìë AFAIKì
ëë€. ìëë©Ž ìµê·Œì ë³ê²œ ëììµëê¹?
Vec
(ë° RawVec
ì ë€ë¥ž ì¬ì©ì)ê° realloc
ìì push
ë¿¡ ë¹µëš
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
ëí ìì§í ëíŒ ìŒë¿ì
ëë€. ì ìŽë ì°ëŠ¬ê° Ʞ볞 ë¶ìì IMPL 구ííë ê²œì° grow_in_place
ìž¡ë©Žìì shrink_in_place
ìì Alloc
í¹ì±, ê·ž ë ê°ì§ ë°©ë²ìŒë¡ ìì²ë¥Œ ë€ìŽ : realloc
ì shrink_in_place
ì¬ì©ì ì§ì í ë¹ì륌 ì ííë ê²ì ìŒë°ì ìŒë¡ ì±ë¥ í¥ìì êŽí ê²ì ëë€.
ìŽê²ìŽ ì¬ì€ìŽì§ë§, ìŽë¬í ë©ìëê°ìë ì못ë í ë¹ ìë³Žë€ ë ì í©í í ë¹ì륌 ì¬ì©íë©Ž ë ë§ì ì±ë¥ì ì»ì ì ììµëë€.
IIUC ì볎ì 죌ì ì¬ì© ì¬ë¡ë ë ë²ì§ž jemalloc ëì Firefox jemallocì ì¬ì©íë ê²ìŽ ììµëë€. ë§ìµëê¹?
ìŽêž° ìì íìì realloc
ë° shrink_in_place
ì Alloc
í¹ì±ì ì¶ê°íëëŒë ì±ë¥ ë¶ë§ìŽ ì§ì° ë ë¿ì
ëë€.
ì륌 ë€ìŽ std
컬ë ì
ìì ì¬ì©íê²ëë Alloc
ížë ìŽ ížì ë¶ìì í API륌 ì¶ê°íë ìê° ìì ì ìž ì±ë¥ì ì»ì ì ììµëë€. ìŒê°ì í ì ììµëë€. ìŠ, í ë¹ ížë ìŽ ížì realloc_excess
ë° shrink_in_place_excess
륌 ì¶ê°íê³ Vec
/ String
/ ... ì¬ì©íë©Ž realloc
ìì íë©ëë€ shrink_in_place
ì (ë) ëš í ë²ë ëììŽëì§ ììì ê²ì
ëë€.
IIUC ì볎ì 죌ì ì¬ì© ì¬ë¡ë ë ë²ì§ž jemalloc ëì Firefox jemallocì ì¬ì©íë ê²ìŽ ììµëë€. ë§ìµëê¹?
ìŒë¶ ìœë륌 ê³µì íì§ë§ Firefoxì Servoë ë ê°ì ê°ë³ íë¡ì íž / ì í늬ìŒìŽì ì ëë€.
Firefoxë mozjemallocì ì¬ì©íëë°, ìŽë ë§ì êž°ë¥ìŽ ì¶ê° ë ìŽì ë²ì ì jemallocì í¬í¬ì
ëë€. ìŒë¶ unsafe
FFI ìœëë Rust stdìì ì¬ì©íë mozjemallocì ì íì±ê³Œ 걎ì ì±ì ìì¡Ž íë€ê³ ìê° í©ëë€.
Servoë íì¬ ì€í íìŒì ëí Rustì êž°ë³žê° ìž jemallocì ì¬ì©íì§ë§ìŽ Ʞ볞ê°ì ìì€í
ì í ë¹ ìë¡ ë³ê²œí ê³íìŽ ììµëë€. Servoìë ì€ì ë¡ ì¬ì©ëë jemallocì 걎ì ì±ì ìì¡Žíë unsafe
ë©ëªšëŠ¬ ì¬ì©ëë³Žê³ ìœëë ììµëë€. ( Vec::as_ptr()
ìì je_malloc_usable_size
)
Servoë íì¬ ì€í íìŒì ëí Rustì êž°ë³žê° ìž jemallocì ì¬ì©íì§ë§ìŽ Ʞ볞ê°ì ìì€í ì í ë¹ ìë¡ ë³ê²œí ê³íìŽ ììµëë€.
ì볎 íê²ìŽëë ìì€í
ì ìì€í
í ë¹ìê° jemalloc곌 ê°ì ìµì í ë realloc
ë° shrink_to_fit
API륌 ì ê³µíëì§ ìë ê²ìŽ ì¢ìµëë€. 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ê° ììµëë€. êžë¡ë² í ë¹ ì ì€í ëŠ¬ê° ìì íëêž° ììíë©Ž ì ì¬í API륌 ì ê³µíë ë€ë¥ž í ë¹ ììê² jemallocator
ììì ì ì¬í ììê° ëíë ê²ìŒë¡ ììí©ëë€. ìŽ APIê° Alloc
ížë ìŽ ížì ìíëì§ ì í ìê°íì§ ìììµëë€.
malloc_usable_size
ìŽ Alloc
í¹ì±ì ììŽìŒíë€ê³ ìê°íì§ ììµëë€. #[global_allocator]
륌 ì¬ì©íì¬ Vec<T>
ìŽë€ í ë¹ì륌 ì¬ì©íëì§ íìžíê³ jemallocator
í¬ë ìŽížì íšì륌 ë³ëë¡ ì¬ì©íë ê²ì êŽì°®ìµëë€.
@SimonSapin Alloc
í¹ì±ìŽ ìì ëë©Ž Linux malloc ë° Windows ì© jemallocator
ì ê°ì ìì륌 ê°ê² ë ê²ì
ëë€. ìŽ ììë€ì ë¶ìì ì í ììë ë¶ë¶ì 구ííë ì¶ê° êž°ë¥ì ê°ì§ ì Alloc
API륌 (ê°ì, ì륌 ë€ìŽ, usable_size
ì ìëšì malloc_usable_size
) ë° ë€ë¥ž ê²ë€ì ê·ž mallinfo
ìììë ë©ëªšëŠ¬ë³Žê³ ì ê°ìŽ Alloc
APIì ìŒë¶ê° ìëëë€. ìë³Žê° ëª©íë¡íë ìì€í
ì ì¬ì©í ììë ììê° ììŒë©Ž Alloc
í¹ì±ì ìŽë ë¶ë¶ìŽ ìì í ì°ì ìì륌 ì§ì íëì§ íì
íë ê²ìŽ ë ì¬ìž ê²ìŽë©°, ìŒë¶ì ëíŽ ìµìí ì€ííŽìŒíë ìµì API륌 ì°Ÿì ììì ê²ì
ëë€. í ë¹ ì.
@gnzlbg ëë https://github.com/rust-lang/rust/issues/32838#issuecomment -358267292ì ê²ë€ì ìœê° íìì ì ëë€. 몚ë ìì€í í¹ì í목ì ì ìžíê³ allocì ââëí 컬ë ì ì ìŒë°ííë ê²ì ìŽë µì§ ììµëë€. íµí©íë ê²ì ë³ëì ëì ì²ëŒ 볎ì ëë€.
@SimonSapin firefoxì ë¶ìì í Rust ì ì± ìŽ ìëì? ëë íŒëì€ë¬ìíê³ ìë€ê³ ìê°íë€. íìŽìŽ íì€ì ì볎ë ìŽê²ì ìíì§ë§ ë§ìœ ê·žë ë€ë©Ž íìŽìŽ íì€ì ì¬ì© ì¬ë¡ë ìì íì ìë ¥ì ê°í ê²ìŽë€.
@sfackler ^ì ì°žì¡°íììì€. ìŽ ìì ì íìë¡íë íë¡ì ížì ìíë íë¡ì ížë¥Œ 구ë¶íë €ê³ íì§ë§ ì볎ë ê·ž ì°šìŽì ë°ëížì ììµëë€.
ìŽê²ì ìíê³ ìì ì ìŽìŽìŒíë íë¡ì ížê° ììµëë€. Rustì ìë¹ìë¡ì Servo ëë Firefoxì ëíŽ í¹ë³í ë§ë² ê°ì ê²ì ììµëë€.
@ Ericson2314 ë§ìµëë€. Firefoxë ìì ì ìž https://wiki.mozilla.org/Rust_Update_Policy_for_Firefox륌 ì¬ì©í©ëë€. ì€ë ìëíë ì룚ì
ìŽ ìì§ë§ ì€ëª
íë¯ìŽ ìŽê²ì ì€ì ì°šëšêž°ê° ìëëë€. #[global_allocator]
륌 ì¬ì©íë ê²ìŽ ë ì¢ê±°ë ë ê°ë ¥ í ê²ì
ëë€.
ì볎ë ìŒë¶ ë¶ìì í êž°ë¥ì ì¬ì©íì§ë§ ìžêžíë¯ìŽìŽë¥Œ ë³ê²œíë €ê³ í©ëë€.
FWIW, íëŒ ë©ížëŠ í ë¹ìë í ë¹ì륌 구ííë ë° ë§€ì° ì ì©í©ëë€. ëŽë¶ì ìŒë¡ ë€ìí ë°ìŽí° 구조륌 ì¬ì©íê³ ë ê°ëší í ë¹ ì (ì : bsalloc )ë¡ ë§€ê° ë³ìí í ì ìë€ë©Ž ì±ë¥ì ë 믌ê°í ë¶êž° êŽëŠ¬ê° íšì¬ ì¬ìì§ëë€. íì¬ íì€ í겜ìììŽë¥Œ ìííë ì ìŒí ë°©ë²ì 첫 ë²ì§ž ëšê³ë¥Œ ì¬ì©íì¬ ë ê°ëší í ë¹ì륌 ì ì í ë¹ ìë¡ ì€ì íê³ ë ë²ì§ž ëšê³ë¥Œ ì¬ì©íì¬ ë í¬ê³ ë³µì¡í í ë¹ì륌 컎íìŒíë ë° ì¬ì©ëë 2 ëšê³ 컎íìŒìíë ê²ì ëë€. . no-stdììë ì í í ë°©ë²ìŽ ììµëë€.
íí
몚ë ìì€í í¹ì í목ì ì ìžíê³ allocì ââëí 컬ë ì ì ìŒë°ííë ê²ì ìŽë µì§ ììµëë€. íµí©íë ê²ì ë³ëì ëì ì²ëŒ 볎ì ëë€.
ëŽê° 볌 ììë Vec
+ ì¬ì©ì ì§ì í ë¹ ì ìì ArrayVec
ëë SmallVec
ììµëê¹? ê·žê²ìŽ ì ê° ìžêž í 첫 ë²ì§ž ìì ìŽê³ , ê·žê²ì ì í ìì€í
í¹ì ìŽ ìëëë€. ìë§ë ê·žê²ì ììí ììë ê°ì¥ ëšìí ë ê°ì í ë¹ ììŒ ê²ì
ëë€. íëë ì€í 늬ì§ë¡ìì ìì ìŽë ìŽìŽê³ , ë€ë¥ž íëë ìŽë ìŽì ì©ëìŽ ë¶ì¡±í ê²œì° íì íŽë°±ì ì¶ê°íì¬ ì²« ë²ì§ž í ë¹ ì ìì êµ¬ì¶ í ì ììµëë€. 죌ë ì°šìŽì ì ìŽë¬í í ë¹ìë "êžë¡ë²"ìŽ ìëì§ë§ ê° Vec
ìë ë€ë¥ž 몚ë í ë¹ ìì ë
늜ì ìž ì첎 í ë¹ìê° ììŒë©° ìŽë¬í í ë¹ìë ìí ì ì¥ì
ëë€.
ëí ëë ìŽê²ì ê²°ìœíì§ ìëë€ê³ 죌ì¥íë ê²ìŽ ìëë€. ì ë ìŽê²ìŽ ë§€ì° ìŽë µë€ê³ ë§íê³ ììµëë€ : C ++ë 30 ë
ëì ë¶ë¶ì ìž ì±ê³µë§ìŒë¡ ìëíŽ ììµëë€ : GPU í ë¹ ìì GC í ë¹ìë ìŒë° í¬ìží° ì íìŒë¡ ìžíŽ ìëíì§ë§ ArrayVec
ë° SmallVec
Vec
ìì P0843r1 ì ArrayVec
ì ëí ëª ê°ì§ 묞ì 륌 ììží ì€ëª
í©ëë€).
ë°ëŒì ììŒë¡ ì¬ì©ì ì§ì 컬ë ì í ë¹ì륌 ì¶êµ¬íì§ ìë í ì ì©í ê²ì ì ê³µíë ì¡°ê°ì ìì í í íì ìŽê²ì ì¶êµ¬íë ê²ìŽ ì¢ìµëë€.
IRCìì @SimonSapin 곌 ìœê° ìŽìŒêž°ë¥Œ ëëŽìŒë©° realloc
ë° alloc_zeroed
ìŽêž° ìì í ì ìì íì¥íë©Ž Firefoxì Rust (ìì ì ìž Rust ë§ ì¬ì©)륌 ì¬ì©í ì ììµëë€. mozjemalloc
ì¶ê° íŽí¹ììŽ ìì ì ìž Rustì ì ì í ë¹ ìë¡ì. @SimonSapin ìì ìžêžíë¯ìŽ Firefoxë íì¬ìŽë¥Œìí ì€í ê°ë¥í ì룚ì
ì ê°ì§ê³ ììŒë¯ë¡ ìŽê²ìŽ ì¢ê² ì§ ë§ ê·žë€ì§ ì€ìíì§ ìì ê² ê°ìµëë€.
ê·žëë ì¬êž°ì ììí ì ììŒë©° ìŒëš ê±°êž°ì ëì°©íë©Ž ì±ë¥ ìì€ììŽ servo
ì ìì ì ìž #[global_allocator]
ë¡ ìŽëí©ëë€.
í
FWIW, íëŒ ë©ížëŠ í ë¹ìë í ë¹ì륌 구ííë ë° ë§€ì° ì ì©í©ëë€.
ë¬Žìš ë»ìžì§ ì¢ ë ììží ì€ëª
íŽ ì£Œìê² ìµëê¹? Alloc
í¹ì±ìŒë¡ ì¬ì©ì ì§ì í ë¹ì륌 ë§€ê° ë³ìí í ììë ìŽì ê° ììµëê¹? ëë ì¬ì©ì ì§ì í ë¹ ì í¹ì±ì ì¬ì©íê³ ìµì¢
í ë¹ ìì Alloc
í¹ì±ì 구íí©ëë€ (ìŽ ë í¹ì±ìŽ ë°ëì ê°ì íìë ìì)?
"SmallVec = Vec + í¹ì í ë¹ ì"ì ì¬ì© ì¬ë¡ê° ìŽëìì ìëì§ ìŽíŽí ì ììµëë€. ìŽì ì ë§ìŽ ìžêž í ëŽì©ìŽ ìëëë€ (Rustë ìëê³ ë€ë¥ž 묞맥ììë ìžêžëì§ ìììµëë€). ì íí ë§ì ì¬ê°í 묞ì ê° ìêž° ë묞ì ëë€. "í¹ì í ë¹ì륌 ì¬ì©íì¬ ì±ë¥ í¥ì"ì ìê°í ë ëë ì í ìê°íì§ ììµëë€.
Layout
API륌 ìŽíŽë³Žë©Žì from_size_align
ì align_to
ì¬ìŽì ì€ë¥ ì²ëŠ¬ ì°šìŽì ëíŽ ê¶êží©ëë€. ì ìë ì€ë¥ê° ë°ìíë©Ž None
륌 ë°íí©ëë€. , íìë íšë (!).
ì ì íê² ì ìëê³ ì ìµí LayoutErr
ìŽê±° íì ì¶ê°íê³ ë ê²œì° ëªšëìì Result<Layout, LayoutErr>
륌 ë°ííë ê²ìŽ ë ì ì©íê³ ìŒêŽ ì ìŽ ì§ ììê¹ì? (ê·žëŠ¬ê³ ìë§ë íì¬ Option
ë°ííë ë€ë¥ž íšìì ì¬ì©í ìë ììµëë€
ë¿¡ë¿¡
"SmallVec = Vec + í¹ì í ë¹ ì"ì ì¬ì© ì¬ë¡ê° ìŽëìì ìëì§ ìŽíŽí ì ììµëë€. ìŽì ì ë§ìŽ ìžêž í ëŽì©ìŽ ìëëë€ (Rustë ìëê³ ë€ë¥ž 묞맥ììë ìžêžëì§ ìììµëë€). ì íí ë§ì ì¬ê°í 묞ì ê° ìêž° ë묞ì ëë€. "í¹ì í ë¹ì륌 ì¬ì©íì¬ ì±ë¥ í¥ì"ì ìê°í ë ëë ì í ìê°íì§ ììµëë€.
Rustì C ++ìì í ë¹ì륌 ì¬ì©íë ë ê°ì§ ë 늜ì ìž ë°©ë²ìŽ ììµëë€. Ʞ볞ì ìŒë¡ 몚ë í ë¹ì ì¬ì©ëë ìì€í í ë¹ ìì ìŒë¶ í ë¹ ì í¹ì±ì ìíŽ ë§€ê° ë³ìí ë 컬ë ì ì ì í ìžìë¡ ì¬ì©ëë í¹ì 컬ë ì ì ê°ì²Žë¥Œ ìì±íë ë°©ë²ì ëë€. í¹ì í ë¹ì륌 ì¬ì©í©ëë€ (ìì€í ì í ë¹ ììŒ ì ìì).
ë€ìììŽ ë ë²ì§ž ì¬ì© ì¬ë¡ìë§ ìŽì ì ë§ ì¶¥ë ë€. 컬ë ì 곌 í ë¹ ì ì íì ì¬ì©íì¬ í¹ì í ë¹ì륌 ì¬ì©íë íŽë¹ 컬ë ì ì ê°ì²Žë¥Œ ë§ëëë€.
C ++ 겜íì í ë¹ì륌 ì¬ì©íì¬ ì»¬ë ì ì ë§€ê° ë³ìííë ê²ì ë ê°ì§ ì¬ì© ì¬ë¡ë¥Œ ì ê³µí©ëë€.
ìŽê²ì C ++ ìœë êž°ë°ìì 99 %ì ìê° ëì 볌 ììë í ë¹ ìì ì¬ì© ì¬ë¡ì ëë€. 컬ë ì ì ìë¡ìŽ êž°ë¥ì ì¶ê°íë©Ž ì±ë¥ìŽ í¥ìëë€ë ì¬ì€ì ì°ì°ì ìŒì¹ëŒê³ ìê°í©ëë€. í¹í ë€ì í ë¹ìë í ë¹ íšíŽì ëììŒë¡ ì±ë¥ì í¥ììí€ì§ ììµëë€. @ Ericson2314ìì ìžêž
ìì ë²íŒ ìµì í륌ìí ì€í í ë¹ ì (Howard Hinnantì stack_alloc 묞ì ì°žì¡° ). std::vector
ëë flat_{map,set,multimap,...}
íê³ ìì ë²íŒ ìµì íì ì¶ê°íë ì¬ì©ì ì§ì í ë¹ì륌 ì ë¬íì¬ ( SmallVec
) ëë ì¬ì©íì§ ìê³ ( ArrayVec
) í íŽë°±. ì륌 ë€ìŽ ì€í ëë ì ì ë©ëªšëŠ¬ (ê·žë ì§ ììŒë©Ž íì ì¬ì©íì ê²ì)ì íŽë¹ ììê°ìë 컬ë ì
ì ë£ì ì ììµëë€.
ìžê·žëšŒíž ë©ëªšëŠ¬ ìí€í ì² (ì : 16 ë¹íž ììŽë í¬ìží° x86 íê² ë° GPGPU) ì륌 ë€ìŽ C ++ 17 Parallel STLì C ++ 14 ëì Parallel Technical SpecificationìŽììµëë€. ëìŒí ì ìì ê·žê²ì ì 구첎 ëŒìŽëžë¬ëŠ¬ 컚í ìŽë clasesë GPGPU ë©ëªšëŠ¬ (ì륌 ì¬ì©í ì ìëë¡ í ë¹ì륌 í¬íš NVIDIAì ì¶ë ¥ ëŒìŽëžë¬ëŠ¬ìŽë€ ì¶ë ¥ :: device_malloc_allocator ) ëë ê³ ì ë©ëªšëŠ¬ (ì륌 ë€ìŽ, ì¶ë ¥ :: pinned_allocatorì , ê³ ì ë ë©ëªšëŠ¬ì ížì€íž ì¥ì¹ ê°ì ë¹ ë¥ž ì ì¡ì íì© ìŒë¶ 겜ì°).
ì못ë ê³µì (ì : Intel Thread Building Blocks cache_aligned_allocator
) ëë SIMD ì íì 곌ëí ì ë ¬ ì구 ì¬í (ì : Eigen3ì aligned_allocator
)곌 ê°ì ë³ë ¬ ì²ëŠ¬ êŽë š 묞ì 륌 íŽê²°íêž°ìí í ë¹ ì.
íë¡ìžì€ ê° ê³µì ë©ëªšëŠ¬ : Boost.Interprocess ìë OS íë¡ìžì€ ê° ê³µì ë©ëªšëŠ¬ êž°ë¥ (ì : System V ê³µì ë©ëªšëŠ¬)ì ì¬ì©íì¬ ì»¬ë ì ì ë©ëªšëŠ¬ë¥Œ í ë¹íë í ë¹ìê° ììµëë€. ìŽë¥Œ íµíŽ std 컚í ìŽë륌 ì§ì ì¬ì©íì¬ ìë¡ ë€ë¥ž íë¡ìžì€ ê°ì íµì ì ì¬ì©ëë ë©ëªšëŠ¬ë¥Œ êŽëŠ¬ í ì ââììµëë€.
ê°ë¹ì§ ìì§ : Herb Sutterì ì§ì° ë©ëªšëŠ¬ í ë¹ ëŒìŽëžë¬ëŠ¬ ë ì¬ì©ì ì ì í¬ìží° ì íì ì¬ì©íì¬ ë©ëªšëŠ¬ë¥Œ ê°ë¹ì§ ìì§íë í ë¹ì륌 구íí©ëë€. ì륌 ë€ìŽ 벡í°ê° 컀ì§ë©Ž íŽë¹ ë©ëªšëŠ¬ì ëí 몚ë í¬ìží°ê° íꎎ ë ëê¹ì§ ìŽì ë©ëªšëŠ¬ ì²í¬ê° ì ì§ëìŽ ë°ë³µêž° 묎íší륌 ë°©ì§í©ëë€.
ê³ìž¡ ë í ë¹ ì : Bloombergì ìíížìšìŽ ëŒìŽëžë¬ëŠ¬ì blsma_testallocator륌 ì¬ì©íë©Ž ì¬ì©íë ê°ì²Žì ë©ëªšëŠ¬ í ë¹ / í ë¹ íŽì (ë° C ++ í¹ì ê°ì²Ž ìì± / íꎎ) íšíŽì êž°ë¡ í ì ììµëë€. Vec
reserve
ìŽíì í ë¹ëëì§ ì¬ë¶ë¥Œ 몚ëŠ
ëë€. ìŽë¬í í ë¹ì륌 ì°ê²°íë©Ž ë°ì ì¬ë¶ë¥Œ ìë €ì€ëë€. ìŽë¬í í ë¹ ì ì€ ìŒë¶ë ìŽëŠì ì§ì í ì ììŒë¯ë¡ ì¬ë¬ ê°ì²Žìì ì¬ì©í ì ìê³ ìŽë€ ê°ì²Žê° 묎ììíê³ ìëì§ ë¡ê·žë¥Œ ì»ì ì ììµëë€.
ìŽê²ìŽ ì ê° C ++ìì ê°ì¥ ì죌 볎ë í ë¹ ì ì íì ëë€. ìì ìžêžíë¯ìŽ ìŽë€ 겜ì°ì ì±ë¥ìŽ í¥ìëë€ë ì¬ì€ì ì°ì°ì ìŒì¹ëŒê³ ìê°í©ëë€. ì€ìí ë¶ë¶ì ê·žë€ ì€ ìŽë ê²ë í¹ì í ë¹ íšíŽì 목íë¡íì§ ìëë€ë ê²ì ëë€.
AFAIKìŽ ìì ì ìííë ë늬 ì¬ì©ëë C ++ í ë¹ìë ììµëë€. ì ìŽê²ìŽ ë°ë¡ ìŽê²ìŽëŒê³ ìê°íëì§ ì€ëª íê² ìµëë€. ë€ì ëŒìŽëžë¬ëŠ¬ëìŽ ì¬ì© ì¬ë¡ë¥Œ ëììŒë¡í©ëë€.
ê·žë¬ë ìŽë¬í ëŒìŽëžë¬ëŠ¬ë í¹ì ì¬ì© ì¬ë¡ì ëíŽ ëšìŒ í ë¹ì륌 ì ê³µíì§ ììµëë€. ëì ì í늬ìŒìŽì ì í¹ì ë¶ë¶ìì í¹ì í ë¹ íšíŽì ëììŒë¡íë ì¬ì©ì ì§ì í ë¹ì륌 구ì¶íë ë° ì¬ì©í ììë í ë¹ ì êµ¬ì± ìì륌 ì ê³µí©ëë€.
ì ê° C ++ ìì ì êž°ìµíë ìŒë°ì ìž ì¡°ìžì ë€ì곌 ê°ì ìŽì ë¡ "ì¬ì©íì§ ë§ììì€"(ë§ì§ë§ ìëš)ëŒë ê²ì ëë€.
ê·žë ë€ê³ ìŽ ì¬ì© ì¬ë¡ì ëí ëŒìŽëžë¬ëŠ¬ê° ì ì©íì§ ìë€ë ì믞ë ìëëë€. ê·žë êž° ë묞ì foonathan / memory ì ê°ì ëŒìŽëžë¬ëŠ¬ê° ê°ííê³ ììµëë€. ê·žë¬ë ì ìŽë ëŽ ê²œíì ê·žë€ì "ì¶ê° êž°ë¥ì ì¶ê°"íë í ë¹ ìë³Žë€ ìŒììì ë ì¬ì©ë©ëë€. ìëíë©Ž ì¹ëŠ¬ë¥Œ ì ê³µíë €ë©Ž ëë¶ë¶ì ì¬ì©ìê° í¬ìíë €ë ê²ë³Žë€ ë ë§ì ìê°ìŽ íìí ìì€í í ë¹ì륌 ìŽê²šìŒíêž° ë묞ì ëë€ (Stackoverflowê° ê°ë ì°Œìµëë€). "Boost.Poolì ì¬ì©íëë° ì±ë¥ìŽ ëë¹ ì¡ìµëë€. ìŽë»ê²íŽìŒí©ëê¹? Boost.Poolì ì¬ì©íì§ ììµëë€.").
IMO ì ë C ++ í ë¹ ì 몚ëžìŽ ì벜íì§ë ìì§ë§ ë ê°ì§ ì¬ì© ì¬ë¡ë¥Œ 몚ë ì§ìíë€ë ê²ìŽ ëëšíë€ê³ ìê°íë©°, Rustì íì€ ì»¬ë ì ìŽ í ë¹ ìì ìíŽ ë§€ê° ë³ìíëë©Ž ë ê°ì§ ì¬ì© ì¬ë¡ë 몚ë ì§ìíŽìŒíë€ê³ ìê°í©ëë€. ë ê²œì° ëªšëì ëí C ++ í ë¹ìê° ì ì©í ê²ìŒë¡ ë°íì¡ìµëë€.
ìŽ ë¬žì ë í¹ì ìì© íë¡ê·žëšì ì ì / ìì€í / íë«íŒ / Ʞ볞 / í / ë¬Žë£ ì ì¥ì í ë¹ì륌 ì¬ì©ì ì§ì í ììë ê²ê³Œ ìœê° ì§êµíë©° ë 묞ì 륌 ëìì íŽê²°íë €ê³ íë©Ž ì룚ì ìŽ ì§ì° ë ì ìë€ê³ ìê°í©ëë€. ê·žë€ ì€ ë¶íìíê².
í ë¹ ìì ìíŽ ë§€ê° ë³ìí ë 컬ë ì ìŒë¡ ìŒë¶ ì¬ì©ìê° ìíë ìì ì ë€ë¥ž ì¬ì©ìê° ìíë ìì 곌 í¬ê² ë€ë¥Œ ì ììµëë€. @rkruppe ê° "ìŒì¹íë í ë¹ íšíŽ"ìì ììíê³ "íì ê³µì ë°©ì§"ëë "í
@gnzlbg í¬êŽì ìž êž ì£Œì ì ê°ì¬í©ëë€. ê·žê²ì ëë¶ë¶ì ëì ìë ì§ë¬žì ë€ë£šì§ ìê³ ëë ê·žê²ì ìŒë¶ì ëìíì§ ìì§ë§, ì² ì륌 ìšì ìë¡ ì§ëì¹ì§ ìëë¡íë ê²ìŽ ì¢ìµëë€.
ëŽ ì§ë¬žì í¹íìŽ ìì© íë¡ê·žëšì êŽí ê²ì ëë€.
ìì ë²íŒ ìµì í륌ìí ì€í í ë¹ ì (Howard Hinnantì stack_alloc 묞ì ì°žì¡°). std :: vector ëë flat_ {map, set, multimap, ...}ì ì¬ì©íê³ ìŽë¥Œ ì¬ì©ì ì§ì í ë¹ ìì ì ë¬íì¬ (SmallVec) í íŽë°±ì ì¬ì©íê±°ë ì¬ì©íì§ ìê³ (ArrayVec) ìì ë²íŒ ìµì íì ì¶ê°í©ëë€. ì륌 ë€ìŽ ì€í ëë ì ì ë©ëªšëŠ¬ (ê·žë ì§ ììŒë©Ž íì ì¬ì©íì ê²ì)ì íŽë¹ ììê°ìë 컬ë ì ì ë£ì ì ììµëë€.
stack_allocì ââëíŽ ìœìŒë©Žì ìŽë»ê² ìëíëì§ ê¹šë¬ììµëë€. ì¬ëë€ìŽ ìŒë°ì ìŒë¡ SmallVec (ë²íŒê° 컬ë ì
ì ìžëŒìžìŒë¡ ì ì¥ëë ê³³)ìì ì믞íë ê²ì ìëêž° ë묞ì íŽë¹ ìµì
ì ëì¹ ìŽì ë ìëì§ë§ 컬ë ì
ìŽ ìŽëí ë í¬ìží°ë¥Œ ì
ë°ìŽížíŽìŒíë 묞ì 륌 íŽê²°íê³ ìŽë¬í ìŽëì ë ì ë Žíê² ë§ëëë€. ). ëí short_allocì ì¬ì©íë©Ž ì¬ë¬ 컬ë ì
ìŽ íëì arena
륌 ê³µì í ì ììŒë¯ë¡ ìŒë°ì ìž SmallVec ì í곌ë íšì¬ ë ë€ëŠ
ëë€. ìŽë í ë¹ ë ê³µê°ìŽ ë¶ì¡±í ë í í ë¹ìŒë¡ì ì°ìí íŽë°±ì ì ê³µíë ì í / ë²í í¬ìží° í ë¹ ìì ë¹ì·í©ëë€.
ëë ìŽë° ì¢
ë¥ì í ë¹ ìì cache_aligned_allocator
ê° ê·Œë³žì ìŒë¡ ìë¡ìŽ êž°ë¥ì ì¶ê°íê³ ìë€ë ê²ì ëìíì§ ììµëë€. ìŽë€ì ë€ë¥Žê² ì¬ì©ëë©° "í ë¹ íšíŽ"ì ì ìì ë°ëŒ í¹ì í ë¹ íšíŽì ìµì íëì§ ìì ì ììµëë€. ê·žë¬ë í¹ì ì¬ì© ì¬ë¡ì ë§ê² ìµì íëê³ ë²ì© í í ë¹ ìì í° ëì ì°šìŽê° ììµëë€.
ê·žë¬ë ëë "í¬ìží°"ê° ì믞íë ë°ë¥Œ ì€ì§ì ìŒë¡ ë°êŸžë Sutterì ì§ì°ë ë©ëªšëŠ¬ í ë¹ê³Œ ê°ì ì¬ì© ì¬ë¡ê° ì°ëŠ¬ê° ê·žê²ì ì§ìíê³ ì¶ë€ë©Ž ë³ëì ëììžìŽ íìí ììë ë³ëì ì í늬ìŒìŽì ìŽëŒë ë° ëìí©ëë€.
stack_allocì ââëíŽ ìœìŒë©Žì ìŽë»ê² ìëíëì§ ê¹šë¬ììµëë€. ì¬ëë€ìŽ ìŒë°ì ìŒë¡ SmallVec (ë²íŒê° 컬ë ì ì ìžëŒìžìŒë¡ ì ì¥ëë ê³³)ìì ì믞íë ê²ì ìëêž° ë묞ì íŽë¹ ìµì ì ëì¹ ìŽì ë ìëì§ë§ 컬ë ì ìŽ ìŽëí ë í¬ìží°ë¥Œ ì ë°ìŽížíŽìŒíë 묞ì 륌 íŽê²°íê³ ìŽë¬í ìŽëì ë ì ë Žíê² ë§ëëë€. ).
stack_alloc
ë "a paper"ê°ìë ì ìŒí í ë¹ ììŽêž° ë묞ì ìžêžíì§ë§ 2009 ë
ì ì¶ìëììŒë©° C ++ 11ë³Žë€ ì°ì í©ëë€ (C ++ 03ì 컬ë ì
ìì ìí ì ì¥ í ë¹ì륌 ì§ìíì§ ìì).
ìŽê²ìŽ C ++ 11 (ìí ì ì¥ í ë¹ì륌 ì§ìíš)ìì ìëíë ë°©ìì ê°ëší ë§íŽì ë€ì곌 ê°ìµëë€.
Allocator
ê°ì²Ž ê·ž ìì ëšì§ ë
¹ ê°ì RawVec
ììµëë€ .true
ì
ëë€. ìŽ ìì±ìŽ false
ê²œì° ìŽë í ë¹ì í ë¹ì륌 ì í í ì ììŒë¯ë¡ íì€ì ë°ëŒ 컬ë ì
ìŽ ê° ìì륌 ì ì ì¥ìë¡ ìëìŒë¡ ìŽëíŽìŒí©ëë€.ë°ëŒì ìì€í
í ë¹ìê°ìë 벡í°ê° ìŽëëë©Ž 뚌ì ì€íì ì 벡í°ì ëí ì ì¥ìê° í ë¹ ë ë€ì í ë¹ìê° ìŽë (0 í¬êž°) ë ë€ì 3 ê°ì í¬ìží°ê° ìŽëëë©° ì¬ì í ì íší ìíì
ëë€. ìŽë¬í ìì§ìì O(1)
ì
ëë€.
OTOHO, POCMA == true
í ë¹ìê°ìë 벡í°ê° ìŽëëë©Ž 뚌ì ì€íì ì 벡í°ì ëí ì ì¥ìê° í ë¹ëê³ ë¹ ë²¡í°ë¡ ìŽêž°í ë ë€ì ìŽì 컬ë ì
ì drain
ed ìë¡ìŽ ê², ê·žëì ìŽì ê²ì ë¹ìŽ ìê³ ìë¡ìŽ ê²ì ê°ë ì°Œìµëë€. ìŽë ê²íë©Ž ìŽë í ë¹ ì°ì°ì륌 ì¬ì©íì¬ ì»¬ë ì
ì ê° ìì륌 ê°ë³ì ìŒë¡ ìŽëí©ëë€. ìŽ ëšê³ë O(N)
ìŽë©° ììì ëŽë¶ í¬ìží°ë¥Œ ìì í©ëë€. ë§ì§ë§ìŒë¡, ìŽì ë¹ìŽìë ìë 컬ë ì
ìŽ ìì ë©ëë€. ìŽê²ì ë³µì 묌ì²ëŒ 볎ìŽì§ë§ ìì ìì²Žê° ë³µì ëì§ ìê³ C ++ë¡ ìŽëíêž° ëë¬žìŽ ìëëë€.
ë§ìŽ ëŒ?
C ++ìììŽ ì ê·Œ ë°©ìì 죌ì 묞ì ì ì ë€ì곌 ê°ìµëë€.
_excess
ë©ìëê° ììµëë€.ì륌 ë€ìŽ _excess
ë©ìë륌 ì¶ê°íê³ íì€ ì€ì 컬ë ì
ìŽìŽë¥Œ ì¬ì©íëë¡ ë³Žì¥íë ë± C ++ì í ë¹ ì API륌 ê°ì íì¬ ìŽë¬í 묞ì 륌 íŽê²°íêž° ìíŽ ë
žë ¥íë ì¬ëë€ìŽ ë§ìµëë€.
ëë ìŽë¬í ì¢ ë¥ì í ë¹ ìì cache_aligned_allocatorê° ê·Œë³žì ìŒë¡ ìë¡ìŽ êž°ë¥ì ì¶ê°íê³ ìë€ë ë° ëìíì§ ììµëë€.
ëŽê° ì믞íë ë°ë ìí©ìì ëë ìŽì ì ì¬ì©í ì ììë ì íì ëíŽ íì€ ì»¬ë ì
ì ì¬ì©í ì ìë€ë ê²ì
ëë€. ì륌 ë€ìŽ C ++ììë ì€í í ë¹ ìì ê°ì ê²ìŽ ììŒë©Ž ë°ìŽë늬ì ì ì ë©ëªšëŠ¬ ìžê·žëšŒížì ë²¡í° ìì륌 ë£ì ì ììµëë€ (ìì§ìŽë¥Œ ìííë ì첎 컬ë ì
ì ìì±í ì ìì). OTOH, C ++ íì€ì SIMD ì í곌 ê°ìŽ 곌ëíê² ì ë ¬ ë ì íì ì§ìíì§ ììŒë©° new
ë¡ í í ë¹ì ìëíë©Ž ì ìëì§ ìì ëìì ížì¶í©ëë€ ( posix_memalign
ëë ìŽì ì ì¬í ê²ì ì¬ì©íŽìŒ íš). . ê°ì²Žë¥Œ ì¬ì©íë©Ž ìŒë°ì ìŒë¡ segfault (*)륌 íµíŽ ì ìëì§ ìì ëììŽ ëíë©ëë€. aligned_allocator
ì ê°ì ê²ì ë€ë¥ž í ë¹ì륌 ì¬ì©íì¬ ì ìëì§ ìì ëìì ížì¶íì§ ìê³ ìŽë¬í ì íì í í ë¹íê³ std 컬ë ì
ì ë£ì ìë ììµëë€. ë¬Œë¡ ìë¡ìŽ í ë¹ìë ë€ë¥ž í ë¹ íšíŽì ê°ì§ ê² ì§ë§ (ìŽ í ë¹ìë Ʞ볞ì ìŒë¡ 몚ë ë©ëªšëŠ¬ btw ...), ì¬ëë€ìŽìŽë¥Œ ì¬ì©íë 목ì ì ìŽì ì í ì ììë ìŒì í ì ìë€ë ê²ì
ëë€.
ë¶ëª í Rustë C ++ê° ìëëë€. ê·žëŠ¬ê³ C ++ìë Rustììë 묞ì ê° ììµëë€ (ê·ž ë°ëë ë§ì°¬ê°ì§ì ëë€). ì륌 ë€ìŽ SIMD ì íì 묞ì ê°ìë Rustììë C ++ì ìë¡ìŽ êž°ë¥ì ì¶ê°íë í ë¹ìê° íìíì§ ìì ì ììµëë€.
(*) Eigen3 ì¬ì©ìë C ++ ë° STL 컚í
ìŽë륌 ì¬ì©í ë ì ìëì§ ìì ëìì ë°©ì§íêž° ìíŽ SIMD ì í ëë SIMD ì íì í¬íšíë ì í ( Eigen3 docs )ìŒë¡ë¶í° 컚í
ìŽë륌 볎ížíŽìŒíë©° ëí ìì ì 볎ížíŽìŒí©ëë€. new
ì°ì°ì new
륌 ì€ë²ë¡ë©íì¬ ì íì ëíŽ new
new
ì ì¬ì©íìµëë€ ( ë ë§ì Eigen3 묞ì ).
@gnzlbg ê°ì¬í©ëë€. smallvec exmapleë íŒë ì€ë¬ì ìµëë€. ê·žê²ì ìì§ìŒ ììë ì í곌 Rustìì ìŒì¢ ì alloca륌 íìë¡ í ê²ì ëë€ .-- ë ê°ì RFC륌 ê²í íê³ ë ë§ì íì ìì ì --- ê·žëì ì§êžì ê·žê²ì ëíŽ ê³ ë¯Œíì§ ììµëë€. íìí 몚ë ì€í ê³µê°ì íì ì¬ì©íë êž°ì¡Ž smallvec ì ëµì íì¬ë¡ìë êŽì°®ì 볎ì ëë€.
ëí ìì ë 목ë¡ìì í ë¹ ìì ìë¡ìŽ êž°ë¥ì í ë¹ì륌 ì¬ì©íë 컬ë ì
ì ì íìê° ìë€ë @rkruppeì ëìí©ëë€. ëë¡ë ì 첎 Collection<Allocator>
ì ìë¡ìŽ ìì±ìŽ ìì§ë§ (ê³ ì ë ë©ëªšëŠ¬ì ìì í ì¡Žì¬íë€ê³ ê°ì íŽ ë³Žê² ìµëë€) í ë¹ì륌 ì¬ì©íë ê²ì ìì°ì€ë¬ìŽ 결곌ì
ëë€.
ì¬êž°ìì í ê°ì§ ììžë ëšìŒ í¬êž° / ì í ë§ í ë¹íë í ë¹ ìì
ëë€ (ì¬ë© í ë¹ ìì²ëŒ NVidiaëìŽ ìì
ì ìíí©ëë€). ìŒë° í ë¹ ìì ëíŽ í¬êŽì ìŒë¡ 구í ë ë³ëì ObjAlloc<T>
í¹ì± : impl<A: Alloc, T> ObjAlloc<T> for A
. ê·žë° ë€ì 컬ë ì
ì ëª ê°ì§ í목 ë§ í ë¹íŽìŒíë ê²œì° ObjAlloc 겜ê³ë¥Œ ì¬ì©í©ëë€. ê·žë¬ë ëë ëì€ì ížíì±ìê² ìë°©í¥ìŒë¡ í ì ììŽìŒíêž° ë묞ì ìŽê²ì ì êž°íë ê²ì¡°ì°š ë€ì ìŽëŠ¬ ìë€.
ë§ìŽ ëŒ?
ë¬Œë¡ ìŽì§ë§ ìŽë ìì±ìê° ìêž° ë묞ì Rustìë êŽë šìŽ ììµëë€. ë°ëŒì í¬ìží°ë¥Œ ì ë¬íë ë©ëªšëŠ¬ë¥Œ ì§ì í¬íšíë (ìŽë ê°ë¥í) í ë¹ìë ë¶ê°ë¥í©ëë€.
ì륌 ë€ìŽ C ++ììë ì€í í ë¹ ìì ê°ì ê²ìŽ ììŒë©Ž ë°ìŽë늬ì ì ì ë©ëªšëŠ¬ ìžê·žëšŒížì ë²¡í° ìì륌 ë£ì ì ììµëë€ (ìì§ìŽë¥Œ ìííë ì첎 컬ë ì ì ìì±í ì ìì).
ìŽê²ì íë ë³íê° ìëëë€. 컬ë ì ìŽ ë©ëªšëŠ¬ë¥Œ ê°ì ž ì€ë ìì¹ë¥Œ ì ìŽíë ââë°ë ì¬ë¬ ê°ì§ íë¹í ìŽì ê° ìì§ë§, 몚ë ì±ë¥, ë§ì»€ ì€í¬ëŠœíž, ì 첎 íë¡ê·žëšì ë©ëªšëŠ¬ ë ìŽìì ì ìŽ ë±ê³Œ ê°ì "ìžë¶ ìì"ì êŽë šìŽ ììµëë€.
alignment_allocatorì ê°ì ê²ì ë€ë¥ž í ë¹ì륌 ì¬ì©íì¬ ì ìëì§ ìì ëìì ížì¶íì§ ìê³ ìŽë¬í ì íì í í ë¹íê³ std 컬ë ì ì ë£ì ìë ììµëë€.
ìŽê²ìŽ ëŽê° Eigenì alignment_allocatorê° ìëëŒ TBBì cache_aligned_allocator륌 구첎ì ìŒë¡ ìžêž í ìŽì ì ëë€. cache_aligned_allocatorë 묞ììì í¹ì ì ë ¬ì 볎ì¥íì§ ìë ê² ê°ìµëë€ (ëšì§ "ìŒë°ì ìŒë¡"128 ë°ìŽížëŒê³ ë§íš). ê·žë ê²íëëŒë ìŒë°ì ìŒë¡ìŽ 목ì ìŒë¡ ì¬ì©ëì§ ììµëë€ (ì ë ¬ìŽ ìŒë°ì ë¹íŽ ë묎 íŽ ì ìêž° ë묞). íìŽì§ ì ë ¬ DMAì ê°ì 겜ì°ìë SIMD ì íìŽ ë묎 ììµëë€. ë¹ì ìŽ ë§íë¯ìŽ ê·žê²ì 목ì ì ê±°ì§ ê³µì 륌 íŒíë ê²ì ëë€.
ë¿¡ë¿¡
FWIW, íëŒ ë©ížëŠ í ë¹ìë í ë¹ì륌 구ííë ë° ë§€ì° ì ì©í©ëë€.
ë¬Žìš ë»ìžì§ ì¢ ë ììží ì€ëª íŽ ì£Œìê² ìµëê¹? Alloc í¹ì±ìŒë¡ ì¬ì©ì ì§ì í ë¹ì륌 ë§€ê° ë³ìí í ììë ìŽì ê° ììµëê¹? ëë ì¬ì©ì ì§ì í ë¹ ì í¹ì±ì ì¬ì©íê³ ìµì¢ í ë¹ ìì Alloc í¹ì±ì 구íí©ëë€ (ìŽ ë í¹ì±ìŽ ë°ëì ê°ì íìë ìì)?
ëª ííì§ ìì ê² ê°ìµëë€. ë ì ì€ëª íŽ ëëŠ¬ê² ìµëë€. ë€ì ì€ íë륌 ì¬ì©í ê²ìŒë¡ ììëë í ë¹ì륌 구ííë€ê³ ê°ì íŽ ë³Žê² ìµëë€.
ê·žëŠ¬ê³ ìŽ í ë¹ì륌 구ííêž° ìíŽ íë ìëìì Vec
륌 ì¬ì©íê³ ì¶ë€ê³ ê°ì íŽ ë³Žê² ìµëë€. ì ë Vec
ì€ëì²ëŒ ì§ì ì¬ì©í ì ììµëë€.
Vec
ê° ììµëë€.ë°ëŒì ëŽê° íìí ê²ì ê°ëší ëŽë¶ ë¶êž° êŽëŠ¬ë¥Œ ìíŽ ëŽë¶ì ìŒë¡ ì¬ì©íë ë€ë¥ž í ë¹ ììì ë§€ê° ë³ìí ë Vec
륌 ì¬ì©í ììë ê²ì
ëë€. ìŽê²ìŽ bsalloc ì 목íì
ëë€ (ìŽëŠì ì¶ì²-ë€ë¥ž í ë¹ì륌 ë¶íž ì€ížë©íë ë° ì¬ì©ëš).
elfmallocìì ì°ëŠ¬ë ì¬ì í ë€ìì íµíŽ êžë¡ë² í ë¹ìê° ë ì ììµëë€.
ìŽ ê²œì° ìì€í í ë¹ì륌 êžë¡ë² í ë¹ ìë¡ ì¬ì©íì¬ ì»ŽíìŒíì§ ìë ê²ìŽ ì€ìí©ëë€.ë¡ëëë©Ž ì¬ê· ì¢ ìì±ì ë€ì ëì í ê²ì ëë€. ê·ž ìì ìì ì°ëŠ¬ ë ìì€í í ë¹ ììŽêž° ë묞ì ëë€.
ê·žë¬ë ë€ì곌 ê°ì 겜ì°ìë ìëíì§ ììµëë€.
OTOH, C ++ íì€ì SIMD ì í곌 ê°ìŽ 곌ëíê² ì ë ¬ ë ì íì ì§ìíì§ ììŒë©° newë¡ í í ë¹ì ìëíë©Ž ì ìëì§ ìì ëìì ížì¶í©ëë€ (
posix_memalign
ëë ìŽì ì ì¬í ê²ì ì¬ì©íŽìŒ íš).
íì¬ Alloc
í¹ì±ì ì ë ¬ì ë§€ê° ë³ìë¡ ì¬ì©íë¯ë¡ìŽ 묞ì íŽëì€ ( "ë€ë¥ž ì ë ¬ ììŽë ìì
í ì ìì"묞ì )ê° ì¬ëŒì§ë€ê³ ê°ì í©ëë€.
@gnzlbg- í¬êŽì ìž êž (ê°ì¬í©ëë€)ìŽì§ë§ ìŽë€ ì¬ì© ì¬ë¡ë ì구 ë©ëªšëŠ¬ë¥Œ ë€ë£šì§ ììµëë€ *.
ìŽ ì¬ì© ì¬ë¡ 륌 ê³ ë €íŽìŒí©ëë€. í¹í, ì³ì ìŒìŽ 묎ììžì§ì ê°í ìí¥ì 믞칩ëë€.
'static
íìë ììµëë€.Rustë ì¬êž°ìì ìŽëì í°ëžë¥Œ ì¥ì íê³ HD, SSD ë° ì¬ì§ìŽ PCI ì°ê²° ì€í 늬ì§ë¥Œ ë첎 í ìŒë¥ íë«íŒìŒë¡ ë§ë€ ììë íë¥í êž°í륌 ê°ì§ê³ ììµëë€.
* ìµê·Œê¹ì§ ì¡°êž í¹ë³íêž° ë묞ì ëëì§ ììµëë€. ìŽì Linux, FreeBSD ë° Windowsìì ë늬 ì§ìë©ëë€.
ë¿¡ ë¹µëš
ìŽê²ì ì€ì ë¡ ì구 êž°ìµì íŽê²°íë ê³³ìŽ ìëëë€. ì륌 ë€ìŽ, ìŒë°ì ìž ì ê·Œ ë°©ìì ëšìí ë°ìŽí° 묎결ì±ì ìŽì ë¡ ë ë¹ ë¥ž ëì€í¬ì²ëŒ ì·šêžíë ê²ì ëë€.
ìŽë° ììŒë¡ ì구 ë©ëªšëŠ¬ë¥Œ ì¬ì©íë ì¬ì© ì¬ë¡ê° ìë€ë©Ž 뚌ì ë€ë¥ž ê³³ìì íŽë¹ ì¬ë¡ë¥Œ ë§ëë ê²ìŽ ì¢ìµëë€. íë¡í íì ì ë§ë€ê³ í ë¹ ì ìží°íìŽì€ì ëíë³Žë€ êµ¬ì²Žì ìž ë³ê²œ ì¬íì ì ìíê³ ìŽìì ìŒë¡ë ìŽë¬í ë³ê²œ ì¬íìŽ íê· ì¬ë¡ì 믞ì¹ë ìí¥ì ê°ì¹ê°ìë 겜ì°ë¥Œ ë§ëëë€.
ë¿¡ë¿¡
ëìíì§ ììµëë€. ìŽê²ìŽ ë°ë¡ ê·žê²ìŽ ìí ì¥ìì ëë€. ìŽì ì ë묎 ì¢íê³ ìŠê±°ë¥Œ ì°Ÿìì ëììžì ë§ëë ê²°ì ì ëŽëŠ¬ë ê²ì íŒíê³ ì¶ìµëë€.
ë®ì ìì€ì ì¬ì©ì ê³µê° ì§ìì ìíŽ ë§ì ë
žë ¥ìŽ ì§ì€ëë íì¬ì Intel PMDKë í ë¹ ë ìŒë° ë©ëªšëŠ¬ (í¬ìží°ê°ìë ìŒë° ë©ëªšëŠ¬)ë¡ íšì¬ ë ì ê·Œí©ëë€. ìŽë mmap
륌 íµí ê²ê³Œ ì ì¬í ë©ëªšëŠ¬ì
ëë€. ì€ì ë¡ Linuxìì ì구 ë©ëªšëŠ¬ë¡ ìì
íê³ ì¶ë€ë©Ž íì¬ë¡ìë ìŽê²ìŽ ê±°ì ì ìŒí ížì¶ í¬ížëŒê³ ìê°í©ëë€. 볞ì§ì ìŒë¡, ê·žê²ì ì¬ì©íêž°ìí ê°ì¥ ì§ë³Ž ë íŽí· ì€ íë-ë¹ì ìŽ ìí ê²œì° ë늬 ì¬ì©ëë íŽí·-ê·žê²ì í ë¹ ë ë©ëªšëŠ¬ë¡ ì·šêží©ëë€.
íë¡í íìŽíì êŽíŽìë-êžì, ëŽê° í ë§ìŽ ë°ë¡ ê·žê²ì ëë€ .
ìµê·Œì ì구 ë©ëªšëŠ¬ í ë¹ ì (í¹í 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 ++ ìžê³ (
ëŽê° ìžêž í alloctorë ëë¶ë¶ ë§ì ì¬ëë€ìŽ ì¬ì©íë ë§€ì° ìžêž°ìë ëŒìŽëžë¬ëŠ¬ìì ê°ì žìš ê²ì
ëë€).
ìží
SDK (ìŒë¶ ëŒìŽëžë¬ëŠ¬)ì ë
žë ¥ì ìê³ ìì§ë§
íê² C ++) ëë ê·žë€ì ì¬ì©íë íë¡ì ížë¥Œ ê°ìžì ìŒë¡ ìì§ ëª»í©ëë€.
std :: vectorì íšê» ì¬ì©í ììë í ë¹ ì? ëë 몚륞ë€). ìŽê±Ž ìëìŒ
ì¬ì©ëì§ ìê±°ë ì€ìíì§ ììì ì믞í©ëë€. ëë ìê³ ì¶ìŽì
íì§ë§ ëŽ ê²ì묌ì ìì ì ë§€ê° ë³ìí
컚í
ìŽëì ìí í ë¹ìë ë§€ì° ë³µì¡í©ëë€.
컚í
ìŽë 묞ì ë«ì§ ìê³ ìì€í
í ë¹ ìì ì§í
(íì§ë§ ëì€ì ë€ë€ìŒí©ëë€).
2018 ë 1 ì 21 ìŒ 17:36ì John Ericson [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 ì íìŽìŽìŒíë¯ë¡ ê°ì²Žì "íꎎ"ê° ì í ë°ìíì§ ììµëë€ (ë°ëŒì ìë©žìê° ì€íëì§ ìì).
í ì ììŽìŒí©ëë€. ëŽ ëšžëŠ¬ êŒëêž°ìì ê²œêž°ì¥ ì첎ì ëí íëì ê°ì²Žì 겜Ʞì¥ì íë ì ë¹ ížë€ ìž ë€ë¥ž ê°ì²Žê° íìí©ëë€. ê·žë° ë€ì íŽë¹ ížë€ì ëíŽ Alloc
륌 구ííê³ í ë¹ì ìíŽ ëì ìì€ì ìì í ëíŒë¥Œ ì¬ì©íë€ê³ ê°ì í©ëë€ (ì : Box
ê° Alloc
ìì ë§€ê° ë³ìê°ëë€ê³ ê°ì ). ìëª
ì íë ì ë¹ ížë€ìŽ ìì ëêž° ì ì í ë¹ ë 몚ë ê°ì²Žê° ìì ëìëì§ íìží©ëë€. dealloc
ë ì¬ì í ê° ê°ì²Žì ëíŽ ížì¶ëì§ë§ dealloc
ê° ìëíì§ ìë ê²œì° ì 첎 ìì ë° í ë¹ íŽì ë
ŒëŠ¬ê° ìì í ëë ëë¶ë¶ ìµì í ë ì ììµëë€.
Drop
구ííì§ ìë ì¬ì©ì ì§ì ì€ë§íž í¬ìží° ì íì ì¬ì©í ìë ììµëë€. ìŽë ê²íë©Ž ë€ë¥ž ê³³ìì ë§ì ìì
ìŽ ë ì¬ìì§ëë€.
ê°ì¬! ìë ê²ì묌ì ì€í륌 ë§ë€ììµëë€. 묌첎ì íêŽŽê° ìë€ê³ ë§íë ê²ì ëë€.
í ë¹ ìì ëí ì 묞ê°ê° ìëê³ ìŽ ì€ë ë륌 ë°ë¥Œ ììë ì¬ëë€ì ìíŽ íì¬ í©ìë 묎ìì ëê¹ : stdlib 컬ë ì ì íì ëí ì¬ì©ì ì§ì í ë¹ì륌 ì§ìí ê³íì ëê¹?
@alexreg ìµì¢
ê³íìŽ ë¬Žììžì§ ì ëªšë¥Žê² ì§ë§ ê·žë ê²íë ë° êž°ì ì ìž ìŽë €ììŽìë ê²ìŒë¡ íìžëììµëë€. ë€ìì ê·ž ë
žì¶ì OTOH ì°ëŠ¬ë ì¢ì ë°©ë²ìŽìë std
Ʞ볞 ì í ë³ìê° ìì¬íì§ë§ ë ê·žë¥ìê² ë§ë€êž°ì ì묎 묞ì ê° ìêž° ë묞ì alloc
ì§êž ì ë륌 ì ì© ìŒì ì°ëŠ¬ lib ìž¡ìì ë°©íŽë°ì§ ìê³ ì§íí ì ììµëë€.
@ Ericson2314 ì¢ìì, ë£êž° ì¢ìµëë€. Ʞ볞 ì í ë³ìê° ìì§ êµ¬íëìŽ ììµëê¹? ìëë©Ž RFC ëšê³ìì? ë¹ì ìŽ ë§íë¯ìŽ, ê·žë€ìŽ alloc / std::heap
곌 êŽë šë ê²ë€ë¡ ì íëë€ë©Ž 몚ë êŽì°®ì ê²ì
ëë€.
AllocErrìŽ ì€ë¥ ì¬ìŒíë€ê³ ìê°í©ëë€. ë€ë¥ž 몚ë (ì : io)곌 ë ìŒì¹í©ëë€.
impl Error for AllocError
ì (ë) ìë¯žê° ìê³ ìíì§ ìì§ë§ ê°ìžì ìŒë¡ Error
í¹ì±ìŽ ìžëªš ìë€ë ê²ì ë°ê²¬íìµëë€.
ì€ë Layout :: from_size_align íšìë¥Œë³Žê³ ììëë° " align
ë 2 ^ 31 (ìŠ 1 << 31
)ì ìŽê³ŒíŽìë ìë©ëë€."ì íìŽ ìŽíŽê°ëì§ ìììµëë€. ê·žëŠ¬ê³ git blameì # 30170ì ê°ëŠ¬ 쌰ìµëë€.
ëë ê·žê²ìŽ u32ì ë§ë align
ì ëíŽ ìŽìŒêž°íë ìë¹íêž°ë§ì ìž ì»€ë° ë©ìì§ëŒê³ ë§íŽìŒíë€. ìŽê²ì ëšì§ ì°ì°í ìŒìŽë€. ì€ì ë¡ "ê³ ì ë"(ë ë§ì ìì
)ìŽ ìì€í
í ë¹ìê° ì€ìëíë 겜ì°ìŽë€.
"OSX / alloc_system is buggy on huge alignments"í목ì íìžíŽìë ìë©ëë€ . ì§ì ì ìž ë¬žì ê° íŽê²°ëìì§ë§ ì¥êž°ì ìŒë¡ë ìì ìŽ ì³ë€ê³ ìê°íì§ ììµëë€. ìì€í í ë¹ìê° ì못 ìëíë€ê³ íŽì ìëíë í ë¹ì륌 구í íë ê²ì ë§ììë ìë©ëë€. ê·žëŠ¬ê³ Layout :: from_size_alignì ëí ììì ì íìŽìŽë¥Œ ìíí©ëë€.
@glandium 4GB ìŽìì ë°°ìë¡ ì ë ¬ì ìì²íë ê²ìŽ ì ì©í©ëê¹?
4GiB í ë¹ì 4GiBì ë§ì¶ê³ ì¶ì 겜ì°ë¥Œ ììí ì ììµëë€. ìŽê²ì íì¬ ë¶ê°ë¥íì§ë§ ê±°ì ë ìŽì ê°ë¥íì§ ììµëë€. íì§ë§ ì§êžì ê·žë° ìŽì 륌 ìê°íì§ ìëë€ê³ íŽì ììì ìž ì íìŽ ì¶ê°ëìŽìŒíë€ê³ ìê°íì§ ììµëë€.
4GiB í ë¹ì 4GiBì ë§ì¶ê³ ì¶ì 겜ì°ë¥Œ ììí ì ììµëë€.
ê·ž 겜ì°ë 묎ìì ëê¹?
4GiB í ë¹ì 4GiBì ë§ì¶ê³ ì¶ì 겜ì°ë¥Œ ììí ì ììµëë€.
ê·ž 겜ì°ë 묎ìì ëê¹?
구첎ì ìŒë¡ë, Ië ììë¡ í° ì ë ¬ììí ì§ìì ì¶ê° mmap-alloc
ì ì¬ì©íêž°ìí í° ë©ëªšëŠ¬ ì ë ¬ ìí í ë¹ì ì§ìíêž° ìíŽ elfmalloc
. ììŽëìŽë ë©ëªšëŠ¬ ì¬ë©ì í¬êž°ì ë§ê² ì ë ¬íì¬ íŽë¹ ì¬ëëžìì í ë¹ ë ê°ì²Žì ëí í¬ìží°ê° 죌ìŽì§ë©Ž í¬íšíë ì¬ëëžë¥Œ ì°Ÿêž° ìíŽ íì ë¹ížë¥Œ ë§ì€í¹íêž° ë§íë©Žë©ëë€. ì°ëŠ¬ë íì¬ í¬êž°ê° 4GB ìž ì¬ëëžë¥Œ ì¬ì©íì§ ììµëë€ (í° ê°ì²Žì ê²œì° mmapìŒë¡ ì§ì ìŽë), ê·žë ê² í ììë ìŽì ê° ììŒë©°, ê·žë ê²íë €ë í° RAM ì구 ì¬íìŽìë ì í늬ìŒìŽì
ì ìì í ììí ììììµëë€. ìŠ, mmapì ì€ë² í€ë륌 íì©íì§ ììë§íŒ ì죌 ë€ì€ GB ê°ì²Žë¥Œ í ë¹ í 겜ì°ì
ëë€.
> 4GiB ì ë ¬ì ëí ê°ë¥í ì¬ì© ì¬ë¡ë ë€ì곌 ê°ìµëë€. í° íìŽì§ 겜ê³ì ì ë ¬. 4GiB ìŽìì íìŽì§ë¥Œ ì§ìíë íë«íŒìŽ ìŽë¯ž ììµëë€. ìŽ IBM 묞ìììë "POWER5 + íë¡ìžìë 4KB, 64KB, 16MB ë° 16GBì 4 ê°ì§ ê°ì ë©ëªšëŠ¬ íìŽì§ í¬êž°ë¥Œ ì§ìí©ëë€."ëŒê³ ë§í©ëë€. x86-64ë ë©ì§ ììµëë€. "ê±°ëí íìŽì§"ë ìŒë°ì ìŒë¡ 2MiBìŽì§ë§ 1GiBë ì§ìí©ëë€ .
Alloc ížë ìŽ ížì 몚ë ì íìŽ ì§ì ëì§ ìì íšìë *mut u8
í©ëë€. ìŠ, ë í¬ìží°ë¥Œ ê°ì ž ì€ê±°ë ë°í í ì ììŒë©° 몚ë ì§ì¥ìŽ í늎 ê²ì
ëë€. ëì NonNull
륌 ì¬ì©íŽìŒí©ëê¹?
ê·žë€ìŽ 몚ë ì§ì¥ìì ëìì¬ ììë ë§ì í¬ìží°ê° ììµëë€.
íì¶íë€.
2018 ë
3 ì 4 ìŒ ìŒììŒ ì€ì 3:56 Mike Hommey [email protected] ì ë€ì곌 ê°ìŽ ìŒìµëë€.
Alloc ížë ìŽ ížì 몚ë ì íìŽ ì§ì ëì§ ìì íšìë * mut u8ì ì²ëŠ¬í©ëë€.
ìŠ, ë í¬ìží°ë¥Œ ê°ì ž ì€ê±°ë ë°í í ì ììŒë©° 몚ë ì§ì¥ì
íì¶íë€. ëì NonNullì ì¬ì©íŽìŒí©ëê¹?â
ë¹ì ìŽ ìžêž ëìêž° ë묞ì ìŽê²ì ë°ê³ ììµëë€.
ìŽ ìŽë©ìŒì ì§ì ëµì¥íê³ GitHubìì íìžíìžì.
https://github.com/rust-lang/rust/issues/32838#issuecomment-370223269 ,
ëë ì€ë ë ììê±°
https://github.com/notifications/unsubscribe-auth/ABY2UR2dRxDtdACeRUh_djM-DExRuLxiks5ta9aFgaJpZM4IDYUN
.
NonNull
륌 ì¬ì©íë ë ì€ëë ¥ìë ìŽì ë Alloc
ë©ìëìì íì¬ ë°í ë Result
s (ëë Options
ì ííë©Ž 믞ë) ë ìê².
NonNullì ì¬ì©íë ë ì€ëë ¥ìë ìŽì ë Alloc ë©ìëìì íì¬ ë°í ë 결곌 (ëë ëì€ì ìµì ìŒë¡ ì í í ê²œì° ìµì )ê° ë ìì ì§ ì ìêž° ë묞ì ëë€.
AllocErr
ìë ë ê°ì§ ë³íìŽ ìêž° ë묞ì ê·žë ê² ë ê²ìŽëŒê³ ìê°íì§ ììµëë€.
몚ë ì§ì¥ìŽ í늎 ììë ë§ì í¬ìží°ê° ììµëë€.
ê·žë¬ë ë í¬ìží°ë ë€ë¥ž í¬ìží°ë³Žë€ ë¶ëª í ë ì못ëììµëë€.
ë
¹ ì í ìì€í
ìŽ í걎ì ëììŽëë©° ë¶ë³ì ìžìœë©íë ë° ì¬ì©ëë€ê³ ìê°í©ëë€. alloc
ëí 묞ììë "ìŽ ë©ìëê° Ok(addr)
ë°ííë©Ž ë°í ë addrë nullìŽ ìë 죌ìê°ë©ëë€."ëŒê³ ëª
ìëìŽ ìì§ë§ ë°í ì íì ê·žë ì§ ììµëë€. ì¬ì€, Ok(malloc(layout.size()))
ì ë¶ëª
í ê·žë ì§ ìì ê²œì° ì íší 구íì
ëë€.
Layout
í¬êž°ì ëí ë©ëªšë 0ìŽ ìëìŽìŒíë¯ë¡ NonZeroë¡ ìžìœë©íŽìŒí©ëë€.
몚ë êž°ë¥ìŽ 볞ì§ì ìŒë¡ ìì íì§ ììì ì°ëŠ¬ê° í걎 ìë°©ìíì§ ë§ììŒíë ê²ì ìëëë€.
í ë¹ì륌 ì¬ì© (ížì§ : ë° êµ¬í) í ë ë°ìí ììë 몚ë ì€ë¥ ì€ìì ë í¬ìží°ë¥Œ ì ë¬íë ê²ì ì¶ì íêž° ê°ì¥ ì¬ìŽ ë°©ë² ì€ íëì ëë€ (ìµìí MMUê° ìê³ ìííì§ ìì ê²œì° íì ì ì°žì¡°ì 깚ëí segfault륌 ì»ìµëë€). ê·žê²ìŒë¡ ë§€ì° ìŽìí ê²ë€), ê·žëŠ¬ê³ ìŒë°ì ìŒë¡ ê³ ì³ìŒ í ê°ì¥ ì¬ìí ê²ë€ ì€ íëì ëë€. ìì íì§ ìì ìží°íìŽì€ê° í걎ì ë§ìŒë € ê³ í ì ìë€ë ê²ì ì¬ì€ìŽì§ë§,ìŽ í걎ì ë€ë¥ž ê°ë¥í ì€ë¥ì ë¹êµí ë, ì í ìì€í ìììŽ ë¶ë³ì ìžìœë©íë ììží ì ëì ë¹íŽ ë¶ê· í ì ìŒë¡ ìì 볎ì ëë€.
ê²ë€ê° í ë¹ ì 구íì "ì±ë¥ì ìíŽ" NonNull
ì íìžëì§ ìì ìì±ì륌 ì¬ì©íë ê² ê°ìµëë€. ì¬ë°ë¥ž í ë¹ ìììë ìŽìšë nullì ë°ííì§ ììŒë¯ë¡ NonNell::new(...).unwrap()
륌 걎ë ë°ê³ ì¶ì ê²ì
ëë€. ìŽ ê²œì° ì€ì ë¡ ìŽë€ ì íì í걎 ìë°©ë ì»ì§ 못í©ëë€. (ì€ì ëŒë©Ž Result
ì¬ìŽìŠ ííì ì¬ì í ââê·žëŽë§ í ìŽì ê° ë ì ììµëë€.)
í ë¹ ì 구íì NonNullì íìžëì§ ìì ìì±ì륌 ì¬ì©í©ëë€.
ìì ì í ë¹ ì 구íì ëë ê²ìŽ ì¬ì©ì륌 ëë ê²ë³Žë€ ì ìµëë€. MyVec
ì NonNull<T>
ìê³ Heap.alloc()
ìŽë¯ž NonNull
ë°ííë ê²œì° íìž ëë ìì íì§ ìì íìžëì§ ìì ížì¶ ì€ íë륌 ë§ë€ìŽìŒí©ëë€.
í¬ìží°ë ë°í ì íìŒë¿ë§ ìëëŒ dealloc
ë° realloc
ì
ë ¥ ì íìŽêž°ëí©ëë€. ìŽë¬í íšìë ì
ë ¥ìŽ nullìžì§ ìëì§ì ëíŽ ê°íëìŽìŒí©ëê¹? 묞ìë ìëì€ëŒê³ ë§íë 겜í¥ìŽ ìì§ë§ ì í ìì€í
ì ìëŒê³ ë§íë 겜í¥ìŽ ììµëë€.
layout.size ()ì ë§€ì° ì ì¬í©ëë€. í ë¹ íšìë ìì² ë í¬êž°ë¥Œ ìŽë»ê² ë 0ìŒë¡ ì²ëŠ¬íŽìŒí©ëê¹?
(ì€ì ìž ê²œì° ê²°ê³Œ í¬êž° ìŽì ì ì¬ì í ââê·ž ìŽì ê° ë ì ììµëë€.)
í¬êž° ìŽì ìŽ ìëì§ ìì¬ ì€ëœì§ë§ # 48741곌 ê°ì ìœë ìì± ìŽì ìŽ ììµëë€.
API ì¬ì©ììê² ë ì ì°íë€ë ìì¹ì ê³ìíë€ë©Ž, í¬ìží°ë ë°í ì íìì NonNull
ìŽìŽìŒíì§ë§ ìžììë í¬íšëì§ ìììŒí©ëë€. (ìŽê²ì ìŽë¬í ìžìê° ë°íìì null ê²ì¬ë¥Œ ë°ììŒ íšì ì믞íì§ ììµëë€.)
ëë Postelì ë²ì¹ ì ê·Œë²ìŽ ì¬êž°ì ì·šíêž°ì ì못ë ê²ìŽëŒê³ ìê°í©ëë€. ììŽì
Alloc ë©ìëì ë í¬ìží°ë¥Œ ì ë¬íë ê²ìŽ ì íší 겜ì°? ê·žë ì§ ìë€ë©Ž
ê·ž ì ì°ì±ì Ʞ볞ì ìŒë¡ í걎ì ìœê° ë
믌ê°í ížëŠ¬ê±°.
2018 ë 3 ì 5 ìŒ ì€ì 8ì, "Simon Sapin" [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 ë©ìëì ë í¬ìží°ë¥Œ ì ë¬íë ê²ìŽ ì íší 겜ì°ê° ììµëê¹? ê·žë ì§ ìë€ë©Ž ê·ž ì ì°ì±ì Ʞ볞ì ìŒë¡ í걎ì ìœê° ë 믌ê°í ížëŠ¬ê±°ë¥Œ ì ê³µí©ëë€.
ì¬ì©ì ë ë°ëì 묞ì륌 ìœê³ ë¶ë³ì±ì ìŒëì ëìŽìŒí©ëë€. ë§ì ë¶ë³ì±ì ì í ìì€í ì íµíŽ ì í ì ì© í ì ììµëë€. ê°ë¥íë€ë©Ž íšìë ì²ìë¶í° ìì íì§ ìì ê²ì ëë€. ë°ëŒì ìŽê²ì 죌ìŽì§ ìží°íìŽì€ì NonNullì ë£ë ê²ìŽ ì€ì ë¡ ì¬ì©ììê² ëììŽëëì§ì ëí ì§ë¬žì ëë€.
ëë ì륌 ë€ìŽ,ì ìžì ë§ëë ìŽë€ ê°ì ìŽ íìëì§ ìë dealloc
ë¡ NonNull
. ìŽ APIì ì¬ì© íŽëì€ë ëëµ ë ê°ì§ì
ëë€.
alloc
륌 ížì¶íê³ ë°í ë í¬ìží°ë¥Œ ìŽëê°ì ì ì¥íê³ ì ì í ì ì¥ë í¬ìží°ë¥Œ dealloc
ì ë¬íë ë¹êµì ì¬ìí ì¬ì©ì
ëë€.dealloc
ì ì¬ë°ë¥ž ê²ì ì ë¬íë ë° ì€ìí ë
ŒëŠ¬ê° í¬íšë©ëë€.ì¬êž°ì NonNull
륌 ì¬ì©íë©Ž Ʞ볞ì ìŒë¡ 첫 ë²ì§ž ì íì ì¬ì© ì¬ë¡ìë§ ëììŽë©ëë€. NonNull
륌 ë©ì§ ì¥ìì ì ì¥íê³ ë³ê²œíì§ ìê³ NonNull
ì ë¬íêž° ë묞ì
ëë€. ìŽë¡ ì ìŒë¡ë (íµê³Œ ì€í ë°©ì§ í ì foo
ë¹ì ìŽ ì믞íë ê²œì° bar
ê·žë€ ì€ ë¹ì ìŽìë ê±° ì êžë§ ì¬ë¬ í¬ìží°ì íëì 겜ì°) NonNull
, ê·žë¬ë ìŽê²ìíì§ ìë ê² ë묎 ííê±°ë ì€ìí©ëë€. dealloc
ìì í¬ìží° ( alloc
ë°í NonNull
ê° @SimonSapin ìŽ ì 륌 ì€ëíë€ê³ ê°ì íš)ì ëšì ì as_ptr
ê° íìíë€ë ê²ì
ëë€. ì ì¬ì ìŒë¡ ì±ê° ìì§ë§ ìì ì±ì ìí¥ì 믞ì¹ì§ ìë dealloc ížì¶.
ë ë²ì§ž ì¢
ë¥ì ì¬ì© ì¬ë¡ë ì 첎 íë¡ìžì€ìì NonNull
ê³ì ì¬ì©í ì ìêž° ë묞ì ëììŽëì§ ììŒë¯ë¡ ì»ì ìì í¬ìží°ìì NonNull
륌 ìëìŒë¡ ë€ì ë§ë€ìŽìŒí©ëë€. ìŽë€ ë°©ë² ìŒë¡ë . ìì ìžêžíë¯ìŽ ìŽê²ì ì€ì ì€í ìê° íìžìŽ ìë íìžëì§ ìì / unsafe
죌ì¥ìŽ ë ê°ë¥ì±ìŽ ëìŒë¯ë¡ í ê±ŽìŽ ë°©ì§ëì§ ììµëë€.
ìŽê²ì ëŽê° ìì í¬ìží°ë¥Œ ì·šíë dealloc
ì ì°¬ì±íë€ê³ ë§íë ê²ìŽ ìëëë€. ëë í걎ì ëíŽ ì£Œì¥ ë ìŽì ì ë³Žì§ ëª»íìµëë€. ì íì ìŒêŽì±ì ìë§ë Ʞ볞ì ìŒë¡ ì¹ëŠ¬ í ê²ì
ëë€.
믞ìíì§ë§ "ë§ì ë¶ë³ì ì í ìì€í ì íµíŽ ì í ì ì© í ì ììµëë€ ... ê·žë¬ë¯ë¡ ìëëíì§ ë§ì"ëŒê³ ìœììµëë€. ì벜í ê²ìŽ ì ì ì ìŽëëë¡ ëì§ ë§ììì€!
NonNull
ì ê³µíë 볎ìŠê³Œ NonNull
ì ìì í¬ìží° ì¬ìŽë¥Œ ìë€ë¡ ì ííŽìŒíë ìžì²Ž ê³µíì ìì€ ì¬ìŽì ì 충ì ì ëí ê²ì
ëë€. ëë ìŽë 쪜ë í¹ë³í ê°í ì견ì ê°ì§ê³ ìì§ ììµëë€. ìŽë 쪜ë ë¶í©ëŠ¬ íŽ ë³ŽìŽì§ ììµëë€.
@cramertj ì,íì§ë§ ì ë ê·žë° ì¢
ë¥ì ë
Œìì ì ì 륌 ì€ì ë¡ ì¬ì§ë ììµëë€. ì¬ëë€ì Alloc
ìŽ ëªšížíê³ , ìšê²šì ž ììŒë©°, ëì²Žë¡ ìì íì§ ìì ì¬ì© ì¬ë¡ëŒê³ ë§í©ëë€. êžìì, 몚ížíê³ ìœêž° ìŽë €ìŽ ìœëììë ê°ë¥í í ë§ì ìì ì ìí©ëë€ .-- ì íí ê·žë€ìŽ ê±°ì ë§ì§ì§ ìêž° ë묞ì ìë ì ìê° ì£Œë³ì ìì ê°ë¥ì±ìŽ ìêž° ë묞ì
ëë€. ë°ëë¡ ìœëê° ëª ë
íì ìœ íë©Ž ìžì²Ž ê³µíì ë§ì³ ëìŒììì€. ì€íë € ë¹ìì°ì ì
ëë€. ìœëë ë§€ì° ëª
ì ì ìŒë¡ ìì±íì¬ ìµìíì§ ìì ë
ìê° ì§êµ¬ììì ë¬Žìš ìŒìŽ ìŒìŽëê³ ìëì§ ë ì ìŽíŽí ì ìëë¡ ë
žë ¥íŽìŒí©ëë€. ë ì ì ìì <ë ëª
íí ë¶ë³.
ë ë²ì§ž ì¢ ë¥ì ì¬ì© ì¬ë¡ë ì 첎 íë¡ìžì€ìì
NonNull
ê³ì ì¬ì©í ì ìêž° ë묞ì ëììŽëì§ ììŒë¯ë¡ ì»ì ìì í¬ìží°ììNonNull
륌 ìëìŒë¡ ë€ì ë§ë€ìŽìŒí©ëë€. ìŽë€ ë°©ë² ìŒë¡ë .
ìŽê²ì êž°ì ì ìž ë¶ê°íŒì±ìŽ ìëëŒ ëšìí ì¡°ì ì€íšì
ëë€. ë¬Œë¡ ì§êžì ìì íì§ ìì ë§ì APIê° ìì í¬ìží°ë¥Œ ì¬ì©í ì ììµëë€. ëê° ëŠ¬ëíë ê·žëì ë°©ë²ì ì¬ì©íì¬ ë°ìŽë ìží°íìŽì€ë¡ ì í NonNull
ëë ë€ë¥ž ëíŒë¥Œ. ê·žë¬ë©Ž ë€ë¥ž ìœëê° ë ìœê² ë°ëŒê° ì ììµëë€. ëë 귞늰 íë, ìì ë
¹ì¬ê³ , ìì íì§ ìì ìœëìì ìœêž° ìŽë µê³ ì ìµíì§ ìì ìì í¬ìží°ë¡ ê³ìíŽì ëëì ê° ìŽì ê° ìë€ê³ ëŽ
ëë€.
ìë íìžì!
Rust 컀ì€í
í ë¹ ìì ìì±ì / êŽëŠ¬ìë¡ì ì ë NonNull
ì°¬ì±í©ëë€. ìŽ ì€ë ëì ìŽë¯ž ë°°ì¹ ë 몚ë ìŽì ë묞ì
ëë€.
ëí @glandium ì firefoxì jemalloc í¬í¬ì êŽëŠ¬ììŽë©° í ë¹ ìì ëí íŽí¹ 겜íë
@ Ericson2314 ì ë€ë¥ž ì¬ëë€ìê² íšì¬ ë ë§ìŽ NonNull
ì ìì ìŽì ì 곌ì¥íë€ê³ ìê°íë ê²ì ëíŽ ë
Œìíìµëë€ (ë¬Œë¡ ë€ë¥ž ìŽì ë ììµëë€). ê·žë ë€ê³ ìì ìì ìŽì ìŽ ìë€ê³ ë§íë ê²ì ìëì§ë§ @cramertjê° ë§íë¯ìŽ ížë ìŽë ì€íê° ììŒë©° "íë¡"ìž¡ë©ŽìŽ ê³Œì¥ë ê² ê°ìµëë€. ì êŽê³ììŽ, ëë ìŽë¯ž ëŽê° ì¬ì© í¥íë€ ë§íë€ NonNull
ì ì€ ìŽì @SimonSapinììí - ë€ë¥ž ìŽì ë¡ ë€ìí ì¥ììì alloc
ìì dealloc
ìŒêŽì±. ê·žë¬ë ë ìŽì ì ì ìì ë²ìŽëì§ ë§ì.
몚ë ì¬ëìŽ ì°žì¬íë NonNull
ì¬ì© ì¬ë¡ê° ëª ê°ì§ ìë€ë©Ž ì¢ì ììì
ëë€.
ì°ëŠ¬ë ìë§ ì
ë°ìŽíž í ì ììµëë€ Unique
ì¬ì©íê³ ì¹êµ¬ë¥Œ NonNull
ëì NonZero
ëŽìì ìµìíì ë§ì°°ì ì ì§íêž° ìíŽ liballoc
ë®ì. ê·žë¬ë ìŽê²ì ì°ëŠ¬ê° í ë¹ ìì ëí íëì ì¶ìí ìì€ìì ìŽë¯žíê³ ìë ê²ì²ëŒ 볎ìŽë©° í ë¹ ì ìì€ììë ìŽê²ìíì§ ìë ìŽì 륌 ìê°í ì ììµëë€. ëìê² í©ëŠ¬ì ìž ë³í ìž ê² ê°ìµëë€.
( Unique<T>
ì NonNull<T>
ì¬ìŽìì ìì íê² ë³ííë From
ížë ìŽ ížì ë ê°ì§ 구íìŽ ìŽë¯ž ììµëë€.)
ìì ì ìž ë ¹ìì í ë¹ ì APIì ë§€ì° ì ì¬í ê²ìŽ íìíë€ë ì ì ê³ ë €íì¬ ë ¹ ì ì¥ììì ìœë륌 ì¶ì¶íì¬ ë³ëì ììì ë£ììµëë€.
ìŽ / could /ë APIì ì€íì ë³ê²œì ë°ë³µíë ë° ì¬ì©í ì ìì§ë§ íì¬ë¡ìë rust ì ì¥ìììë ëŽì©ì ìŒë° ì¬ë³žì ëë€.
[Off topic] ë€, std
ê° ížëŠ¬ìì ìì ë ìœë ìì륌 ì¬ì©í ì ìë€ë©Ž ì¢ì ê²ì
ëë€. ê·žëì ìì ë ìœëìì ë¶ìì í ìží°íìŽì€ë¥Œ ì€í í ì ììµëë€. ìŽê²ìŽ ì ê° ìžêŽì std
ê°ë ê²ì ì¢ìíë ìŽì ì€ íëì
ëë€.
std
ë crates.ioì í¬ë ìŽíž ë³µì¬ë³žì ìì¡Ž í ì ìì§ë§ íë¡ê·žëšìŽ ê°ì í¬ë ìŽížì ìì¡Žíë€ë©Ž ìŽìšë rustcì ê°ì í¬ë ìŽíž / ì í / í¹ì±ì²ëŒ 볎ìŽì§ ìì ê²ì
ëë€. ê·žê²ìŽ ìŽë»ê² ëììŽ ë ì§ ë³Žì§ ëª»íìµëë€. ìŽìšë íì¬ëì êŽê³ììŽ ìì ë ì±ëìì ë¶ìì í êž°ë¥ì ì¬ì©í ì ìê² ë§ëë ê²ì ì¬ê³ ê° ìëëŒ ë§€ì° ì ì€í ì íì
ëë€.
NonNullì ì¬ì©íë ë° ëìíë ê² ê°ìµëë€. ìŽê²ìŽ ì€ì ë¡ ìŒìŽë ììë ë°©ë²ì 묎ìì ëê¹? ê·žë¥ í볎íëê±°ìŒ? RFC?
묎êŽíê² Boxingìì ìì± ë ìŽì ëžëŠ¬ë¥Œ ìŽíŽ 뎀ëë° ì€ë¥ 겜ë¡ê° ìë¹í íœëë€. ê·žê²ì ëíŽ ëê°íŽìŒí©ëê¹?
ì :
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ì ââëí ì§ì ížì¶ìë°ì ë€ì, ìŒë°ì ìŒë¡ ë ê°ì movqì í ê°ì lea ìž oom ì€ë¹ ìœëë¡ ì ííëì§ íìžíê³ AllocErrì ì±ì°ê³ ê·ž 죌ì륌 ê°ì ž ì€ë null ê²ì¬ë¥Œë°ìµëë€. __rust__oom
ì ì ë¬í©ëë€. ìŽê²ì 볞ì§ì ìŒë¡ ìµìì ìë늬ì€ìŽì§ë§ ë ê°ì 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
íšì륌 ì ê±°íì§ ììµëë€ ( -C passes=mergefunc
ìì RUSTFLAGS
-C passes=mergefunc
ë¡ ìë).
ê·žë¬ë í° ì°šìŽë¥Œ ë§ëë ê²ìì ìì±ì ë ë, ì§ì íìŽìŽ íì€ íµíì mallocíê² actualy 묎ì ìž LTO ìž AllocErr
ížì¶íêž° ì ì ì€ë¥žìªœì __rust_oom
. ëí í ë¹ì륌 ížì¶íêž° ì ì Layout
ë¶íìíê² ë§ë€ê³ AllocErr
ì±ìž ë ëšê²š ë¡ëë€.
ìŽë¡ ìžíŽ __rust_oom
ì ìžíê³ ë í ë¹ êž°ë¥ìŽ ìžëŒìžìŒë¡ íìëìŽìŒíë€ê³ ìê°í©ëë€.
BTW, íìŽìŽ íì€ì ëíŽ ìì± ë ìœëë¥Œë³Žê³ íë ë°, ëë ìŽìì ìŒë¡ ì¬ì©íë ê²ìŽ ë°ëì§ í ê²ìŽëŒê³ ìê°íê³ ììŽì moz_xmalloc
ëì malloc
. ìŽê²ì í ë¹ ì í¹ì±ì ì¡°í©ììŽ ì ì í í ë¹ì ë첎 í ììë ê²ì ë¶ê°ë¥íì§ë§ í ë¹ ì í¹ì±ì ëí ì¬ì©ì ì§ì ì€ë¥ ì íì ëí ê°ë¥í íì ì ê³µ : moz_xmalloc
묎ì€íê³ ê²œì°ì ê²°ìœ ììµì ì€íš. IOW, OOM ì첎륌 ì²ëŠ¬íê³ ìŽ ê²œì° Rust ìœëë __rust_oom
륌 ížì¶ í íìê° ììµëë€. ì íì ìŒë¡ ëìê°ë €ë©Ž í ë¹ êž°ë¥ììí ê²ìŽ ë°ëì§ í ê²ìŽë€ !
ëì AllocErr
.
ì°ëŠ¬ë AllocErr
í¬êž°ê° 0 ìž êµ¬ì¡°ì²Žë¡ ë§ëë ê²ì ëíŽ ë
Œìíìµëë€. ì¬êž°ììë ëììŽ ë ê²ì
ëë€. í¬ìží°ë NonNull
륌 ë§ë€ë©Ž ì 첎 ë°í ê°ìŽ í¬ìží° í¬êž°ê° ë ì ììµëë€.
https://github.com/rust-lang/rust/pull/49669 ë ì ì í ë¹ì륌 í¬íšíë íì ì§í©ì ìì ííë ê²ì 목íë¡ ìŽë¬í API륌 ì¬ë¬ ê°ì§ ë³ê²œí©ëë€. íŽë¹ íì ì§í©ì ëí ì¶ì 묞ì : https://github.com/rust-lang/rust/issues/49668. í¹í ìë¡ìŽ GlobalAlloc
í¹ì± ìŽ ëì
ëììµëë€.
ìŽ PRì íµíŽ 곧 alloc: Alloc
ìì Vec::new_with_alloc(alloc)
ê°ì ìŒì í ì ììµëê¹?
ížì ëŽì ê°êž°
@sfackler í , ì ìëŒ? ê·žë¬êž° ì ì 묎ììŽ íìí©ëê¹? ëšìí êžë¡ë² í ë¹ì륌 ë³ê²œíë ê²ìŽ ìëëŒë©ŽìŽ PRì ìì ì ì ì ììµëë€.
ë¿¡ë¿¡
ëšìí êžë¡ë² í ë¹ì륌 ë³ê²œíë ê²ìŽ ìëëŒë©ŽìŽ 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ì ìžêž ë ìœë ìì± "묞ì "ë # 49669ì ë³ê²œ ì¬í곌 íšê» ì¬ëŒì žìŒí©ëë€.
ìŽì ê³ìžµìì í ë¹ì륌 구ííë ë° ëììŽëë Alloc
í¹ì±ì ì¬ì©íë ê²ì ëíŽ ì¢ ë ìê°íŽ 볎멎 (ì ìŽë ëìê²ë) ì ì© í ê²ìŽëŒê³ ìê°íë ë ê°ì§ê° ììµëë€.
AllocErr
ì íì ì§ì í ì ììµëë€. ìŽë !
ìŒë¡ ë§ë€ê±°ë ìŽì AllocErrìŽ ë¹ìŽ ììŒë¯ë¡ ì íì ìŒë¡ "ì€íš"ë³Žë€ ë ë§ì ì 볎륌 ì ë¬íëë¡íë ë° ì ì© í ì ììµëë€.Layout
ì íì ì§ì í ì ììµëë€. í ë¹ ìì ë ê³ìžµìŽ ìë€ê³ ê°ì íŽë³Žììì€. íëë íìŽì§ í ë¹ ì©ìŽê³ ë€ë¥ž íëë ë í° ìì ì©ì
ëë€. íìë ì ìì ìì¡Ž í ì ìì§ë§ ë ë€ ëìŒí Layout
ì íì ì¬ì©íë ê²œì° ë ë ìŽìŽ 몚ë ì첎 ì íšì± ê²ì¬ë¥Œ ìííŽìŒí©ëë€. ê°ì¥ ë®ì ìì€ìì íŽë¹ í¬êž°ì ì ë ¬ì íìŽì§ í¬êž°ì ë°°ìì
ëë€. ë ëì ìì€ììë ê·ž í¬êž°ì ì ë ¬ìŽ ë í° ì§ìì ì구 ì¬í곌 ìŒì¹í©ëë€. ê·žë¬ë ìŽë¬í ìíë ì€ë³µë©ëë€. í¹ìí ë Layout
ì íì ì¬ì©íë©Ž í ë¹ ì ìì²Žê° ìë Layout
ìì±ì ì íšì± ê²ì¬ë¥Œ ìì í ì ììŒë©° Layout
ì í ê°ì ë³íì íµíŽ ì€ë³µ ê²ì¬ë¥Œ 걎ë ëž ì ììµëë€.@cramertj @SimonSapin @glandium ì¢ìì, ëª íí íŽì£Œì ì ê°ì¬í©ëë€. ë€ë¥ž 컬ë ì íëŒì ì íì ëí PRì ì ì¶í ìë ììµëë€. allocator-api repo / crate, @glandium ëë rust ë§ì€í°ì ì¢ ìµëê¹?
@alexreg # 49669ì Alloc
í¹ì±ì ëí 죌ì ë³ê²œ ì¬íì ìì ê³ ë €íë©Ž 뚌ì ë³í© ë ëê¹ì§ êž°ë€ëŠ¬ë ê²ìŽ ì¢ìµëë€.
@glandium 충ë¶í©ëë€. ì°©ë¥ìì ë묎 ë©ì§ ìì ê² ê°ìµëë€. ë°©êž https://github.com/pnkfelix/collections-prime repo륌 ë°ê²¬íìµëë€ ... ë¹ì ì ê²ê³Œ êŽë šíì¬ ë¬Žìì ëê¹?
ìŽëŠ° ì§ë¬žì íë ë ì¶ê°íê² ìµëë€.
Alloc::oom
ì (ë) ë¹í© í ì ììµëê¹? íì¬ ë¬žìììëìŽ ë°©ë²ìŽ íë¡ìžì€ë¥Œ ì€ëšíŽìŒíë€ê³ ë§í©ëë€. í ë¹ì륌 ì¬ì©íë ìœëë ë©ëªšëŠ¬ ëìììŽ ì ì íê² íŽì 륌 ì²ëŠ¬íëë¡ ì€ê³ëìŽìŒíêž° ë묞ì ìŽë ìë¯žê° ììµëë€.ë¡ì»¬ í ë¹ ìì ì€íšê° ë°ëì êžë¡ë² í ë¹ ìë ì€íšíë€ë ê²ì ì믞íì§ë ìêž° ë묞ì íšëì íì©íŽìŒíë€ê³ ìê°í©ëë€. ìµì
ì ê²œì° ì ì í ë¹ ìì oom
ê° ížì¶ëìŽ íë¡ìžì€ë¥Œ ì€ëší©ëë€ (ê·žë ì§ ììŒë©Ž êž°ì¡Ž ìœëê° ììëš).
@alexreg ìëìì. std / alloc / collectionsììë ëŽì©ì ìŒë° ì¬ë³ž ìž ê² ê°ìµëë€. êžìì, 2 ë
ë ì¬ë³žì
ëë€. ëŽ ììë ë²ìê° íšì¬ ë ì íì ì
ëë€ (ê²ì ë ë²ì ìë ëª ì£Œ ì ì Alloc
í¹ì± ë§ ìê³ ë§ì€í° ëžëì¹ìë RawVec
ë° Box
. ëŽ ëª©í ì€ íëë ìì ì ìž ë
¹ìŒë¡ 걎묌ì ì ì§íë ê²ì
ëë€.
@glandium ì¢ì,ìŽ ê²œì° PRìŽ ëì°©í ëê¹ì§ êž°ë€ëŠ° ë€ì ë ¹ ë§ì€í°ì ëí PRì ìì±íê³ í귞륌 ì§ì íë©Ž ë§ì€í°ë¡ ë³í©ëëìꞰ륌 ì ì ììµëë€ (ê·žë° ë€ì ììì ë³í© í ì ìì). , ê³µì í?
@alexreg ìŽ ìë¯žê° ììµëë€. ì§êž ìì ì / í ìë ìì§ë§ / ìì ê±° íëŠ¬êž°ê° íŽë¹ PRìì ìí©ì ë³ê²œíë©Ž ì¬ì©ì쪜ì ìœê°ì ìŽíì ì ë°í ì ììµëë€.
@glandium ì§êžì Rustë¡ ë°ìê²
Alloc :: oomìŽ ë¹í© í ì ììµëê¹? íì¬ ë¬žìììëìŽ ë°©ë²ìŽ íë¡ìžì€ë¥Œ ì€ëšíŽìŒíë€ê³ ë§í©ëë€. í ë¹ì륌 ì¬ì©íë ìœëë ë©ëªšëŠ¬ ëìììŽ ì ì íê² íŽì 륌 ì²ëŠ¬íëë¡ ì€ê³ëìŽìŒíêž° ë묞ì ìŽë ìë¯žê° ììµëë€.
@Amanieu ìŽ RFCë ë³í©ëììµëë€ : https://github.com/rust-lang/rfcs/pull/2116 묞ìì 구íìŽ ìì§ ì ë°ìŽížëì§ ììì ì ììµëë€.
PR ì ì¶ì ê³ ë €íê³ ìë APIì ëí ë³ê²œ ì¬íìŽ íë ììµëë€.
Alloc
í¹ì±ì "구í"곌 "ëì°ë¯ž"ì ë ë¶ë¶ìŒë¡ ëëëë€. ì ìë alloc
, dealloc
, realloc
ë±ê³Œ ê°ì íšììŽê³ íìë alloc_one
, dealloc_one
, alloc_array
ë±. íìì ëí ì¬ì©ì ì ì 구íì í ì ìë€ë ê°ì€ì ìž ìŽì ìŽ ìì§ë§, ê°ì¥ ìŒë°ì ìž ì구ìë ê±°ëŠ¬ê° ë©ê³ ìŒë° ëíŒë¥Œ 구ííŽìŒ í ë (ì ë 믿ì ì ìì ì ëë¡ ìŒë°ì ìŽë©°, ì€ì ë¡ ì¬ì©ì ì§ì íìì ìì±íêž° ììí ìì ê¹ì§) ë©íŒê° ì¬ì©ì ì§ì ì ìí í ì ììŒë¯ë¡ ì¬ì í 몚ë í목ì 구ííŽìŒí©ëë€.
OTOH, Alloc
ížë ìŽ íž êµ¬íìê° ì륌 ë€ìŽ alloc_one
ìì ë©ì§ ìŒìíë €ê³ íë©Ž íŽë¹ í ë¹ì ëíŽ dealloc_one
ê° ížì¶ ë ê²ìŽëŒë 볎ì¥ìŽ ììµëë€. ì¬êž°ìë ì¬ë¬ ê°ì§ ìŽì ê° ììµëë€.
raw_vec
ë alloc_array
, alloc
/ alloc_zeroed
ì íŒí©ì ì¬ì©íì§ë§ dealloc
ë§ ì¬ì©í©ëë€.alloc_array
/ dealloc_array
륌 ìŒêŽëê² ì¬ì©íëëŒë Vec
륌 Box
ë¡ ìì íê² ë³í í ë€ì dealloc
륌 ì¬ì©í ì ììµëë€ alloc_one
/ alloc_array
0 ë²ì ìì).ë°ëŒì ì륌 ë€ìŽ alloc_one
ì 묞í륌ìí ì€ì ì¬ì© ì¬ë¡ê° ìì§ë§ (ì¬ì€ì ì ë mozjemallocìŽ íìí©ëë€) ëì í¹ì í ë¹ì륌 ì¬ì©íë ê²ìŽ ì¢ìµëë€.
ì¬ì€, ê·žê²ì ë ëìë€, rust repoìì ì íí 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ì í ê°ì§ ë³ê²œ ì¬íìŽ ììµëë€.
# 50436ìì ê·žë ê²íìµëë€.
@glandium
(ê·žëŠ¬ê³ ì¬ì€, ëë mozjemallocì ââëí ê·žë¬í íìê° ììµëë€),
ìŽ ì¬ì© ì¬ë¡ì ëíŽ ììží ì€ëª íŽ ì£Œìê² ìµëê¹?
mozjemallocìë ìëì ìŒë¡ ëì¶ëë Ʞ볞 í ë¹ìê° ììµëë€. ë¬Žë£ ëª©ë¡ì ì ì§íë í ì¢
ë¥ì ê°ì²Žë¥Œ ì ìžíê³ . alloc_one
ížëŠì ìííë ëì í ë¹ì륌 ê³ìžµííì¬ìŽë¥Œ ìí í ì ììµëë€.
í ë¹ í ì íí ì ë ¬ë¡ í ë¹ì íŽì íŽìŒí©ëê¹?
ìŽ ì§ë¬žì ëí ëµìŽ ' ì 'ëŒë ê²ì ê°ì¡°íêž° ìíŽ Microsoft ì첎 ìì ë€ì곌 ê°ì ë©ì§ ìžì©ë¬žìŽ
alignment_alloc ()ì C11ìŽ êµ¬í곌 ížíëì§ ìë ë°©ììŒë¡ ì§ì íêž° ë묞ì ì ë 구íëì§ ìì ê²ì ëë€ (ìŠ, free ()ê° ê³ ëë¡ ì ë ¬ ë í ë¹ì ì²ëŠ¬ í ì ââììŽìŒ íš).
Windowsìì ìì€í í ë¹ì륌 ì¬ì©íë©Ž ê³ ëë¡ ì ë ¬ ë í ë¹ì ì¬ë°ë¥Žê² í ë¹ íŽì íêž° ìíŽ í ë¹ì íŽì í ë íì ì ë ¬ì ìììŒí©ëë€. ê·žë¬ë©Ž íŽë¹ ì§ë¬žì íŽê²° ë ê²ìŒë¡ íì í ì ììµëê¹?
Windowsìì ìì€í í ë¹ì륌 ì¬ì©íë©Ž ê³ ëë¡ ì ë ¬ ë í ë¹ì ì¬ë°ë¥Žê² í ë¹ íŽì íêž° ìíŽ í ë¹ì íŽì í ë íì ì ë ¬ì ìììŒí©ëë€. ê·žë¬ë©Ž íŽë¹ ì§ë¬žì íŽê²° ë ê²ìŒë¡ íì í ì ììµëê¹?
ë¶ëë¬ìŽ ìŒìŽì§ë§ ê·žëë¡ì ëë€. ê·žë¬ë©Ž 곌ëíê² ì ë ¬ ë 벡í°ë¥Œ í¬êž°í©ìë€. : íŒë :
곌ëíê² ì ë ¬ ë 벡í°ë¥Œ í¬êž°íê³
ìŽì§žì? ê³Œë€ ì ë ¬ë¡ í ë¹ ë° í ë¹ íŽì íë Vec<T, OverAlignedAlloc<U16>>
ììŒë©Žë©ëë€.
ìŽì§žì? ê³Œë€ ì ë ¬ë¡ í ë¹ ë° í ë¹ íŽì íë
Vec<T, OverAlignedAlloc<U16>>
ììŒë©Žë©ëë€.
ëë ë 구첎ì ìŽìŽìŒíë€. ëë ìŠ, 컚ížë¡€ì API륌 ìžë¶ì ìì í overaligned 벡í°ë¥Œ ìŽë ì믞 Vec<T>
íì§ Vec<T, OverAlignedAlloc<U16>>
. (ì : CString::new()
.)
ì°šëŒëŠ¬ ì¬ì©íŽìŒí©ëë€
#[repr(align(16))]
struct OverAligned16<T>(T);
ê·žë° ë€ì Vec<OverAligned16<T>>
.
ì°šëŒëŠ¬ ì¬ì©íŽìŒí©ëë€
조걎ì ë°ëŒì. f32
ì 벡í°ì 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>>
ì ëšìŒ ììì ê²œì° ë ì ê·Œ ë°©ììŽ ë ëë±íë©° ë ë²ì§ž ì ê·Œ ë°©ììŽ ì€ì ë¡ ë ë°ëì§ í ì ììµëë€. ìŽìšë ë ê°ì§ ìµì
ì 몚ë ê°ë ê²ìŽ ì¢ìµëë€.
Alloc í¹ì±ììŽ wrt ë³ê²œ ì¬íì ê²ìíìµëë€. https://internals.rust-lang.org/t/pre-rfc-changing-the-alloc-trait/7487
ìŽ ë¬žì ì ìëšììë ì¶ì ê²ì묌ì ë§€ì° ì€ëëììµëë€ (2016 ë ì ë§ì§ë§ìŒë¡ ížì§ ëš). í ë¡ ì ìì°ì ìŒë¡ ê³ìíë €ë©Ž ì ë°ìŽíž ë íì± êŽì¬ì¬ 목ë¡ìŽ íìí©ëë€.
í ë¡ ì ëí íì¬ íŽê²°ëì§ ìì ì§ë¬žê³Œ ì€ê³ ê²°ì ì ëí ê·Œê±°ê° í¬íš ë ìµì ì€ê³ 묞ìë¡ë¶í° ìë¹í ìŽì ì ì»ì ì ììµëë€.
ì¬ë¬ ì±ë (rfc repo, rust-lang ì¶ì 묞ì , êžë¡ë² í ë¹ RFC, ëŽë¶ ê²ì묌, ë§ì í° PR ë±), GlobalAlloc
RFCìì ìì íëê³ ìë ê²ì ìë RFCìì ì ì ë ê²ê³Œ í¬ê² ë€ë¥Žì§ ììµëë€.
ìŽê²ì ì°ëŠ¬ê° 묞ìì ì°žì¡° ì ë°ìŽížë¥Œ ëëŽêž° ìíŽ ìŽìšë íìíë©° íì¬ í ë¡ ììë ëììŽ ë ê²ì ëë€.
Alloc
ížë ìŽ íž ìì íì ëíŽ ìê°íêž° ì ì 뚌ì 몚ë íì€ ëŒìŽëžë¬ëŠ¬ 컬ë ì
ìì í ë¹ ì ì§ìì 구ííŽìŒíë€ê³ ìê°í©ëë€. ìŽê²ì ì°ëŠ¬ìê²ìŽ í¹ì±ìŽ ì€ì ë¡ ìŽë»ê² ì¬ì© ë ì§ì ëí ìœê°ì 겜íì ì€ ê²ì
ëë€.
Alloc
ížë ìŽ íž ìì íì ëíŽ ìê°íêž° ì ì 뚌ì 몚ë íì€ ëŒìŽëžë¬ëŠ¬ 컬ë ì ìì í ë¹ ì ì§ìì 구ííŽìŒíë€ê³ ìê°í©ëë€. ìŽê²ì ì°ëŠ¬ìê²ìŽ í¹ì±ìŽ ì€ì ë¡ ìŽë»ê² ì¬ì© ë ì§ì ëí ìœê°ì 겜íì ì€ ê²ì ëë€.
ë€ ê·žëŒì. í¹í Box
ë Box<T, A>
ê° ë ëšìŽë¥Œ ì°šì§íì§ ìëë¡íë ë°©ë²ì ìì§ ìì§ ëª»íêž° ë묞ì
ëë€.
ë€ ê·žëŒì. í¹í Box, ì°ëŠ¬ë ìì§ Box륌 íŒíë ë°©ë²ì 몚륎Ʞ ë묞ì
ë ëšìŽë¥Œ ì·šíììì€.
ìŽêž° 구íì ìíŽ 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 í¹ì± ìì íì ëíŽ ìê°íêž° ì ì 뚌ì 몚ë íì€ ëŒìŽëžë¬ëŠ¬ 컬ë ì ìì í ë¹ ì ì§ìì 구ííŽìŒíë€ê³ ìê°í©ëë€. ìŽê²ì ì°ëŠ¬ìê²ìŽ í¹ì±ìŽ ì€ì ë¡ ìŽë»ê² ì¬ì© ë ì§ì ëí ìœê°ì 겜íì ì€ ê²ì ëë€.
@ Ericson2314 ê° https://github.com/rust-lang/rust/issues/42774 ì ë°ëŒ ìŽì ëíŽ ìì íê³ ìë€ê³ ìê°
ìŽêž° 구íì ìíŽ
Box<T, A>
ì í¬êž°ë¥Œ ê±±ì í íìë ìë€ê³ ìê°í©ëë€.íì§ë§ ìŽê²ì ëì€ì ì§ìíëDeAlloc
í¹ì±ì ì¶ê°íì¬ ìŽì ë²ì 곌 ížíëë ë°©ììŒë¡ ì¶ê° í ì ììµëë€. í ë¹ íŽì .
ê·žê²ì íëì ì ê·Œ ë°©ììŽì§ë§ ê·žê²ìŽ íì€í ìµê³ ì ì ê·Œ ë°©ììŽëŒë ê²ìŽ ì í ë¶ëª
íì§ ììµëë€. ê·žê²ì í¬ìží° ëë§ ìë)ë ê²ì, ì륌 ë€ìŽ, ë³ê°ì ëšì ì ê°ì§ê³ ììµëë€ -> í ë¹ ì¡°íê° ê°ë¥íë€ (ìŽê²ì, ì륌 ë€ìŽ, ëë¶ë¶ì ê²œêž°ì¥ í ë¹ ì) ë°, B)ì ì¬ì€ìŽ ìëë€ ê·žê²ì ìë¹í ì€ë² í€ë륌 ì¶ê° dealloc
(ìŠ, ìë°©í¥ ì¡°í ìí). ê·žê²ììŽ ë¬žì ì ëí ìµì ì íŽê²°ì±
ì ê°ì ìŒë°ì ìž ëª©ì ì íšê³Œ ë ìí©ì ë§ë ìì€í
ìž ê²œì° ëëê² í ììë€ ìŽ ì ì ëë ìŽ ì ìì . ìëë©Ž ì í ë€ë¥ž ê²ìŒ ìë ììµëë€. ê·žëì ì ë ìŽê²ìŽ Alloc
í¹ì±ì íì¬ íì 곌 ì ížíëë ë°©ììŒë¡ íŽê²°íêž° ì¬ìž ê²ìŽëŒê³ ìê°íŽìë ìë©ëë€.
@joshlf Box<T, A>
ìŽ ëë¡ ë ëë§ ìì ì ì¡ìžì€ í ì ìë€ë ì¬ì€ì ê³ ë €í ë ìŽê²ìŽ ìì í ìœëë¡ë§ í ììë ê°ì¥ ì¢ì ë°©ë²ì
ëë€. ìŽë¬í íšíŽì dealloc
ê°ìë ìë ëì ê°ì í ë¹ ìì ì ì© í ì ììŒë©° í ë¹ìê° ìì ë ë ë©ëªšëŠ¬ ë§ í볎 í ì ììµëë€.
í ë¹ìê° ì»ší
ìŽë (ì : LinkedList
)ê° ìì íê³ ì¬ë¬ í ë¹ì êŽëŠ¬íë ë ë³µì¡í ìì€í
ì ê²œì° Box
ê° ëŽë¶ì ìŒë¡ ì¬ì©ëì§ ìì ê²ìŒë¡ ììí©ëë€. ëì , LinkedList
ëŽë¶ë LinkedList
ê°ì²Žì í¬íš ë Alloc
ìžì€íŽì€ì íšê» í ë¹ëê³ íŽì ëë ìì í¬ìží°ë¥Œ ì¬ì©í©ëë€. ìŽë ê²íë©Ž 몚ë í¬ìží°ì í¬êž°ê° ë ë°°ê°ëë ê²ì ë°©ì§ í ì ììµëë€.
Box<T, A>
ìŽ ëë¡ ë ëë§ ìì ì ì¡ìžì€ í ì ìë€ë ì¬ì€ì ê³ ë €í ë ìŽê²ì ìì í ìœëë¡ë§ í ììë ê°ì¥ ì¢ì ë°©ë²ì ëë€. ìŽë¬í íšíŽìdealloc
ê°ìë ìë ëì ê°ì í ë¹ ìì ì ì© í ì ììŒë©° í ë¹ìê° ìì ë ë ë©ëªšëŠ¬ ë§ í볎 í ì ììµëë€.
ë§ìµëë€.íì§ë§ Box
ì dealloc
ìŽ (ê°) ìëíì§ ìëë€ë ê²ì 몚ëŠ
ëë€.
í ë¹ìê° ì»ší ìŽë (ì :
LinkedList
)ê° ìì íê³ ì¬ë¬ í ë¹ì êŽëŠ¬íë ë ë³µì¡í ìì€í ì ê²œì° Boxê° ëŽë¶ì ìŒë¡ ì¬ì©ëì§ ìì ê²ìŒë¡ ììí©ëë€. ëì ,LinkedList
ëŽë¶ëLinkedList
ê°ì²Žì í¬íš ëAlloc
ìžì€íŽì€ì íšê» í ë¹ëê³ íŽì ëë ìì í¬ìží°ë¥Œ ì¬ì©í©ëë€. ìŽë ê²íë©Ž 몚ë í¬ìží°ì í¬êž°ê° ë ë°°ê°ëë ê²ì ë°©ì§ í ì ììµëë€.
컬ë ì
ì ìì±íêž° ìíŽ ìì íì§ ìì ìœë륌 ì¬ì©íëë¡ ì구íë ê²ì ì ë§ ë¶ëë¬ìŽ ìŒìŽëŒê³ ìê°í©ëë€. 목íê° ëªšë 컬ë ì
(ìë§ë íì€ ëŒìŽëžë¬ëŠ¬ ìžë¶ì 컬ë ì
í¬íš)ì í ë¹ ììì ì íì ìŒë¡ ë§€ê° ë³ìííë ê²ìŽê³ Box
ê° í ë¹ ì ë§€ê° ë³ìê° ìë ê²œì° ì»¬ë ì
ìì±ìë Box
ì¬ì©íì§ ìììŒí©ëë€.
ë§ì§ë§ Boxë deallocìŽ ìëíì§ ìëë€ë ê²ì ëªšëŠ ëë€.
C ++ unique_ptr
ê°íë ìŒì ì ì ìíì§ ììµëê¹?
ìŠ, "ìí ì ì¥"ìž ê²œì° í ë¹ ìì ëí í¬ìží°ë¥Œ ì ì¥íê³ í ë¹ìê° "ìí ë¹ ì ì¥"ìž ê²œì° ì ì¥íì§ ììµëë€.
(ì : malloc
ëë mmap
죌ìì ì ì ëíŒ).
ìŽê²ì íì¬ Alloc
íë šì StatefulAlloc
ë° StatelessAlloc
ë ê°ì§ í¹ì±ìŒë¡ ë¶í íŽìŒí©ëë€.
ëë ê·žê²ìŽ ë§€ì° ë¬Žë¡íê³ ì°ìíì§ ìë€ë ê²ì ìê³ ììµëë€ (ê·žëŠ¬ê³ ìë§ë ëêµ°ê°ê° ìŽë¯ž ìŽì í ë¡ ìì ê·žê²ì ì ìíì ê²ì
ëë€).
ì°ìíì§ ìììë ë¶êµ¬íê³ ìŽ ì룚ì
ì ëšìíê³ ìŽì ë²ì 곌 ížíë©ëë€ (ì±ë¥ ì íììŽ).
컬ë ì ì ìì±íêž° ìíŽ ìì íì§ ìì ìœë륌 ì¬ì©íëë¡ ì구íë ê²ì ì ë§ ë¶ëë¬ìŽ ìŒìŽëŒê³ ìê°í©ëë€. 목íê° ëªšë 컬ë ì (ìë§ íì€ ëŒìŽëžë¬ëŠ¬ ìžë¶ì 컬ë ì í¬íš)ì í ë¹ ììì ì íì ìŒë¡ ë§€ê° ë³ìë¡ ë§ëë ê²ìŽê³ Boxê° í ë¹ ì ë§€ê° ë³ìê° ìë ê²œì° ì»¬ë ì ìì±ìë Box륌 ì í ì¬ì©íì§ ìê±°ë ìì íì§ ìì ìœë륌 ì¬ì©íŽìŒí©ëë€ (ê·žëŠ¬ê³ íì ë¹ì ëë ê²ì êž°ìµíë ê²ì Cì C ++ìì ê°ì¥ ìŒë°ì ìž ë©ëªšëŠ¬ ìì íì§ ìì ì í ì€ íëìŽë¯ë¡ ìì íì§ ìì ìœë륌 ì ëë¡ ê°ì ž ì€êž°ê° ìŽë µìµëë€). ê·žê²ì ë¶íí ê±°ëì²ëŒ 볎ì ëë€.
목ë¡, ížëŠ¬ ë±ê³Œ ê°ì ë
žë êž°ë° ì»ší
ìŽë륌 ìì íê² ìì±í ììë íšê³Œ ëë 컚í
ì€íž ìì€í
ì 구ííë ë° ë묎 ë§ì ìê°ìŽ 걞늎 ì ììµëë€ (ìì¹ì ìŒë¡ ê°ë¥íë€ë©Ž).
ìŽ ë¬žì 륌 ë€ë£šë ë
Œë¬žìŽë íì ìžìŽë¥Œ ë³Žì§ ëª»íìµëë€ (ì€ì ë¡ ê·žë¬í ìì
ìŽ ì¡Žì¬íë ê²œì° ìì íŽì£Œììì€).
ë°ëŒì ë
žë êž°ë° ì»ší
ìŽë륌 구íí ë unsafe
ì ìì¡Žíë ê²ì ì ìŽë ëšêž°ì ìž êŽì ììë íìí ì
ìí¥ì ë¯žì¹ ì ììµëë€.
@eucpp unique_ptr
ë í ë¹ì륌 ì ì¥íì§ ìê³ Deleter
ì ì¥í©ëë€ .
ìì ìë FunctionObject ëë FunctionObjectì ëí lvalue ì°žì¡°ìŽê±°ë functionì ëí lvalue ì°žì¡° ì¬ìŒíë©° unique_ptr ì íì ìžìë¡ ížì¶ ê°ë¥íŽìŒí©ëë€.
:: í¬ìží°`
ìŽê²ì ì°ëŠ¬ê° ë¶í Alloc
ë° Dealloc
ížë ìŽ ížë¥Œ ì ê³µíë ê²ê³Œ ê±°ì ëìŒíë€ê³ ìê°í©ëë€.
@cramertj ë€, ë§ìì. ì¬ì í ìí ì ì¥ ë° ìí ë¹ ì ì¥ Dealloc
ë ê°ì§ í¹ì±ìŽ íìí©ëë€.
ZST DeallocìŒë¡ 충ë¶íì§ ììµëê¹?
2018 ë
6 ì 12 ìŒ íììŒ ì€í 3:08 Evgeniy Moiseenko [email protected]
ìŒë€ :
@cramertj https://github.com/cramertj ë€, ë§ìµëë€. ê·žëë ë
í¹ì±ìŽ íìí©ëë€-Stateful ë° Stateless 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ìì ꜀ ìë¡ìŽ ì¬ëìŽìŽì ëª
ë°±í ì€ìì ëíŽ ì£ì¡í©ëë€.
Stateful곌 Statelessì ëíŽ ë³ëì í¹ì±ìŽ íìíë€ê³ ìê°íì§ ììµëë€.
íšê» Box
ë¡ ë³Žê° A
ì
ë ¥ ë§€ê° ë³ì, ê·žê²ì ê°ìŽ í¬íšë ê²ìŽë€ A
ì§ì ì ìŽì§ ì°žì¡° ëë í¬ìží° A
. ìŽ ì íì ìí ë¹ ì ì¥ (ë¹) í ë¹ ìì ëíŽ í¬êž°ê° 0 ìŒ ì ììµëë€. ëë A
ì첎ë ì¬ë¬ í ë¹ ë ê°ì²Žê°ì ê³µì í ììë ìí ì ì¥ í ë¹ ìì ëí ì°žì¡° ëë ížë€ê³Œ ê°ì ê²ìŒ ì ììµëë€. ë°ëŒì impl Alloc for MyAllocator
ëì impl<'r> Alloc for &'r MyAllocator
ê°ì ìì
ì ìí í ì ììµëë€.
귞걎 ê·žë ê³ , í ë¹ íŽì ë°©ë² ë§ ìê³ í ë¹ ë°©ë²ì 몚륎ë Box
ë Clone
구ííì§ ììµëë€.
ê·ž êž°ë @SimonSapin Clone
ë§ëë ê²ì ë€ì í ë¹ì ì§ì í íì 볎ëŽê³ , ê°ì ë°©ë²ìŒë¡ ìë¡ìŽ Box
(ìŠ, ê·žê²ì ì¬ì©íì¬ ìíëì§ ìì ê² Clone
í¹ì±).
@cramertj Vec
ë° Clone
륌 구ííë ë€ë¥ž 컚í
ìŽëì ë¹êµí ë ìŒêŽì±ìŽ ìì§ ììµëê¹?
ìžì€íŽì€ ì ì¥ì ëšì ì 묎ìì
ëê¹ Alloc
ëŽë¶ Box
볎ë€ë Dealloc
?
ê·žë¬ë©Ž Box
ì clone_with_alloc
ë¿ë§ ìëëŒ Clone
륌 구íí ì ììµëë€.
ëë ìŽê²ìŽ ë¶í í¹ì±ìŽ ì€ì ë¡ íŽë¡ ì í° ìí¥ì 믞ì¹ì§ë ììµëë€-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
ë§ì°¬ê°ì§ì
ëë€.
ì¢ ë ììží ìŽíŽë³Žë©Ž ì ìŽë í ìì€ ìŽìì ìííë €ë ê²œì° hackyì ë¶ê°ë¥ ì¬ìŽì ëìŒí íë¡ìžì€ ë²ì ëŽìì copy-on-write íìŽì§ë¥Œ ë§ëë ì ê·Œ ë°©ìì²ëŒ 볎ì
ëë€. ë°ëŒì alloc_copy
ì í° ìŽì ìŽ ìëëë€.
ëì 믞ëì ê°ì ë©ëªšëŠ¬ íì륌 íì©íë ë ìŒë°ì ìž íì¶êµ¬ê° ì ì© í ì ììµëë€. ìŠ, í ë¹ìŽ í¬ê³ , ìŽìšë mmapì ìíŽ ë·ë°ì¹šëê³ ìí ë¹ ì ì¥ìŽë©Ž í ë¹ìë í ë¹ì ëí í¥í ë³ê²œ ì¬íì ìì§ ëª»íëë¡ ìœì í ì ììµëë€. ê·žë° ë€ì ì¬ì©ìë íŽë¹ ë©ëªšëŠ¬ë¥Œ íìŽíë¡ ìŽëíê±°ë 맀íì íŽì íê±°ë ìŽì ì ì¬í ê²ì í ì ììµëë€.
ëë ë©ì²í mmap-all-the-things í ë¹ ìì try-transfer íšìê°ìì ì ììµëë€.
ëì 믞ëì ê°ì ë©ëªšëŠ¬ë¥Œ íì©íëë³Žë€ ìŒë°ì ìž íì¶êµ¬
ë©ëªšëŠ¬ í ë¹ ì (malloc, jemalloc, ...)ë ìŒë°ì ìŒë¡ ë©ëªšëŠ¬ìì ìŽë€ ì¢ ë¥ì ë©ëªšëŠ¬ë íì¹ëë¡ íì©íì§ ììŒë©° ìŒë°ì ìŒë¡ ìì ìŽ ìì í ë©ëªšëŠ¬ì ìì±ì 쿌늬íê±°ë ë³ê²œí ì ììµëë€. ê·žë ë€ë©ŽìŽ ìŒë°ì ìž íì¶êµ¬ë ë©ëªšëŠ¬ í ë¹ ìì ìŽë€ êŽë šìŽ ììµëê¹?
ëí ê°ì ë©ëªšëŠ¬ ì§ìì íë«íŒë§ë€ í¬ê² ë€ë¥Žêž° ë묞ì ê°ì ë©ëªšëŠ¬ë¥Œ íšê³Œì ìŒë¡ ì¬ì©íë €ë©Ž ì¢ ì¢ ìì í ë€ë¥ž 볎ì¥ê³Œ íšê» íë«íŒë§ë€ ë€ë¥ž ìê³ ëŠ¬ìŠìŽ íìí©ëë€. ê°ì ë©ëªšëŠ¬ì ëí ìŽì ê°ë¥í ì¶ìí륌 볎ìì§ë§ "ìŽëì±"ìŒë¡ ìžíŽ ìŒë¶ ìí©ìì ìžëªšê° ìì ì ëë¡ ììëì§ ìì ê²ì ìì§ ë³Žì§ ëª»íìµëë€.
ë€ê° ì³ì. ìŽë¬í ì¬ì© ì¬ë¡ (ëë¶ë¶ íë«íŒ ë³ ìµì í륌 ìê°íê³ ììì)ë ì²ìì ì¬ì©ì ì§ì í ë¹ì륌 ì¬ì©íë ê²ìŽ ê°ì¥ ì¢ìµëë€.
Andrei Alexandrescuê° CppCon íë ì í ìŽì ìì ì€ëª í Composable Allocator APIì ëí ìê²¬ìŽ ììµëê¹? ë¹ëì€ë ì¬êž° YouTubeìì 볌 ì ììµëë€ : https://www.youtube.com/watch?v=LIb3L4vKZ7U (ê·žë 26:00 겜ì ê·žì ì ì ë ëììžì ì€ëª íêž° ììíì§ë§, ê·ž ìŽìŒêž°ë ë¹ì ìŽ ê·žê²ì 볎ë ê²ì ì íž í ìììë§íŒ 충ë¶í ì¬ë¯ž ììµëë€) .
ìŽ ëªšë ê²ì íŒí ììë ê²°ë¡ ì 컬ë ì ëŒìŽëžë¬ëŠ¬ê° ìŒë°ì ìž WRT í ë¹ìŽìŽìŒíê³ ì± íë¡ê·žëëšž ìì ìŽ ê±Žì€ íì¥ìì í ë¹ ìì 컬ë ì ì ìì ë¡ê² êµ¬ì± í ì ììŽìŒíë€ë ê²ì ëë€.
Andrei Alexandrescuê° CppCon íë ì í ìŽì ìì ì€ëª í Composable Allocator APIì ëí ìê²¬ìŽ ììµëê¹?
íì¬ Alloc
API륌 ì¬ì©íë©Ž êµ¬ì± ê°ë¥í í ë¹ ì (ì : MyAlloc<Other: Alloc>
)륌 ìì±í ì ììŒë©° í¹ì± ë° ì 묞í륌 ì¬ì©íì¬ Andreis í í¬ìì ë¬ì± í ê±°ì 몚ë ê²ì ë¬ì± í ì ììµëë€. ê·žë¬ë ê·žë ê² í ì ììŽìŒíë€ë "ììŽëìŽ"륌 ëìŽì, Andreiê° API륌 ë¹ëíë ë°©ììŽ ì ìœìë ì ë€ëŠ + SFINAE / ì ì (ì²ìë¶í° ìì ë° Rustì ì ë€ëŠ ìì€í
)ì ìêž° ë묞ì Andreiì ìŽìŒêž°ìì ê±°ì ì묎ê²ë 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 êŽì°®ì 볎ìŽì§ë§ìŽ 묞ì ë ìŽë¯ž ê±°ëí©ëë€. ê°ë³ì ìŒë¡ FCP í ììë ë³ëì 묞ì (ëë ìì í PR)륌 ì ì¶íë ê²ì ê³ ë € íìê² ìµëê¹?
(í ë¹ ì implsì 겜ì°) : í ë¹ ì ê°ì ìŽëíë©Ž 믞íŽê²° ë©ëªšëŠ¬ ëžë¡ìŽ 묎íšíëì§ ìììŒí©ëë€.
몚ë íŽëŒìŽìžížë ìœëìì ìŽê²ì ê°ì í ì ììµëë€.
ë°ëŒì íŽëŒìŽìžížê° í ë¹ ììì ëžë¡ì í ë¹ í ë€ì (a1ìŽëŒê³ íš) a1ìŽ ì ìì¹ (ì : vialet a2 = a1;)ë¡ ìŽëíë©Ž íŽëŒìŽìžížê° a2륌 íµíŽ íŽë¹ ëžë¡ì í ë¹ì íŽì íë ê²ì ìëŠ¬ê° ëšìµëë€.
ìŽê²ì í ë¹ ìê° Unpin
ìŽìŽìŒ íšì ì믞í©ëê¹?
ì ì¡ì!
Alloc
ížë ìŽ ížê° ì¬ì í ë¶ìì íêž° ë묞ì RFCììŽ ë¶ë¶ì ìì íê³ ì¶ë€ë©Ž ì¬ì í ê·ì¹ì ë³ê²œíŽìŒíë€ê³ ìê°í©ëë€. ê·žë¬ë ì€ì ë¡ ëª
ì¬íŽìŒ í ì¬íì
ëë€.
@gnzlbg ì, ì ë€ëŠ ìì€í ì í° ì°šìŽì ì ìê³ ììŒë©° ê·žê° ììží ì€ëª íë 몚ë ê²ìŽ Rustìì ëìŒí ë°©ììŒë¡ 구í ë ììë ê²ì ìëëë€. ê·žëë ê²ì묌ì ì¬ëŠ° ìŽíë¡ ëìêŽìì ìŒíê³ ììŒë©° ì¢ì ì§ì ì 볎ìŽê³ ììµëë€.
ìŽê²ì í ë¹ìê° _must_
Unpin
ì¬ìŒ íšì ì믞í©ëê¹?
ê·žë ì§ ììµëë€. Unpin
ë Pin
ëí ë ë ì íì ëìì êŽí ê²ìŒë¡ìŽ APIì ëí í¹ë³í ì°ê²°ì ììµëë€.
ê·žë¬ë Unpin
ì ì¬ì©íì¬ ìžêž ë ì ìœ ì¡°ê±Žì ì ì© í ì ììµëê¹?
dealloc_array
ì êŽí ë ë€ë¥ž ì§ë¬ž : íšìê° Result
ë°ííë ìŽì ë 묎ìì
ëê¹? íì¬ êµ¬íììë ë€ì ë ê°ì§ 겜ì°ì ì€íš í ì ììµëë€.
n
ì (ë) 0ì
ëë€.n * size_of::<T>()
ì©ë ìŽê³Œì²ììë ë ê°ì§ 겜ì°ê° ììµëë€ (묞ìììì ê°ìŽ 구íìë ë€ì ì€ìì ì íí ì ììµëë€).
n
Ok
ì ëíŽ dealloc_array
ë Ok
ë°ííŽìŒí©ëë€.n
=> dealloc_array
ì ë¬í ììë í¬ìží°ê° ìì ë Err
륌 ë°íí©ëë€.ë ë²ì§žë ë€ì곌 ê°ì ìì ì ìœì ìíŽ ë³Žì¥ë©ëë€.
[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
íìíêž° ë묞ì ìŽê²ì ì íší©ëë€.
ì²ììë ë ê°ì§ 겜ì°ê° ììµëë€ (묞ìììì ê°ìŽ 구íìë ë€ì ì€ìì ì íí ì ììµëë€).
- í ë¹ì 0ìŽ ë
n
Ok
ì ë°íí©ëë€.
ìŽ ì 볎ë ìŽëì ì»ììµëê¹?
묞ìì 몚ë Alloc::alloc_
ë©ìëë 0 í¬êž° í ë¹ì ëììŽ "Safety"ì ìì ì ìëì§ ììì ì§ì í©ëë€.
core::alloc::Alloc
(êŽë š ë¶ë¶ ê°ì¡° íì) :
í¬êž°ê° 0 ìž ì í ë° í¬êž°ê° 0 ìž ë ìŽììì ëí ì°žê³ :
Alloc
í¹ì±ì ë§ì ë©ìëë í ë¹ ìì²ìŽ 0ìŽ ìë í¬êž° ì¬ìŒíë©° ê·žë ì§ ììŒë©Ž ì ìëì§ ìì ëììŽ ë°ìí ì ììµëë€.
- ê·žë¬ë ìŒë¶ ìì ìì€ í ë¹ ë°©ë² (
alloc_one
,alloc_array
)ì í¬êž°ê° 0 ìž ì íì ëíŽ ì ì ìëìŽ ììŒë©° ì íì ìŒë¡ ì§ìí ì ììµëë€ .Err
ë°í ì¬ë¶ë 구í ììê² ë¬ë € ììµëë€ ë¡Ok
륌 ë°íí©ëë€.ìŽ ê²œì°
Alloc
구íìŽOk
륌 ë°ííëë¡ ì ííë©Ž (ìŠ, í¬ìží°ê° 0 í¬êž°ì ì¡ìžì€ í ììë ëžë¡ì ëíë) ë°í ë í¬ìží°ë "íì¬ í ë¹ ëš"ìŒë¡ ê°ì£ŒëìŽìŒí©ëë€. ìŽë¬í í ë¹ ììì íì¬ í ë¹ ë í¬ìží°ë¥Œ ì ë ¥ìŒë¡ ì¬ì©íë 몚ë ë©ìëë ì ìëì§ ìì ëì ì ìŒìŒí€ì§ìŠ, í¬êž°ê° 0 ìž í¬ìží°ê° í ë¹ ì ë°ìŒë¡ í륌 ììë ê²œì° íŽë¹ í ë¹ìë ë§ì°¬ê°ì§ë¡ í ë¹ íŽì ë° ì¬ í ë¹ ë©ìëë¡ ë€ì í륎ë í¬ìží°ë¥Œ ìëœíŽìŒí©ëë€ .
ë°ëŒì dealloc_array
ì ì€ë¥ 조걎 ì€ íëë íì€í ìì¬ ì€ëœìµëë€.
/// # Safety
///
/// * the layout of `[T; n]` must *fit* that block of memory.
///
/// # Errors
///
/// Returning `Err` indicates that either `[T; n]` or the given
/// memory block does not meet allocator's size or alignment
/// constraints.
[T; N]
ê° í ë¹ ì í¬êž° ëë ì ë ¬ ì ìœ ì¡°ê±Žì 충족íì§ ììŒë©Ž AFAICTê° í ë¹ ë©ëªšëŠ¬ ëžë¡ì ë§ì§ ììŒë©° ëììŽ ì ìëì§ ììµëë€ (ìì ì¡°íì ë°ëŒ).
ë€ë¥ž ì€ë¥ 조걎ì "ì°ì ì€ë²íë¡ì íì Err
ë°í"ì
ëë€. ꜀ ìŒë°ì ì
ëë€. ì ì©í ì€ë¥ 조걎ìžì§ ì¬ë¶ë¥Œ ë§íêž°ë ìŽë µìµëë€. ê° Alloc
í¹ì± 구íì ëíŽ ìŽë¡ ì ìŒë¡ ë©í ììë ì°ì ì ìí í ììë ë€ë¥ž í¹ì±ì ìê° íŽëŒ ì ììŒë¯ë¡ ð€·ââïž
core::alloc::Alloc
(êŽë š ë¶ë¶ ê°ì¡° íì) :
곌ì°. ë묎 ë§ì ë©ìë (ì : Alloc::alloc
)ìì í¬êž°ê° 0 ìž í ë¹ìŽ ì ìëì§ ìì ëììŽëŒê³ ëª
ìíë ê²ìŽ ìŽìíì§ë§ 구í ì ì ëììŒë¡ Alloc::alloc_array(0)
ë§ ì ê³µí©ëë€. ìŽë€ ì믞ìì Alloc::alloc_array(0)
ë í ë¹ìê° 0 í¬êž° í ë¹ì ì§ìíëì§ ì¬ë¶ë¥Œ íìžíë 늬ížëšžì€ í
ì€ížì
ëë€.
[T; N]
ê° í ë¹ ì í¬êž° ëë ì ë ¬ ì ìœ ì¡°ê±Žì 충족íì§ ììŒë©Ž AFAICTê° í ë¹ ë©ëªšëŠ¬ ëžë¡ì ë§ì§ ììŒë©° ëììŽ ì ìëì§ ììµëë€ (ìì ì¡°íì ë°ëŒ).
ì,ìŽ ì€ë¥ 조걎ì ì€ë³µëë¯ë¡ ìì í ì ìë€ê³ ìê°í©ëë€. ìì ì¡°íìŽë ì€ë¥ 조걎 ì€ íëê° íìíì§ë§ ë ë€ íìí ê²ì ìëëë€.
ë€ë¥ž ì€ë¥ 조걎ì "ì°ì ì€ë²íë¡ì íì
Err
ë°í"ì ëë€. ꜀ ìŒë°ì ì ëë€. ì ì©í ì€ë¥ 조걎ìžì§ ì¬ë¶ë¥Œ ë§íêž°ë ìŽë µìµëë€.
IMO, ìì ëìŒí ìì ì¡°íì ìíŽ ë³Žížë©ëë€. [T; N]
ì ì©ëìŽ ì€ë²íë¡ëë©Ž í ë¹ì íŽì í ë©ëªšëŠ¬ ëžë¡ì ë§ì§ ììµëë€. @pnkfelix ê° ìŽê²ì ëíŽ ììží ì€ëª
í ì ììµëê¹?
ìŽë€ ì믞ìì
Alloc::alloc_array(1)
ë í ë¹ìê° 0 í¬êž° í ë¹ì ì§ìíëì§ ì¬ë¶ë¥Œ íìžíë 늬ížëšžì€ í ì€ížì ëë€.
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륌 ìíŽ ížì¶ëì§ ìì ì ììµëë€ (í¹ì± ì ìììë ëšìŒ ìì¹ìì ëšëœ ë
ŒëŠ¬ë¥Œ ììëë¡ ì¶ê° í ì ìëë¡íêž°ìí ê²ì
ëë€) 구í ììê² ìœê°ì ìì©êµ¬ë¥Œ ì ì¥íêž° ìíŽ)íì¬ APIì ëí ì ì°ì±ìŽ íìí ìŽì ê° ììµëê¹?
íì¬ APIì ëí ì ì°ì±ìŽ íìí ìŽì ê° ììµëê¹?
ížë ìŽë ì€íì ëë€. í늌ììŽ Alloc í¹ì±ì 구í ë ê²ë³Žë€ ë ì죌 ì¬ì©ëë¯ë¡ ZSTì ëí Ʞ볞 ì§ìì ì ê³µíì¬ Allocì ê°ë¥í í ìœê² ì¬ì©íë ê²ìŽ í©ëŠ¬ì ìŒ ì ììµëë€.
ìŽê²ì Alloc í¹ì±ì 구íìê° ìŽê²ì ì²ëŠ¬íŽìŒíë€ë ê²ì ì믞íì§ë§, ë ì€ìí ê²ì Alloc í¹ì±ì ë°ì ìí€ë €ë ì¬ëë€ìŽ 몚ë API ë³ê²œì ëíŽ ZST륌 ìŒëì ëìŽìŒíë€ë ê²ì ëë€. ëí ZSTê° ì²ëŠ¬ëë ë°©ë² (ëë "구í ì ì"ìž ê²œì°)ì ì€ëª íì¬ API 묞ì륌 ë³µì¡íê² ë§ëëë€.
C ++ í ë¹ìë í ë¹ìê° ë€ìí 묞ì 륌 íŽê²°íë €ê³ íëìŽ ì ê·Œ ë°©ìì ì¶êµ¬í©ëë€. ìŽë¡ ìžíŽ 구í ë° ë°ì ìŽ ë ìŽë €ì ì¡ìë¿ë§ ìëëŒ ìŽë¬í 몚ë 묞ì ê° APIìì ìíž ìì©íë ë°©ììŒë¡ ìžíŽ ì¬ì©ìê° ì€ì ë¡ ì¬ì©íêž°ê° ë ìŽë €ìì¡ìµëë€.
ZST륌 ì²ëŠ¬íê³ ìì ë©ëªšëŠ¬ë¥Œ í ë¹ / íŽì íë ê²ì ë ê°ì§ ì§êµì ìŽê³ ë€ë¥ž 묞ì ëŒê³ ìê°íë¯ë¡ ì²ëŠ¬íì§ ìê³ Alloc í¹ì± API륌 ëšìíê² ì ì§íŽìŒí©ëë€.
libstdì ê°ì Alloc ì¬ì©ìë ì륌 ë€ìŽ ê° ì»¬ë ì ìì ZST륌 ì²ëŠ¬íŽìŒí©ëë€. ê·žê²ì íì€í í ê°ì¹ê°ìë 묞ì ìŽì§ë§, Alloc í¹ì±ìŽ ê·žê²ììí ì¥ìëŒê³ ìê°íì§ ììµëë€. íìëìŽ ë¬žì 륌 íŽê²°íë ì ížëŠ¬í°ê° íìì ë°ëŒ libstd ëŽìì íìŽ ëì¬ ê²ìŒë¡ ììíê³ , ê·žëŽ ë ê·žë¬í ì ížëŠ¬í°ë¥Œ RFCíê³ std :: heapì ë žì¶ í ì ììµëë€.
ê·ž 몚ë ê²ìŽ í©ëŠ¬ì ìŒë¡ ë€ëŠœëë€.
ZST륌 ì²ëŠ¬íê³ ìì ë©ëªšëŠ¬ë¥Œ í ë¹ / íŽì íë ê²ì ë ê°ì§ ì§êµì ìŽê³ ë€ë¥ž 묞ì ëŒê³ ìê°íë¯ë¡ ì²ëŠ¬íì§ ìê³ Alloc í¹ì± API륌 ëšìíê² ì ì§íŽìŒí©ëë€.
APIê° êµ¬í ì ìê° ìë ZST륌 ëª ì ì ìŒë¡ ì²ëŠ¬íì§ ìììŒ íšì ì믞íì§ ììµëê¹? IMO, "ì§ìëì§ ìë"ì€ë¥ë ëë¶ë¶ì ížì¶ìê° ë첎 겜ë¡ë¥Œ ì ì í ì ìêž° ë묞ì ë°íììë³ë¡ ëììŽëì§ ììŒë©° ë°ëŒì ZSTê° ì§ìëì§ ìëë€ê³ ê°ì íŽìŒí©ëë€. API륌 ëšìííê³ ì§ìëì§ ììì ì ìžíë ê²ìŽ ë ê¹ëíŽ ë³Žì ëë€.
alloc
ì¬ì©ìê° ZST륌 ì²ëŠ¬íêž° ìíŽ ì 묞í륌 ì¬ì©í©ëê¹? ìëë©Ž if size_of::<T>() == 0
ìí?
alloc
ì¬ì©ìê° ZST륌 ì²ëŠ¬íêž° ìíŽ ì 묞í륌 ì¬ì©í©ëê¹? ìëë©Žif size_of::<T>() == 0
ìí?
íìë 충ë¶íŽìŒí©ëë€. ì ì í ìœë 겜ë¡ë 컎íìŒ íìì ì¬ìíê² ì ê±°ë©ëë€.
APIê° êµ¬í ì ìê° ìë ZST륌 ëª ì ì ìŒë¡ ì²ëŠ¬íì§ ìììŒ íšì ì믞íì§ ììµëê¹?
ì ìê² ì€ìí ì ìœì 0 í¬êž° í ë¹ì êžì§íë©Ž Alloc
ë©ìëê° ì ë¬ ë Layout
ê° í¬êž°ê° 0ìŽ ìëëŒê³ ê°ì í ì ììŽìŒíë€ë ê²ì
ëë€.
ìŽë¥Œ ë¬ì±íë ë°©ë²ìë ì¬ë¬ ê°ì§ê° ììµëë€. íëë Layout
í¬êž°ê° 0ìŽë©Ž ëììŽ ì ìëì§ ììì ëíëŽë ë€ë¥ž Safety
ì ì 몚ë Alloc
ë©ìëì ì¶ê°íë ê²ì
ëë€.
ëë ì ë¡ í¬êž° Layout
êžì§ í ì ììµëë€. ê·žë¬ë©Ž Alloc
ë ì ë¡ í¬êž° í ë¹ì ëíŽ ì묎 ë§ë í íìê° ììµëë€. ìŽê²ìŽ ìì íê² ë°ìí ì ìêž° ë묞ì
ëë€. ê·žë¬ë ê·žë ê²íë©Ž ëª ê°ì§ ëšì ìŽ ììµëë€.
ì륌 ë€ìŽ, HashMap
ê°ì ìŒë¶ ì íì ì¬ë¬ Layout
ìì Layout
륌 ë¹ëíê³ ìµì¢
Layout
ì í¬êž°ê° 0ìŽ ìë ì ììµëë€. ì€ê° í목ì (ì : HashSet
) ìŒ ì ììµëë€. ë°ëŒì ìŽë¬í ì íì "ë€ë¥ž ê²"(ì : LayoutBuilder
ì í)ì ì¬ì©íì¬ ìµì¢
Layout
륌 구ì¶íê³ "0ìŽ ìë"ìí륌 ì§ë¶íŽìŒí©ëë€ (ëë Layout
ë¡ ë³í í ë _unchecked
) ë©ìë.
í ë¹ ì¬ì©ìê° ZST륌 ì²ëŠ¬íêž° ìíŽ ì 묞í륌 ì¬ì©í©ëê¹? ëë size_of ::
() == 0 ê²ì¬?
ì°ëŠ¬ë ìì§ ZST륌 ì 묞í í ì ììµëë€. íì¬ ëªšë ìœëë size_of::<T>() == 0
í©ëë€.
ìŽë¥Œ ë¬ì±íë ë°©ë²ìë ì¬ë¬ ê°ì§ê° ììµëë€. íëë
Layout
í¬êž°ê° 0ìŽë©Ž ëììŽ ì ìëì§ ììì ëíëŽë ë€ë¥žSafety
ì ì 몚ëAlloc
ë©ìëì ì¶ê°íë ê²ì ëë€.
ìŽê²ì 컎íìŒ íì 볎ì¥ìŒë¡ ë§ëë ë°©ë²ìŽ ìëì§ ê³ ë €íë ê²ì í¥ë¯žë¡ìž ê²ì
ëë€. ê·žë¬ë ë ìŽìììŽ 0ìŽ ìë debug_assert
ì¡°ì°šë 99 %ì ë²ê·žë¥Œ ì¡êž°ì 충ë¶í©ëë€.
í ë¹ ìì ëí ë Œìì ì í êŽì¬ì êž°ìžìŽì§ ììêž° ë묞ì ì£ì¡í©ëë€. ê·žë¬ë ëë í ë¹ìê° í ë¹íë ê°ì ì íì ì¡ìžì€ í ì ìꞰ륌 ì€ë«ëì ë°ë¬ìµëë€. ê·žê²ì ì¬ì©í ììë í ë¹ ì ì€ê³ê°ìì ì ììµëë€.
ê·žë ë€ë©Ž ì°ëŠ¬ë ìë§ë C ++ì ëìŒí 묞ì 륌 ê°ì§ ê²ìŽë©° í ë¹ ì APIì ëë€.
ê·žë¬ë ëë í ë¹ìê° í ë¹íë ê°ì ì íì ì¡ìžì€ í ì ìꞰ륌 ì€ë«ëì ë°ë¬ìµëë€. í°
ìŽê² 묎ìì ìíŽ íìí©ëê¹?
@gnzblg @brson ì€ë ì ë í ë¹ëë ê°ì¹ì ì íì ëíŽ _something_ì ìë ì ì¬ì ìž ì¬ì© ì¬ë¡ê°ìììµëë€.
ì ë ì€ë ë ë¡ì»¬ í ë¹ ì, ì êžìŽìë ì ì í ë¹ ì, ì¬ì©í ìœ ë£šíŽììí 3 ê°ì§ Ʞ볞 í ë¹ ì ì¬ìŽìì ì í í ììë ì ì í ë¹ì륌 ìì ì€ì ëë€. ììŽëìŽë ë€ížìí¬ ì°ê²°ì ëíëŽë ìœ ë£šíŽì ìµëë¡ ì í í ì ìë€ë ê²ì ëë€. ëì ë©ëªšëŠ¬ ì¬ì©ë (컬ë ì ì í ë¹ì륌 ì ìŽ í ììë 겜ì°, í¹í íì¬ ìœëì 겜ì°) *.
ì€ë ëê°ì ìŽëí ììë ê° (ì : Arc)곌 ê·žë ì§ ìì ê°ì í ë¹íëì§ ìë ê²ìŽ ì ì© í ì ììµëë€. ìëë©Ž ê·žë ì§ ìì ìë ììµëë€. ê·žë¬ë ê°ë¥í ìë늬ì€ì ëë€. íì¬ ì ì í ë¹ ììë ì¬ì©ìê° í ë¹ì ìí í í ë¹ì륌 ì늬Ʞ ìíŽ ì¬ì©íë ì€ìì¹ê° ììµëë€ (ì¬ í ë¹ ëë íŽì ìë íìíì§ ììµëë€. ë©ëªšëŠ¬ 죌ì ë§ ë³Œ ì ììµëë€).
* [ëí ì êžììŽ ê°ë¥í í NUMA ë¡ì»¬ ë©ëªšëŠ¬ë¥Œ ì¬ì©í ì ììŒë©° 1 ìœìŽ 1 ì€ë ë 몚ëžì ì¬ì©íì¬ ìŽ ë©ëªšëŠ¬ ì¬ì©ëì ì í í ì ììµëë€.]
ë¿¡ ë¹µëš
ì ë êžë¡ë² í ë¹ ììì ìŒíê³ ììµëë€
ìŽ ì€ ìŽë€ ê²ë GlobalAlloc
ížë ìŽ ížì ì ì©ë ì ìë€ê³ ìê°íì§ ììµëë€. Alloc
ížë ìŽ ížìë ìŽë¯ž ì í ì 볎륌 ì¬ì©í ììë ìŒë° ë©ìëê° ììµëë€ (ì : alloc_array<T>(1)
ë ëšìŒ T
alloc_array<T>(1)
í ë¹í©ëë€. ì¬êž°ì T
ë ì€ì ì íìŽë¯ë¡ í ë¹ìë í ë¹ì ìííë ëì ì íì ê³ ë €í ì ììµëë€. ì í ì 볎륌 ì¬ì©íë í ë¹ì륌 구ííë ìœë륌 ì€ì ë¡ ë³Žë ê²ìŽìŽ í ë¡ ì 목ì ì ë ì ì© í ê²ìŽëŒê³ ìê°í©ëë€. ëë ì ìŽë¬í ë©ìëê° í ë¹ ì APIì ìŒë¶ê°ëê±°ë ë€ë¥ž í ë¹ ì í¹ì±ì ìŒë¶ê°ëë ê²ìŽ ìëëŒ ìŒë°ì ìž í ë¹ ì í¹ì±ì ìŒë¶ê°ëìŽìŒíëì§ì ëí ì¢ì 죌ì¥ì ë£ì§ 못íìµëë€.
Alloc
ìíŽ ë§€ê° ë³ìí ë ì í ì€ ìŽë€ ì íì ì í ì 볎륌 ì¬ì©íë í ë¹ ìì ê²°í© í ê³íìžì§, ê·žëŠ¬ê³ ìŽë€ 결곌륌 êž°ëíëì§ ìë ê²ë ë§€ì° í¥ë¯žë¡ìž ê²ìŽëŒê³ ìê°í©ëë€.
AFAICT, ê·ž ì ìŒí í¥ë¯ž ì íì ê² Box
ê·žê²ìŽ í ë¹íêž° ë묞ì T
ì§ì . std
ê±°ì 몚ë ë€ë¥ž ì íì T
í ë¹íì§ ìì§ë§ í ë¹ìê° ì ììë ìŒë¶ ë¹ê³µê° ëŽë¶ ì íì
ëë€. ì륌 ë€ìŽ Rc
ë° Arc
ë (InternalRefCounts, T)
, List
/ BTreeSet
/ ë±ì í ë¹ í ì ììµëë€. ëŽë¶ ë
žë ì í Vec
í ë¹ í ì ììµëë€. Deque
/ ... T
ì ë°°ìŽì í ë¹íì§ë§ T
ì첎ë í ë¹íì§ ììµëë€.
Box
ë° Vec
ê²œì° í ë¹ìê° í ììë Alloc
ëí ëžëí· implsê°ìë BoxAlloc
ë° ArrayAlloc
ížë ìŽ ížë¥Œ íì íží ë°©ììŒë¡ ì¶ê° í ì ììµëë€. ìŒë°ì ìž ë°©ììŒë¡ ìŽë¬í 묞ì 륌 공격 í íìê°ìë ê²œì° ìŽë¬í 묞ì ê° ìŽë»ê² ìëíëì§ íìŽì¬í¹íë ë° í¹íëìŽ ììµëë€. ê·žë¬ë ì í ì 볎륌 ì
ì©íêž° ìíŽ í ë¹ ìì 공몚íë ì첎 MyAllocBox
ë° MyAllocVec
ì íì ì ê³µíë ê²ìŽ ì€í ê°ë¥í ì룚ì
ìŽ ìë ìŽì ê° ììµëê¹?
ìŽì í ë¹ ì WGì ëí ì ì© ì ì¥ì ê° ìê³ OPì 목ë¡ìŽ ì€ëëììŒë¯ë¡ìŽ 묞ì 륌 íê³³ìì ë Œìíê³ ì¶ì íêž° ìíŽìŽ 묞ì 륌 ë«ì ì ììµëê¹?
@TimDiekmann ì¢ì í¬ìžíž! ê³ìíŽì íŽë¹ ì ì¥ìì í ë¡ ì€ë ë륌 ìíŽ ìŽê²ì ë«ì ê²ì ëë€.
ìŽê²ì ì¬ì í ââìŒë¶ #[unstable]
ìì±ìŽ ê°ëŠ¬í€ë ì¶ì 묞ì ì
ëë€. ìŽë¬í êž°ë¥ìŽ ìì íëê±°ë ì¬ì©ëì§ ìì ëê¹ì§ ë«ììë ìëë€ê³ ìê°í©ëë€. (ëë ë€ë¥ž 묞ì 륌 ê°ëŠ¬ í€ëë¡ ìì±ì ë³ê²œí ì ììµëë€.)
ê·žë, git masterìì ì°žì¡°ëë ë¶ìì í êž°ë¥ìë íì€í ê³µê° ì¶ì 묞ì ê° ììŽìŒí©ëë€.
ëìí©ëë€. ëí OPì ëí ì늌 ë° ë§í¬ë¥Œ ì¶ê°íìµëë€.
ê°ì¥ ì ì©í ëêž
@alexcrichton
-> Result<*mut u8, AllocErr>
ìì-> *mut void
ë¡ ì ííêž°ë¡ í ê²°ì ì í ë¹ ì RFCì ìë ê°ë°ì ë°ë¥Žë ì¬ëë€ìê² í° ëëŒììŒë¡ ë€ê°ì¬ ì ììµëë€.ëë ë¹ì ì ì ìì ëìíì§ ìì§ë§, ê·žëŒìë ë¶êµ¬íê³ ìë¹ìì ì¬ëë€ìŽ nullì ëì¹ ê°ë¥ì±ìŽ ëìì§ ê²ë³Žë€
Result
ì "묎거ì"ìŒë¡ ìŽêž°ë¥Œ ìíì ê² ê°ìë€. ë°í ë ê°ì íìžíììì€.ì°ëŠ¬ê° ê·ž ìì²Žë¡ ëŠì ë³íì ëí ê°ìì±ì ìŠê° ì»ì ììë ëª ê°ì§ ë°©ë²ìŽ ìëì?
í ê°ì§ ë°©ë² (ëŽ ëšžëŠ¬ êŒëêž°ìì ë²ìŽëš) : ë§ì€í° ëžëì¹ìì ì첎 PRë¡ ìëª ì ë³ê²œ íê³
Allocator
ë ì¬ì í ë¶ìì í©ëë€. ê·žëŠ¬ê³ ëê° PRì ëíŽ ë¶ííëì§ (ê·žëŠ¬ê³ ëê° ì¶ííëì§!)