Rust 런타임

Rust 런타임

사실 Rust는 일반적인 의미의 "런타임"이 거의 없다고 알려져 있어요. 그런데도 공식 문서에는 런타임(runtime) 이라는 이름의 장이 있는데요, 이 장은 Rust 런타임의 특정 측면을 정의하는 기능들, 특히 런타임의 메모리 할당과 같은 부분을 다뤄요.

출처: Rust Reference - The Rust runtime

본문

이 장은 Rust 런타임의 일부 측면을 정의하는 기능들에 대해 다뤄요.

global_allocator 속성

global_allocator 속성은 메모리 할당자(allocator)를 선택하는 속성이에요. 어디선가 전역으로 메모리를 할당해야 할 때, 그 일을 누가 맡을지를 정해주는 거죠.

#![allow(unused)]
fn main() {
use core::alloc::{GlobalAlloc, Layout};
use std::alloc::System;

struct MyAllocator;

unsafe impl GlobalAlloc for MyAllocator {
    unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
        unsafe { System.alloc(layout) }
    }
    unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
        unsafe { System.dealloc(ptr, layout) }
    }
}

#[global_allocator]
static GLOBAL: MyAllocator = MyAllocator;
}
  • 문법: global_allocator 속성은 MetaWord 구문을 사용해요.
  • 위치 제한: 이 속성은 타입이 GlobalAlloc 트레잇을 구현하는 static 항목에만 적용할 수 있어요.
  • 중복 제한: 하나의 항목에는 한 번만 사용할 수 있어요. 그리고 크레이트 그래프 전체에서도 한 번만 사용할 수 있어요.
  • 이 속성은 표준 라이브러리 프렐류드(prelude)로부터 내보내져요.

windows_subsystem 속성

windows_subsystem 속성은 Windows 타깃에서 링크할 때의 서브시스템을 결정해요.

#![allow(unused)]
#![windows_subsystem = "windows"]
fn main() {
}
  • 문법: MetaNameValueStr 구문을 사용하며, 허용되는 값은 "console""windows"에요.
  • 위치 제한: 크레이트 루트(crate root)에만 적용할 수 있어요.
  • 중복: 처음 사용한 것만 효과가 있어요. 이후의 사용에는 rustc가 린트를 냅니다(이건 나중에 에러로 바뀔 수도 있어요).

이 속성은 Windows가 아닌 타깃bin이 아닌 크레이트 타입에서는 무시돼요.

두 가지 값이 어떻게 다른지 볼게요.

  • "console" (기본값): console 프로세스가 기존 console에서 실행되면 그 console에 연결되고, 그렇지 않으면 새 console 창이 만들어져요.
  • "windows": 기존 console과 무관하게 분리(detached)된 채로 실행돼요. 시작할 때 console 창을 표시하고 싶지 않은 GUI 애플리케이션에서 흔히 쓰는 값이에요.

더 알아보기 (Learn more)