Reddit

The `allocator_api` feature has been stabilized, on track to release in Rust 1.100

`allocator_api` 안정화, Rust 1.100 출시 예정

Rust의 `allocator_api` 기능이 안정화돼 Rust 1.100에 포함될 예정입니다. 개발자는 전역 할당자에 의존하지 않고 `Box`와 `Vec`에 사용자 지정 할당자를 지정할 수 있으며, 현재 안정화된 표준 라이브러리 지원은 이 두 타입에 한정됩니다.

AI 요약

Rust의 allocator_api 기능이 안정화돼 Rust 1.100 출시를 앞두고 있습니다. 이 API를 쓰면 전역 할당자 대신 직접 만든 할당자를 BoxVec에 지정할 수 있습니다. 예를 들어 라이브러리가 할당자를 매개변수로 받아 Vec::new_in으로 값을 만들면, 호출자가 결과에 사용할 메모리 풀이나 arena를 선택할 수 있습니다.

안정화 범위와 활용

Reddit 댓글에 따르면 이번 안정화에서 기존 표준 라이브러리 타입 중 사용자 지정 할당자를 지원하는 것은 BoxVec입니다. 다른 표준 컬렉션과 String은 아직 지원 범위에 들어가지 않았습니다. 컬렉션마다 할당자 매개변수를 받는 생성자와 함수를 추가해야 하므로, 관련 API는 후속 작업으로 남아 있습니다.

사용자 지정 할당자는 전역 설정을 바꾸지 않고 특정 객체만 별도 메모리 풀에 배치할 때 유용합니다. 라이브러리 작성자는 Allocator를 받는 함수를 제공하고, 기본 진입점에서는 전역 할당자를 넘기는 형태로 API를 구성할 수 있습니다. 다만 컬렉션과 라이브러리가 차례로 할당자 매개변수를 받아들이도록 바뀌어야 활용 범위가 넓어집니다.

댓글에서는 할당자 추상화의 비용도 논의됐습니다. 일반 할당자는 운영체제 호출을 매번 수행하지 않고 요청을 묶어 처리한다는 지적이 나왔습니다. 반면 arena나 bump allocator처럼 빠른 사용자 지정 할당자에서는 동적 디스패치나 할당자 포인터 저장 비용이 상대적으로 두드러질 수 있다는 우려도 제기됐습니다. 해당 논의는 타입 소거 할당자를 기본값으로 삼는 설계와 사용자 지정 할당자의 성능 비용을 두고 오간 의견입니다.

설계와 후속 과제

한 사용자는 포인터 대신 핸들을 추상화하는 Store 설계가 왜 먼저 안정화되지 않았는지 물었습니다. 답글에서는 Store 제안 작성자와 논의한 결과, 안정화된 Allocator를 Store의 포인터 핸들 방식으로 볼 수 있으며 이후 하위 호환성을 지키면서 Store를 추가할 수 있어 세부 논의를 미뤘다고 설명했습니다. 다른 참여자는 trait alias와 자동 구현 기능이 마련되면 Allocator를 더 넓은 storage trait 체계 안에 포함할 수 있다고 덧붙였습니다.

또 다른 논의는 여러 API가 비슷한 일을 하게 되는 문제로 이어졌습니다. try 블록과 기존 Option·Result 조합 메서드를 예로 들며, 안정화된 API를 쉽게 제거할 수 없는 점을 걱정하는 의견이 나왔습니다. 이에 대해 답글에서는 각 API가 쓰이는 맥락과 표현 방식이 다르며, 편의 API와 세밀하게 제어하는 API를 계층으로 제공하는 방식도 유효하다고 반박했습니다.

Reddit 반응

  • @u/noop_noob — 빨리 누군가 미정의 동작을 찾아주세요.
    • @u/kibwen — 농담이시겠지만, 아직 발견되지 않은 안전성 문제가 있다면 기능이 안정 버전에 들어가기 전에 찾는 편이 좋습니다. API를 세게 시험해 보세요.
  • @u/RCoder01 — 와, 1.100에서는 Never와 Allocator_api가 모두 안정화되겠네요. 버전 번호에 걸맞은 출시가 될 것 같습니다.
  • @u/caelunshun — 여기까지 도와주신 모든 분께 축하와 감사를 전합니다.
  • @u/Puzzleheaded_Web9584 — Rust 팀이 왜 Store보다 이 기능을 먼저 안정화하기로 했는지 이유가 있나요? 포인터 같은 세부 사항을 추상화하고, 효과 스타일 할당자를 작성할 때 더 많은 제어권을 주는 접근이 마음에 듭니다.
    • @u/kibwen — Store 제안 작성자와 직접 논의한 뒤, 하위 호환성을 지키며 추가할 수 있다고 판단했습니다. Store 용어로 보면 안정화된 Allocator는 포인터 핸들을 쓰는 storage에 해당하므로, 세부 사항은 안정화 뒤로 미뤘습니다.
  • @u/ParadiZe — 이 기능으로 무엇을 할 수 있나요? 이제 arena를 더 쉽게 쓸 수 있나요?
    • @u/coderstephen — 전역 할당 방식에는 영향을 주지 않으면서 사용자 지정 메모리 풀을 만들고, BoxVec 같은 특정 객체를 그 안에 넣을 수 있습니다.
    • @u/plugwash — 사용자 지정 할당자를 더 쉽게 쓰도록 하는 작업의 첫 단계입니다. 할당자를 나타내는 타입을 제공하고 BoxVec가 그 타입을 매개변수로 받습니다. 앞으로 표준 라이브러리 컬렉션과 다른 라이브러리도 지원을 추가하면, 라이브러리 사용자가 전역 할당자 대신 원하는 할당자로 결과를 만들 수 있습니다.
  • @u/hgwxx7_ — 안정화된 API 링크를 알려주실 수 있나요?
    • @u/kibwen — 안정화 보고서에 포함된 API 목록이 있습니다. 기존 표준 라이브러리 타입 가운데 이번에 안정화된 할당자 지원은 BoxVec에 한정되며, 다른 컬렉션은 후속 작업으로 남았습니다.
    • @u/noop_noob — 특히 Allocator trait에는 안전성 요구사항을 더 정확하게 설명하는 문구가 최근 추가됐습니다. 그중에는 ‘동등한 할당자(equivalent allocators)’ 개념도 들어갑니다.
  • @u/jondo2010 — GitHub 이슈가 10년 반이나 됐네요.

원문: Rust GitHub / 번역·요약: Trawling