C/C++/Rust, 메모리 관리는 어떻게 다를까?

by DD
5개월 전
조회수 35

메모리는 단순히 바이트의 집합이며, C/C++/Rust는 이 바이트 위에 객체, 유효성, 라이프타임 등의 추상화를 구축함

C는 유효 타입 규칙을 통해, C++는 객체 라이프타임 개념을 도입하여 메모리 접근을 관리하며, Rust는 유효성 불변성을 통해 더욱 엄격한 메모리 안전성을 제공함

개발자들은 메모리 할당해제 방식을 이해하고, 각 언어의 특징을 활용하여 메모리 누수댕글링 포인터와 같은 문제를 방지해야 함

메모리 정렬과 캐시 라인

현대 프로세서는 메모리 접근 시 정렬(Alignment)을 요구하며, 정렬되지 않은 접근은 성능 저하를 유발한다. 구체적으로, 캐시 라인(Cache Lines)은 CPU가 메모리에서 데이터를 가져오는 최소 단위로, 데이터 구조가 캐시 라인 경계를 넘어가면 두 번의 캐시 fetch가 발생하여 대역폭 낭비를 초래한다. 따라서, 구조체 필드 간의 패딩(Padding)을 적절히 사용하여 메모리 레이아웃을 최적화해야 한다. 🚀

C/C++/Rust의 객체 유효성 비교

C++는 객체 라이프타임 개념을 통해 객체의 생성과 소멸 시점을 명시적으로 관리한다. 반면, Rust는 유효성 불변성(Validity Invariants)을 통해 컴파일 타임에 메모리 안전성을 보장한다. 구체적으로, Rust는 참조(reference) 생성 시점에 유효성을 검사하여, 댕글링 포인터(Dangling Pointer)와 같은 문제를 원천적으로 방지한다. 따라서, Rust는 C++보다 더욱 강력한 메모리 안전성을 제공한다. 🛡️

실전 적용: 메모리 관리 전략

C/C++ 개발자는 RAII(Resource Acquisition Is Initialization) 패턴을 활용하여 리소스 관리를 자동화하고, 스마트 포인터(Smart Pointers)를 통해 메모리 누수를 방지해야 한다. 따라서, 메모리 할당/해제 코드를 직접 작성하는 대신, 스마트 포인터를 사용하여 코드의 안정성을 높여야 한다. 결과적으로, Rust는 컴파일러가 메모리 안전성을 보장하므로, 개발자는 소유권(Ownership) 개념을 이해하고, Borrow Checker의 제약 조건을 준수해야 한다. ✅

Who Owns the Memory? Part 1: What is an Object?