첫 번째 C++ (m) 할당이 항상 72KB인 이유는 무엇입니까?
첫 번째 C++ 메모리 할당이 예상 바이트 대신 72KB를 요청하는 이유를 알아보세요. 설명된 malloc 내부 및 OS 메모리 관리 계층을 살펴보세요.
Mewayz Team
Editorial Team
첫 번째 C++ 할당 뒤에 숨은 미스터리
간단한 C++ 프로그램을 작성합니다. 하나의 새로운 정수. 4바이트. strace 또는 즐겨 사용하는 메모리 프로파일러를 실행하면 프로세스가 운영 체제에서 대략 72KB를 요청했습니다. 4바이트가 아닙니다. 64바이트가 아닙니다. 전체 72KB. 만약 당신이 그 숫자를 쳐다보고 당신의 도구가 당신에게 거짓말을 하고 있는지 궁금해한 적이 있다면, 당신은 혼자가 아닙니다. 이 이상해 보이는 동작은 처음으로 메모리 내부를 파고드는 C++ 개발자들 사이에서 가장 자주 묻는 질문 중 하나이며, 그 대답은 코드와 실제 하드웨어 사이에 있는 계층을 통해 매혹적인 여행을 안내합니다.
새로운 전화를 걸면 어떻게 되나요?
72KB 수치를 이해하려면 전체 할당 체인을 추적해야 합니다. C++ 코드가 new int를 실행하면 컴파일러는 이를 new 연산자에 대한 호출로 변환합니다. 이는 대부분의 Linux 시스템에서 glibc의 malloc에 위임됩니다. 그러나 malloc은 커널에 4바이트 메모리를 직접 요청하지 않습니다. 커널은 페이지(x86_64에서 일반적으로 4KB)로 작동하며 시스템 호출 비용은 단순한 메모리 액세스에 비해 엄청납니다. 모든 개별 할당에 대해 brk() 또는 mmap()을 호출하면 모든 중요하지 않은 프로그램이 중단됩니다.
대신 glibc의 메모리 할당자(Doug Lea의 클래식 dlmalloc에서 파생된 ptmalloc2라는 구현)가 중개자 역할을 합니다. 커널에서 미리 큰 메모리 블록을 요청한 다음 프로그램에 필요할 때마다 이를 더 작은 조각으로 나눕니다. 이것이 첫 번째 4바이트 할당이 운영 체제에 훨씬 더 큰 요청을 트리거하는 근본적인 이유입니다. 할당자는 낭비되지 않습니다. 전략적으로 진행되고 있습니다.
72KB 분석: 바이트가 가는 곳
💡 알고 계셨나요?
Mewayz는 8개 이상의 비즈니스 도구를 하나의 플랫폼으로 대체합니다.
CRM · 인보이싱 · HR · 프로젝트 · 예약 · eCommerce · POS · 애널리틱스. 영구 무료 플랜 이용 가능.
무료로 시작하세요 →초기 할당 오버헤드는 런타임이 단일 바이트의 사용 가능한 메모리를 제공하기 전에 초기화해야 하는 여러 개별 구성 요소에서 발생합니다. 각 구성 요소를 이해하면 해당 숫자가 해당 위치에 도달하는 이유가 설명됩니다.
첫째, glibc의 malloc은 메인 스레드의 모든 할당을 추적하는 기본 장부 구조인 메인 아레나를 초기화합니다. 이 경기장에는 다양한 할당 크기에 대한 힙, 사용 가능 목록 포인터 및 bin 구조에 대한 메타데이터가 포함됩니다. 할당자는 sbrk()를 통해 프로그램 중단을 확장하고 초기 확장은 M_TOP_PAD라는 내부 매개변수에 의해 제어되며 기본값은 128KB 패딩입니다. 그러나 실제 초기 요청은 페이지 정렬 및 기존 중단 위치에 맞게 조정되므로 첫 번째 요청이 더 작아지는 경우가 많습니다. 일반적으로 새로 시작된 프로세스에서 72KB 수치 근처에 도착합니다.
둘째, glibc 2.26부터 할당자는 처음 사용할 때 스레드 로컬 캐시(tcache)를 초기화합니다. tcache에는 64개의 bin(작은 할당 크기 클래스당 하나)이 포함되어 있으며 각각은 최대 7개의 캐시된 청크를 보유할 수 있습니다. tcache_perthread_struct 자체는 약 1KB를 소비하지만 이를 초기화하면 더 넓은 경기장 설정이 트리거됩니다. 셋째, C++ 런타임은 main()이 실행되기 전에 이미 할당을 수행했습니다. 정적 생성자, std::cout 및 친구에 대한 iostream 버퍼 초기화, 로케일 설정 모두가 초기 힙 공간에 기여합니다.
투기장 시스템과 사전 할당이 현명한 이유
단편적으로 요청하는 대신 상당한 양의 메모리를 사전 할당하기로 한 결정은 구현 시 우연이 아닙니다. 이는 수십 년간의 시스템 프로그래밍 경험에 뿌리를 둔 의도적인 엔지니어링 절충안입니다. brk() 또는 mmap()에 대한 모든 호출에는 사용자 공간에서 커널 공간으로의 컨텍스트 전환, 프로세스의 가상 메모리 매핑 수정 및 잠재적인 페이지 테이블 업데이트가 포함됩니다. 최신 하드웨어에서 단일 시스템 호출의 비용은 약 100~200나노초입니다. 이는 개별적으로는 사소하고 규모가 크면 재앙입니다.
초기화 중에 10,000개의 작은 할당을 수행하는 프로그램을 고려하십시오. 사전 할당이 없으면 이는 10,000개의 시스템 호출을 의미하며 약 1~2밀리초의 순수 오버헤드가 발생합니다. 경기장 기반 할당자를 사용하면 첫 번째 할당 트리거가
Build Your Business OS Today
From freelancers to agencies, Mewayz powers 138,000+ businesses with 207 integrated modules. Start free, upgrade when you grow.
Create Free Account →Related Posts
비슷한 기사 더 보기
주간 비즈니스 팁 및 제품 업데이트. 영원히 무료입니다.
구독 중입니다!
관련 기사
Hacker News
288,493개 요청 – 이상한 캐시 비율에서 XML-RPC 무차별 대입을 발견한 방법
Apr 17, 2026
Hacker News
파키스탄에서 아동 HIV 발생 센터의 병원에서 주사기를 재사용하다 적발
Apr 17, 2026
Hacker News
CadQuery는 3D CAD 모델 구축을 위한 오픈 소스 Python 라이브러리입니다.
Apr 17, 2026
Hacker News
HN 표시: Spice 시뮬레이션 → 오실로스코프 → Claude Code로 검증
Apr 17, 2026
Hacker News
우리가 좋아하는 건 모두 싸이옵
Apr 17, 2026
Hacker News
"비참한 자들아, 나를 나쁘게 말하라": 괴테와 실러의 제니온(1896년판)
Apr 17, 2026
행동할 준비가 되셨나요?
오늘 Mewayz 무료 체험 시작
올인원 비즈니스 플랫폼. 신용카드 불필요.
무료로 시작하세요 →14일 무료 체험 · 신용카드 없음 · 언제든지 취소 가능