2024-11-02
Visual Studio 를 통해, 알고리즘 문제를 풀다가 다음과 같은 기능을 발견하였다.
구조체 타입에 마우스 커서를 올려두니
크기, 맞춤 에 대한 정보와 메모리 레이아웃 에 대해 알 수 있었다.
크기, 맞춤 | 메모리 레이아웃 |
---|---|
![]() | ![]() |
구조체나 클래스의 크기와 맞춤 은 데이터가 메모리에 배치될 때 중요한 요소이다.
컴파일러와 시스템 아키텍처에 따라 다를 수도 있다.
특정 데이터 타입이나 객체가 메모리에서 차지하는 총 바이트 수를 의미
데이터가 메모리에 어떻게 정렬되는지에 대한 기준을 의미
int 2개를 멤버로 가지는 구조.
각 int가 4bytes 이므로, pair<int,int> 의 크기는 4+4 = 8bytes 이다.
두 int 가 모두 4bytes 맞춤에 따라 정렬되므로, 추가적으로 패딩이 필요하지 않고 4bytes 로 맞춰진다.
double 과 int 를 멤버로 가지는 구조.
메모리 접근 효율성을 위해,
구조체의 전체 맞춤은 가장 큰 멤버의 맞춤인 double 의 크기인 8 bytes 에 맞춰진다.
따라서, int 는 8bytes 맞춤 규칙에 따라 4bytes 의 패딩이 추가되어
pair<double,int> 의 크기는 8 + 4 + 4 = 16 bytes 가 된다.
int 를 멤버로 가지는 자동으로 메모리가 할당되는 배열.
vector 의 기본 멤버인
1. 데이터 포인터 : 벡터가 저장하는 실제 요소(int) 를 가리키는 포인터, 8bytes
2. 크기 변수 : 현재 저장된 요소의 개수를 나타내는 변수, 8bytes
3. 용량 변수 : 벡터에 할당된 총 메모리 용량을 나타내는 변수, 8bytes
로 인해 기본적으로 8 + 8 + 8 = 24bytes 를 차지하고, 맞춤은 8bytes 가 되겠다.
내 PC 의 경우, 컴파일러의 최적화 및 메모리 정렬 규칙이 적용되어
추가적인 패딩이 이루어져 크기가 24 + 8 = 32bytes 이다.
pair<int,int> 를 멤버로 가지는 자동으로 메모리가 할당되는 배열.
vector 내부적으로 데이터 포인터, 크기, 용량을 저장하는 필드의 크기인 24bytes.
pair<int,int> 는 각각 4bytes 맞춤을 가지지만, vector 자체의 맞춤 규칙을 따라 8bytes 가 된다.
따라서, 크기는 24 + 8 = 32bytes, 맞춤은 8bytes 이다.
데이터 구조가 메모리에 어떻게 배치되는지를 의미한다.
대학교 2학년 때부터 쭉 써왔던 Visual Studio 였지만,
이런 기능을 제공하는지 몰랐었다.
메모리 관리와 성능 최적화에 있어서
자료형의 크기를 이해하고, 되도록 불필요한 패딩을 피하게끔 코드를 작성하여
메모리 공간을 절약해야겠다는 생각이 들었다.