일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- algorithm
- data structure
- D3
- OS
- D2
- db
- 백준
- Database
- 감상문
- SW Expert Academy
- 자료구조
- 재테크/투자
- c++
- BOJ
- algogritim
- 프로그래머스
- 독서
- Programmers
- language
- Computer Science
- swea
- 알고리즘
- 문제풀이
- LeetCode
- network
- 네트워크
- 법의학
- cs
- 데이터베이스
- 운영체제
Archives
- Today
- Total
선택은 나의 것
[C++] 바이트 패딩(Byte Padding) 본문
이 문서는 마크다운으로 작성되었으며 github 스타일에 최적화되어있습니다. github 링크를 통한 열람을 권장합니다.
바이트 패딩(Byte Padding)
바이트 패딩이란 클래스나 구조체에 패딩 바이트를 추가하여 CPU 접근을 더 용이하게 해 주는 것을 말합니다.
- 자칫 공간 낭비처럼 보일 수 있는 불필요한 패딩 공간을 확보하면서까지 메모리의 크기를 맞추는 이유는 캐시 hit율을 높여 cpu의 연산 횟수를 줄이기 위해서이다.
struct test {
int a; // 4byte
char c1; // 1byte
char c2; // 1byte
double d; // 8byte
short s; // 2byte
};
int main() {
std::cout << sizeof(test) << std::endl; // 24 출력
}
- 위의 예제 코드에서 구조체 test의 경우 자료형들의 총합은 16byte이므로 sizeof(test)를 하면 16을 출력할 것 같지만 24를 출력한다. 8byte는 어디서 온 것일까? 바로 바이트 패딩으로 인한 값이다.
- 내 경우 64bit CPU 때문에 한 번에 8byte씩 읽어온다. (34bit CPU는 한 번에 4byte) 즉, 처음 8byte만큼 읽어 올 때 int a, char c1, char c2를 읽고 남는 2byte만큼 padding 되었다. 그다음 double d를 8byte만큼 읽고, 마지막으로 남은 short s를 읽을 때 남는 6byte만큼 padding 된다. 따라서 24byte가 되는 것이다.
효율적인 공간 설계를 위해서는 이 구조체를 어떻게 설계하는 것이 좋을까?
- 처음 예제의 코드를 효율적으로 설계해보자.
struct test {
int a; // 4byte
char c1; // 1byte
char c2; // 1byte
short s; // 2byte
double d; // 8byte
};
int main() {
std::cout << sizeof(test) << std::endl; // 16 출력
}
- 이렇게 설계한다면 padding 되는 공간이 없어 좀 더 효율적일 것이다. 따라서 구조체 혹은 클래스를 설계할 때 이런 부분을 염두하여 설계하도록 하자.
'☽ Computer Science > Language' 카테고리의 다른 글
[C++] std::map & std::unordered_map / stdext::hash_map (0) | 2021.07.18 |
---|---|
[C++] 템플릿(Template)과 STL (0) | 2021.07.11 |
[C++] 동적 할당(Dynamic Allocation) / new & delete, malloc & free의 차이 (0) | 2021.07.06 |
[C++] 포인터(Pointer)와 레퍼런스(Reference)의 차이 (0) | 2021.06.27 |
Comments