본문 바로가기
Programming/C, C++

C++ 바이트 패딩 (Byte Padding)

by Dev_카페인 2022. 12. 14.
반응형

[C/C++]바이트 패딩 (Byte Padding)

바이트 패딩(Byte Padding)이란 클래스 (구조체)에 바이트를 추가해 CPU접근에 부하를 덜어주는 기법

padding 의 사전적 정의 : (형체를 잡기 위해 안에 대는) 속, 충전재

구조체나 클래스의 크기는 내부에 선언된 변수들의 크기로 결정된다고 생각되지만 실제 크기를 확인해 보면 대부분 내부에 선언된 변수 크기보다 더 큰 크기의 공간이 할당되어 있다. 이는 CPU접근을 용이하게 만들기 위한 것인데 32bit CPU는 한 번에 4byte를 읽을 수 있고 64bit CPU는 한 번에 8byte를 읽을 수 있다. 만약 int(4byte)자료형 사이에 char(1byte)자료형이 끼어 있다면 패딩이 없을 경우 CPU는 1byte로 인한 격차로 인해 2번의 연산을 수행하게 된다.

이처럼 CPU의 연산 낭비를 막기 위한 기법을 바이트 패딩이라 한다.

#include <stdio.h>

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

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

위의 예제 파일을 실행시켜보면 구조체의 크기가 32byte가 나온다.

실질적으로 temp 구조체 안에 있는 변수는 int형 (4byte) 2개, char형(1byte) 2개, double형(8byte) 1개, short형(2byte) 1개로 총 선언되어있는 멤버 변수들의 크기는 (4+4+1+1+8+2)로 총 20byte임에도 실제 크기는 32가 나온다.

실질적으로는 위와 같이 padding이 들어가 있어 총 32byte라는 크기가 나오게 되는 것이다.

32bit CPU를 예로 들었을 때 위와 같이 마지막 1byte가 남게 되어 연산을 2번 처리해야 하지만 패딩 바이트를 추가하여 한 번의 연산에 하나의 값이 들어가게 되고 메모리는 더 사용하지만 CPU는 한 번의 동작만 하면 되기에 연산이 보다 빠르게 처리가 된다.

패딩 바이트를 고려하여 위 코드를 효율적으로 사용하려면 배치를 조정해야한다.

#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));  // 24byte
}

별 차이 나지 않겠지 하며 대수롭게 여기기보다는 개발자라면 패딩 바이트는 최소한으로 생성되도록 유도하는 것이 필요하다.

가장 큰 byte를 소모하는 자료형이라면 되도록 가장 위에 선언해 주어 불필요한 메모리 낭비를 줄이는 것이 좋다.

출처 : 코딩팩토리블로그

 

반응형