Rust: 할당 자 특성 및 std :: heap

에 만든 2016년 04월 08음  Â·  412윔멘튞  Â·  출처: rust-lang/rust

📢 읎 Ʞ능에는 ì „ë‹Ž 워킹 귞룹읎 있습니닀. 의견곌 ìš°ë € 사항 은 워킹 귞룹의 저장소에 직접 볎낎죌섞요.

원볞 게시묌 :


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 몚듈에 대한 추적 묞제입니닀.

  • [x] land struct Layout , trait Allocator 및 alloc 크레읎튞의 Ʞ볞 구현 (https://github.com/rust-lang/rust/pull/42313)
  • [x] 부품읎 있얎알 할 위치륌 결정합니닀 (예 : Ʞ볞 impls는 alloc 상자에 종속되지만 Layout / Allocator _ libcore ...) (https://github.com/rust-lang/rust/pull/42313)
  • [] 소슀 윔드 수정 : Ʞ볞 구현 감사 (였버플로 였류에 대핮 Layout 에서 (잠재적윌로 필요에 따띌 overflowing_add 및 overflowing_mul로 전환)).
  • [x] 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 합니까? ( 댓Ꞁ )
  • [x] 할당 한 정확한 크Ʞ로 할당을 핎제핎알합니까? 예륌 듀얎 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에서 í•Žê²°
  • [] 읎전 질묞곌 유사합니닀. 할당 한 정확한 정렬로 할당을 핎제핎알합니까? ( 2017 년 6 월 5 음 죌석 ì°žì¡°)
  • [x] OSX / alloc_system 는 거대한 정렬 (예 : 1 << 32 정렬)에서 버귞가 있습니닀. https://github.com/rust-lang/rust/issues/30170 # 43217
  • [] Layout 에서 fn stride(&self) 메서드륌 제공핎알합니까? (https://github.com/rust-lang/rfcs/issues/1397, https://github.com/rust-lang/rust/issues/17027 ì°žì¡°)
  • [x] Allocator::owns 방법윌로? https://github.com/rust-lang/rust/issues/44302

https://github.com/rust-lang/rust/pull/42313 읎후 std::heap 상태 :

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

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

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

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

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

pub struct CannotReallocInPlace;

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

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

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

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

/// The global default allocator
pub struct Heap;

impl Alloc for Heap {
    // ...
}

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

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

impl Alloc for System {
    // ...
}

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

가장 유용한 댓Ꞁ

@alexcrichton -> Result<*mut u8, AllocErr> 에서 -> *mut void 로 전환하Ʞ로 한 결정은 할당 자 RFC의 원래 개발을 따륎는 사람듀에게 큰 놀띌움윌로 닀가올 수 있습니닀.

나는 당신의 점수에 동의하지 않지만, 귞럌에도 불구하고 상당수의 사람듀읎 null을 놓칠 가능성읎 높아진 것볎닀 Result 의 "묎거움"윌로 삎Ʞ륌 원했을 것 같았닀. 반환 된 값을 확읞하십시였.

  • @alexcrichton 곌 같읎 컎파음러 튞늭을 통핎 ì–Žë–€ 식 윌로든 읎러한 묞제륌 처늬 할 수 ​​있닀고 가정하Ʞ 때묞에 ABI에서 부곌 한 런타임 횚윚성 묞제륌 묎시하고 있습니닀.

우늬가 ê·ž 자첎로 늊은 변화에 대한 가시성을 슝가 얻을 수있는 몇 가지 방법읎 있나요?

한 가지 방법 (낮 뚞늬 ꌭ대Ʞ에서 ë²—ì–Žë‚š) : 마슀터 람랜치에서 자첎 PR로 서명을 변겜 하고 Allocator 는 여전히 불안정합니닀. 귞늬고 누가 PR에 대핮 불평하는지 (귞늬고 누가 축하하는지!)

  • 손읎 너묎 묎겁습니까? 읎러한 변화륌 안정화와 결합하는 것볎닀 정의상 덜 묎거욎 것 같습니닀 ...

몚든 412 댓Ꞁ

불행히도 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 팀원 읎읎륌 병합 할 것을 제안했습니닀. 닀음 닚계는 태귞가 지정된 나뚞지 팀의 검토입니닀.

  • [x] @BurntSushi
  • [x] @Kimundi
  • [x] @alexcrichton
  • [x] @aturon
  • [x] @cramertj
  • [x] @dtolnay
  • [x] @eddyb
  • [x] @nikomatsakis
  • [x] @nrc
  • [x] @pnkfelix
  • [x] @sfackler
  • [x] @withoutboats

ìš°ë € 사항 :

읎러한 검토자가 합의에 도달하멎 최종 의견 Ʞ간읎 시작됩니닀. 읎 곌정에서 아직 제Ʞ되지 않은 죌요 묞제륌 발견하멎 알렀죌섞요!

태귞 된 팀원읎 나에게 쀄 수있는 명령에 대한 정볎는 읎 묞서 륌 찞조하십시였.

읎 작업의 음부륌 안정화하게되얎 정말 Ʞ쁩니닀!

한 가지 질묞 : 위의 슀레드에서 @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 묞서 읞용 :

음부 방법에서는 레읎아웃읎 메몚늬 랔록에 맞아알 합니닀.
레읎아웃읎 메몚늬 랔록에 "적합"한닀는 의믞 (또는
마찬가지로, 메몚늬 랔록읎 레읎아웃에 "적합"하렀멎)
닀음 두 가지 조걎읎 유지되얎알합니닀.

  1. 랔록의 시작 죌소는 layout.align() 정렬되얎알합니닀.

  2. 랔록의 크Ʞ는 [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 확싀하지 않습니닀. 녞력하겠습니닀.

읎 정말읎 슀레드륌 잡았지만 아직 아묎것도 안정화에 대한 죜은 섞튞륌 아니에요. 우늬는 아직 얎렀욎 묞제륌 구현하지 못했습니닀.

  1. 할당 자 닀형성 컬렉션

    • 부 풀지 않은 상자도 아닙니닀!

  2. 잘못된 컬렉션

나는 Ʞ볞적읞 특성의 디자읞은 사람듀의 솔룚션에 영향을 믞칠 것읎띌고 생각 : 나는 지난 몇 달 동안 녹에 대한 앜간의 시간읎 있었닀했지만, 시간읎 죌장했닀. 여Ʞ에서도 제 죌장을 완전히 할 시간읎 있을지 의심 슀럜습니닀. 귞래서 저는 우늬가 최소한 ê·ž 몚든 것에 대한 완전한 핎결책을 뚌저 작성하Ʞ륌 바랄뿐입니닀. 누군가는 엄격하고 (올바륞 사용법을 강요하여) 유연하게하는 것읎 불가능하닀는 것을 저에게 틀 렞습니닀. , 현재 특성에 읞첎 공학적입니닀. 또는 상닚의 첎크 박슀륌 완료핎도됩니닀.

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 핎당하는 항목읎 없습니닀. 귞것읎 우늬에게 큰 폭발의 원읞입니닀.

@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 사용쀑읞 겜우에만 영향을쀍니닀.
  • 귞늬고 우늬가 정렬 플래귞륌 두 번 계산하는 묞제입니닀.하지만 귞것은 LLVM읎 우늬 잡에서 최적화 할 수있는 것입니닀 (귞늬고 수정하Ʞ가 사소한 것입니닀).

예, 더 많은 윔드처럌 볎읎지만읎 추가 윔드는 싀제로 두 번 혞출하는 윔드입니닀. 처음 혞출했을 때 결곌륌 버렞습니닀. 고치는 것은 불가능하지 않지만 아직 할 시간을 찟지 못했습니닀.


펞집 : @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/45514
  • grow_in_place_excess 및 alloc_zeroed_excess 와 같은 Ʞ능읎 없습니닀.
  • FFI에서 C 속성을 제대로 전파 할 수 없습니닀 : https://github.com/rust-lang/rust/issues/46046
  • ... (여Ʞ서 끝나는 것 같지 않습니닀)

아묎도읎 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 사용에 대한 닀음 사싀을 감안할 때 :

  • 녹 생태계에서 쎝 0 개 사용 _excess
  • 쎝 0 _excess 는 rust std 띌읎람러늬에서
  • Vec 및 String 조찚도 rust std 띌읎람러늬에서 _excess API륌 제대로 사용할 수 없습니닀.
  • _excess API는 불안정하고 곌도하지 않은 API와 동Ʞ화되지 않았윌며 최귌까지 버귞가 발생했습니닀 ( excess 도 반환하지 않았 음) ...

    닀륞 얞얎에서 _excess 사용에 대한 닀음 사싀을 고렀하멎 :

  • jemalloc의 API는 읎전 버전곌의 혞환성윌로 읞핎 C 또는 C ++ 프로귞랚에서 Ʞ볞적윌로 지원되지 않습니닀.

  • jemalloc의 쎈곌 API륌 사용하렀는 C 및 C ++ 프로귞랚은 닀음곌 같은 방법윌로 사용할 수 있습니닀.

    • 시슀템 할당 자 선택 í•Žì œ 및 jemalloc (또는 tcmalloc)

    • 얞얎의 표쀀 띌읎람러늬륌 닀시 구현합니닀 (C ++의 겜우 혞환되지 않는 표쀀 띌읎람러늬륌 구현).

    • 읎 혞환되지 않는 표쀀 띌읎람러늬 위에 전첎 슀택을 작성하십시였.

  • 음부 컀뮀니티 (파읎얎 폭슀가읎륌 사용하고 페읎슀 북읎 C ++ 표쀀 띌읎람러늬의 컬렉션을 닀시 구현하여 사용할 수 있도록합니닀 ...)는 여전히 사용하지 않습니닀.

읎 두 가지 죌장은 나에게 귞럎듯 핮 볎읞닀.

  • excess 에서 API std 귞러므로, 사용할 수 없습니닀 std 는 녹 생태계에서 한 번도 사용하지 않는 읎유입니닀, 띌읎람러늬륌 사용할 수 없습니닀, 따띌서 아묎도 캔 .
  • C와 C ++가읎 API륌 사용하는 것을 거의 불가능하게 만듀지 만, 읞력읎있는 큰 프로젝튞는읎륌 사용하Ʞ 위핎 많은 시간을 듀읎Ʞ 때묞에 적얎도 잠재적윌로 작은 사람듀의 컀뮀니티에서 _ 많은 _ ꎀ심을 Ʞ욞입니닀.

당신의 죌장 :

  • 아묎도 _excess API륌 사용하지 ì•Šêž° 때묞에 0.01 %의 사람듀 만읎 ꎀ심을 갖고 있습니닀.

하지 않습니닀.

@alexcrichton -> Result<*mut u8, AllocErr> 에서 -> *mut void 로 전환하Ʞ로 한 결정은 할당 자 RFC의 원래 개발을 따륎는 사람듀에게 큰 놀띌움윌로 닀가올 수 있습니닀.

나는 당신의 점수에 동의하지 않지만, 귞럌에도 불구하고 상당수의 사람듀읎 null을 놓칠 가능성읎 높아진 것볎닀 Result 의 "묎거움"윌로 삎Ʞ륌 원했을 것 같았닀. 반환 된 값을 확읞하십시였.

  • @alexcrichton 곌 같읎 컎파음러 튞늭을 통핎 ì–Žë–€ 식 윌로든 읎러한 묞제륌 처늬 할 수 ​​있닀고 가정하Ʞ 때묞에 ABI에서 부곌 한 런타임 횚윚성 묞제륌 묎시하고 있습니닀.

우늬가 ê·ž 자첎로 늊은 변화에 대한 가시성을 슝가 얻을 수있는 몇 가지 방법읎 있나요?

한 가지 방법 (낮 뚞늬 ꌭ대Ʞ에서 ë²—ì–Žë‚š) : 마슀터 람랜치에서 자첎 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의 안정화와 ꎀ렚하여 ì–Žë–€ 결정을 낎늬 든 닀음을 수행핎알합니닀.

  • libpmemcto와 같은 영구 메몚늬 할당 자에 대한 성능 래퍌륌 지원할 수 있얎알합니닀.
  • 할당 자별로 컬렉션 유형을 지정 (맀개 변수화) 할 수 있습니닀 (현재는 Box, Rc, Arc 등을 복제핎알 핹).
  • 할당 자간에 데읎터 복제 가능
  • 영구 메몚늬 풀의 읞슀턎슀화시 닀시 쎈Ʞ화되는 필드가있는 영구 메몚늬 저장 구조첎륌 지원할 수 있얎알합니닀. 슉, 음부 영구 메몚늬 구조첎에는 힙에 음시적윌로 만 저장되는 필드가 있얎알합니닀. 현재 사용 사례는 할당에 사용되는 영구 메몚늬 풀곌 잠ꞈ에 사용되는 임시 데읎터에 대한 찞조입니닀.

제쳐두고, 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 는 특별히 좋은 읎늄읎 아닙니닀.
  • jemallocator 크레읎튞는 현재 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, 음부 작업의 복잡성 변겜, 음부 컬렉션 섞부 사항은 싀제로 할당 자에 따띌 달띌집니닀.

귞래서 저는 여Ʞ서 발전 할 수있는 방법을 제안하고 싶습니닀.

1 닚계 : 힙 할당 자

처음에는 사용자가 안정적읞 Rust에서 힙 (또는 시슀템 / 플랫폌 / Ꞁ로벌 / 프늬 슀토얎 할당 자 또는 선혞하는 읎늄)에 대한 할당자륌 선택하도록 제한 할 수 있습니닀.

우늬가 처음에 맀개 변수화하는 유음한 것은 Box 읎며, 메몚늬륌 할당 ( new )하고 할당 í•Žì œ ( drop )하멎됩니닀.

읎 할당 자 특성은 처음에는 @alexcrichton읎 제안한 (또는 닀소 확장 된) API륌 가질 수 있윌며,읎 할당 자 특성은 알간에 std:: 컬렉션을 지원하Ʞ 위핎 앜간 확장 된 API륌 가질 수 있습니닀.

음닚 우늬가 거Ʞ에 도착하멎 안정윌로 마읎귞레읎션하렀는 사용자는 귞렇게 할 수 있지만 불안정한 API로 읞핎 성능읎 저하 될 수 있습니닀.

2 닚계 : 성능 저하없는 힙 할당 자

읎 시점에서 성능 저하로 읞핎 안정적윌로 읎동할 수없는 사용자륌 재평가하고읎 API륌 확장하고 안정화하는 방법을 결정할 수 있습니닀.

3 ~ N 닚계 : std 컬렉션에서 사용자 지정 할당자륌 지원합니닀.

첫짞, 읎것은 ì–Žë µ êž° 때묞에 결윔 음얎나지 않을 수도 있고 결윔 음얎나지 않는 것읎 나쁜 것읎 아니띌고 생각합니닀.

사용자 지정 할당 자로 컬렉션을 맀개 변수화하고 싶을 때 성능 묞제 나 사용성 묞제가 있습니닀.

사용성 묞제가있는 겜우 음반적윌로 SliceDeque 크레읎튞와 같읎 사용자 지정 할당 자의 Ʞ능을 활용하는 닀륞 컬렉션 API륌 원합니닀. 사용자 지정 할당 자에 의한 컬렉션 맀개 변수화는 여Ʞ서 도움읎되지 않습니닀.

성능 묞제가있는 겜우 사용자 지정 할당자가 나륌 도와죌는 것읎 여전히 맀우 얎렀욞 것입니닀. Vec 는 ë‚Žê°€ 가장 자죌 닀시 구현 한 컬렉션읎Ʞ 때묞에 닀음 섹션에서만 고렀할 것입니닀.

시슀템 할당 자 혞출 수 감소 (Small Vector Optimization)

시슀템 할당 자에 대한 혞출 수륌 쀄읎Ʞ 위핎 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 ++ 시절에 Ʞ억하는 음반적읞 조얞은 닀음곌 같은 읎유로 "사용하지 마십시였"(마지막 수닚)띌는 것입니닀.

  • 시슀템 할당 자의 성능을 음치시킀는 것은 맀우 얎렵습니닀.
  • 닀륞 사람의 응용 프로귞랚 메몚늬 할당 팚턎읎 자신곌 음치 할 가능성은 희박하므로 할당 팚턎곌 음치하는 데 필요한 할당 자 구성 요소륌 알아알합니닀.
  • 서로 닀륞 공꞉ 업첎가 서로 닀륞 할당 팚턎을 사용하는 서로 닀륞 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 않습니닀 .
  • Allocator 읞터페읎슀 에는 사용자 정의 할당자가 사용자 정의 할 수있는 Allocator :: propagate_on_container_move_assignment (지ꞈ부터 POCMA)띌는 몚혞한 속성읎 있습니닀. 읎 속성은 Ʞ볞적윌로 true 입니닀. 읎 속성읎 false 겜우 읎동 할당시 할당자륌 전파 할 수 없윌므로 표쀀에 따띌 컬렉션읎 각 요소륌 새 저장소로 수동윌로 읎동핎알합니닀.

따띌서 시슀템 할당자가있는 벡터가 읎동되멎 뚌저 슀택의 새 벡터에 대한 저장소가 할당 된 닀음 할당자가 읎동 (0 크Ʞ) 된 닀음 3 개의 포읞터가 읎동되며 여전히 유횚한 상태입니닀. 읎러한 움직임은 O(1) 입니닀.

OTOHO, POCMA == true 할당자가있는 벡터가 읎동되멎 뚌저 슀택의 새 벡터에 대한 저장소가 할당되고 빈 벡터로 쎈Ʞ화 된 닀음 읎전 컬렉션은 drain ed 새로욎 것, 귞래서 읎전 것은 비얎 있고 새로욎 것은 가득 찌습니닀. 읎렇게하멎 읎동 할당 연산자륌 사용하여 컬렉션의 각 요소륌 개별적윌로 읎동합니닀. 읎 닚계는 O(N) 읎며 요소의 낎부 포읞터륌 수정합니닀. 마지막윌로, 읎제 비얎있는 원래 컬렉션읎 삭제됩니닀. 읎것은 복제묌처럌 볎읎지만 요소 자첎가 복제되지 않고 C ++로 읎동했Ʞ 때묞읎 아닙니닀.

말읎 돌?

C ++에서읎 ì ‘ê·Œ 방식의 죌요 묞제점은 닀음곌 같습니닀.

  • 벡터 성장 정책은 구현 정의입니닀.
  • 할당 자 API에 _excess 메서드가 없습니닀.
  • 위의 두 가지 묞제의 조합은 벡터가 최대 9 개 요소륌 볎유 할 수 있닀는 것을 알고 있닀멎, 벡터가 성장 읞자가있는 8 개가있을 때 성장을 시도 할 수 있Ʞ 때묞에 9 개 요소륌 볎유 할 수있는 슀택 할당자륌 가질 수 없음을 의믞합니닀. 따띌서 18 개 요소에 대한 공간을 비ꎀ적윌로 할당하고 할당핎알합니닀.
  • 벡터 연산의 복잡성은 할당 자 속성에 따띌 변겜됩니닀 (POCMA는 C ++ Allocator API에있는 많은 속성 쀑 하나 음뿐입니닀. C ++ 할당자륌 작성하는 것은 쀑요하지 않습니닀). 읎것은 벡터의 API륌 지정하는 것을 얎렵게 만듭니닀. 왜냐하멎 같은 유형의 서로 닀륞 할당 자간에 요소륌 복사하거나 읎동하멎 추가 비용읎 발생하여 작업의 복잡성읎 변겜되Ʞ 때묞입니닀. 또한 사양을 읜는 데 큰 얎렀움읎 있습니닀. cppreference와 같은 많은 옚띌읞 묞서 소슀는 음반적읞 겜우륌 앞에두고 사용자의 99 %륌 ꎎ롭히는 것을 방지하Ʞ 위핎 할당 자 속성 하나가 ì°ž 또는 거짓 읞 겜우 변겜되는 사항에 대한 몚혞한 섞부 정볎륌 제공합니닀.

예륌 듀얎 _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에서 우늬는 여전히 닀음을 통핎 Ꞁ로벌 할당자가 될 수 있습니닀.

  • 슀슀로 컎파음 할 때, 전역 할당 자로 jemalloc을 정적윌로 컎파음하십시였.
  • 닀륞 프로귞랚에서 동적윌로로드 할 수있는 공유 개첎 파음 생성

읎 겜우 시슀템 할당자륌 Ꞁ로벌 할당 자로 사용하여 컎파음하지 않는 것읎 쀑요합니닀.로드되멎 재귀 종속성을 닀시 도입 할 것입니닀. ê·ž 시점에서 우늬 는 시슀템 할당 자읎Ʞ 때묞입니닀.

귞러나 닀음곌 같은 겜우에는 작동하지 않습니닀.

  • 누군가는 "공식적읞"방식윌로 Rust에서 전역 할당 자로 우늬륌 사용하Ʞ륌 원합니닀 (뚌저 공유 객첎 파음을 생성하는 것곌 반대)
  • 우늬는 표쀀읎 아닌 환겜에 있습니닀.

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을 넣는 것읎 싀제로 사용자에게 도움읎되는지에 대한 질묞입니닀.

  • 묞서륌 읜고 불변에 대핮 생각하도록 상Ʞ
  • 펞의 제공 ( @SimonSapin 의 포읞튞 wrt 할당의 반환 값)
  • 음부 재료 읎점 제공 (예 : 레읎아웃 최적화)

나는 예륌 듀얎,의 읞수 만드는 ì–Žë–€ 강점읎 표시되지 않는 dealloc 로 NonNull . 읎 API의 사용 큎래슀는 대략 두 가지입니닀.

  1. alloc 륌 혞출하고 반환 된 포읞터륌 얎딘가에 저장하고 잠시 후 저장된 포읞터륌 dealloc 전달하는 비교적 사소한 사용입니닀.
  2. FFI, 많은 포읞터 산술 등을 포핚하는 복잡한 시나늬였. 마지막에 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 륌 사용할 수 있습니닀
  • 귞런 닀음 졎재하지 않는 API 부분읎 있습니닀 ( 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)륌 제출하는 것을 ê³ ë € 하시겠습니까?

할당 자 및 수명 :

  1. (할당 자 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>() 용량 쎈곌

처음에는 두 가지 겜우가 있습니닀 (묞서에서와 같읎 구현자는 닀음 쀑에서 선택할 수 있습니닀).

  • 할당은 0읎 된 n Ok 에 대핮 dealloc_array 도 Ok 반환핎알합니닀.
  • 할당은 0읎 된 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띌는 것을 알고 있닀멎 할당 (상수 값 반환)곌 할당 핎제륌 몚두 완벜하게 최적화 할 수있는 것 같습니닀. 읎륌 감안할 때 닀음 쀑 하나륌 말핎알 할 것 같습니닀.

  • ZST륌 지원하는 것은 항상 구현 자에게 달렀 있윌며 ZST에 대핮 Err 륌 반환 할 수 없습니닀.
  • ZST륌 할당하는 것은 항상 UB읎며읎 겜우 닚띜하는 것은 혞출자의 책임입니닀.
  • 음종의있닀 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에 대한 알늌 및 링크륌 추가했습니닀.

읎 페읎지가 도움읎 되었나요?
0 / 5 - 0 등꞉