본문 바로가기
공부

[CS]바이트 패딩(Byte Padding)

by MY블로그 2023. 4. 20.

바이트 패딩이란?

CPU가 연산을 할때 한번에 받아들일 수 있는 크기씩 맞추어 주어 효율성을 올려주는 방법 입니다.

 

예를들자면 클래스(구조체)는 다양한 자료형이 모여있는 집합체 입니다.

#include <stdio.h>

struct temp {
    int a; // 4byte
    int b; // 4byte
    char c; // 1byte
    char d; // 1byte
    double e; // 8byte
    short f; // 2byte
};

void main() {
    printf("구조체 temp의 크기 : %d\n", sizeof(temp)); // 32로 출력됨
}

위의 예시를 보자면 temp 라는 구조체의 크기는 4+4+1+1+8+2 = 20 의 크기라 예상할 수 있지만

바이트패딩으로 CPU가 접근하기 쉽도록 단위를 4byte로 맞추어주어 32byte 의 크기가 됩니다.

출처 :&nbsp;https://coding-factory.tistory.com/670

int 형 a와 b 는 4byte 이기 때문에 4칸씩 공간이 할당되고

char형 c와 d는 각 1byte+ 패딩3byte로 구성이되며

double형 e는 4byte + 4byte 총 8byte로 구성이 됩니다.

short 형 f는 2byte + 패딩6byte로 8byte를 구성합니다.

마지막 short 형에 패딩이 6byte가 잡힌 이유는 해당 구조체에서 가장큰 자료형은 double 형 이기 때문에

기본적인 크기는 8byte로 설정되기 때문입니다.

 

이때 더 커진 공간들은 얼핏 낭비처럼 보일 수 도 있으나 크기를 통일 시킬 경우 CPU의 접근을 더 용이하게 해주게 되므로 캐시히트율을 높여 불필요한 연산 횟수를 줄일 수 있게 됩니다.

 

위처럼 패딩이 없을 경우를 보도록 하겠습니다.

구조체에 기입된 자료형이 순서대로 공간을 차지한다면 아래와 같이 공간이 할당 됩니다.

출처 :&nbsp;https://coding-factory.tistory.com/670

 

32bit CPU는 한번에 4byte

64bit CPU는 한번에 8byte 를 읽어 들일 수 있는데

32비트 CPU를 예로 들자면 위처럼 나눠 읽게 됩니다.

처음 int형의경우 간단히 읽게되지만 다음4바이트 구간은 char형 + int 형이 섞여있기때문에 둘을 분류시키고 다음 4byte 구간에있는 두번째 int형을 가져오는 연산 작업이 추가되어 효율성이 떨어지게 됩니다.

 

때문에 바이트 패딩을 적용시켜 효율성을 높일 수 있습니다.

 

출처 :&nbsp;https://coding-factory.tistory.com/670

위처럼 char형 구간에 3byte의 패딩이 추가된다면 그다음 연산으로 효율적으로 진행이 가능하게됩니다.

 

패딩외에도 설게 당시부터 조금더 효율적으로 공간을 설계 시킨다면 패딩을 줄이는 효과를 낼 수 있습니다.

#include <stdio.h>

struct temp {
    double e; // 8byte
    int a; // 4byte
    int b; // 4byte
    char c; // 1byte
    char d; // 1byte
    short f; // 2byte
};

void main() {

    printf("구조체 temp의 크기 : %d\n", sizeof(temp)); //24 byte
}

위의 구조체와 완전히 동일한 구성이지만 구성된 순서가 바뀌어있습니다.

크게 차이는 없어보이지만 가장큰 자료형을 위로 올려주고 각각 4byte 단위로 구성시켜 준 형태입니다.

이때 메모리 공간의 배치는 아래와 같이 됩니다.

출처 :&nbsp;https://coding-factory.tistory.com/670

순서만 바뀌었을 뿐이지만 12byte의 패딩이 4byte의 패딩으로 8byte가 감소 하였습니다.

이처럼 세세한 곳에서의 공간 절약이 곧 최적화와 같은 것이 아닐까 생각합니다.

'공부' 카테고리의 다른 글

[C++]함수포인터 참고 블로그  (0) 2023.04.22
[C++ / 자료구조]연결 리스트(Linked List)  (0) 2023.04.20
[CS]캐시 메모리(캐시히트&캐시미스)  (0) 2023.04.20
[CS]기초  (0) 2023.04.19
[C,C++] 함수 호출 규약  (0) 2023.04.08

댓글