반응형
현재 블럭의 내용은 작성자의 의견 혹은 생각이며, 틀린 내용이 있을 수 있습니다. 지적 감사드립니다.
아래 비트는 Windows 기준임을 알려드립니다.
64비트 운영체제
타입 | 크기 |
int | 4 |
short | 2 |
long | 4 |
long long | 8 |
char | 1 |
float | 4 |
double | 8 |
int pointer | 8 |
char pointer | 8 |
void pointer | 8 |
32비트 운영체제
타입 | 크기 |
int | 4 |
short | 2 |
long | 4 |
long long | 8 |
char | 1 |
float | 4 |
double | 8 |
int pointer | 4 |
char pointer | 4 |
void pointer | 4 |
struct의 메모리 크기
struct는 매우 독특한 동작을 한다.
구조체가 메모리 공간을 잡는 원리는 다음과 같다. (참고)
- 구조체는 구조체가 포함하고 있는 요소들 중 가장 큰 값을 기준으로 그 값의 배수만큼의 크기를 가진다.
// 4byte
struct Sample {
int x;
}
// 8byte
struct Sample {
int x;
char ch;
}
// 8byte
struct Sample {
int x;
float y;
}
// 16byte
struct Sample {
int x;
double y;
}
더욱 신기한 것은, 멤버의 순서에 따라 메모리 크기가 달라진다는 점이다.
// 16byte
struct Sample {
char ch;
int x;
double d;
};
// 24byte
struct Sample {
char ch;
double d;
int x;
};
CPU가 자료형을 저장할 때 효율을 위해 자료형 크기의 배수에 해당하는 주소에 위치한다고 한다.
ex) short는 2의 배수, int 는 4의 배수 등
아래 코드도 1, 1, 2, 4 로 들어갈 수 있어 총 8byte가 나온다.
// 8byte
struct Sample {
char ch;
char ch2;
short sh;
int x;
};
그런데 아래 구조체는 12바이트이다. 왜일까?
// 12byte
struct Sample {
int x;
char ch;
short sh;
char ch2;
};
예상대로라면 4, 2, 2, 2 로 10바이트가 나올 것 같다. (short는 2의 배수에 들어갈 수 있기 때문에)
대부분의 컴파일러는 효율적인 메모리 액세스를 위해 구조체 멤버들을 정렬한다.
따라서 패딩(padding)이 추가되며 12바이트로 메모리 정렬에 맞게 늘어나게 되는 것이다.
union의 메모리 크기
union의 크기는 멤버 중 가장 큰 크기의 메모리를 공유하게 된다.
// 4byte
union Data {
int i;
float f;
};
union도 동일하게 패딩이 추가되어 메모리 정렬이 이루어진다.
// 8byte
union Data {
int i;
float f;
char str[5];
};
위 코드에서 가장 큰 크기는 char[5]로 5바이트 이지만, 메모리 정렬로 union의 크기는 8바이트가 된다.
sizeof 연산자
sizeof 는 연산자로, 컴파일 타임에 계산된다.
따라서 자주 사용한다고 해서 변수에 size를 저장하는 것이 오히려 메모리 낭비가 될 수 있다.
반응형
'~ 2024.03 > C 언어' 카테고리의 다른 글
[C 언어 기초] C 언어 문법 훑어보기 - 데이터 타입, 제어문, 함수, 포인터 (1) | 2023.12.15 |
---|---|
[C 언어 기초] 동적 메모리 할당 (0) | 2023.12.13 |
[C 언어 기초] 문자열 문자마다 읽기 (0) | 2023.12.13 |
[C 언어 기초] 포인터와 배열 (0) | 2023.12.13 |
[C 언어 기초] 포인터 (0) | 2023.12.13 |