[C, C++] 구조체의 패딩비트와 크기 최적화

구조체 크기의 의문점

구조체 크기는 멤버 전체 크기 합과 다른 경우가 많다. 실제로 그런지 확인해보자.

구조체 크기 테스트

** 아래 결과는 컴파일러에 따라 다를 수 있다.

test1

#include <stdio.h>

typedef struct test1{
    int a;
}test1;


int main(){
    printf("test1 : %d\r\n", sizeof(test1)); // output : 4
}

test1 구조체는 int 하나를 포함하므로 4바이트가 예상되며 실제 결과도 그와 같다.

test2

#include <stdio.h>

typedef struct test2{
    char a;
}test2;

int main(){
    printf("test2 : %d\r\n", sizeof(test2)); // output : 1
}

test2 구조체는 char 하나를 포함하므로 1바이트가 예상되며 실제 결과도 그와 같다.

test3

#include <stdio.h>

typedef struct test3{
    int a;
    char b;
}test3;

int main(){
    printf("test3 : %d\r\n", sizeof(test3)); // output : 8
}

test3 구조체는 int 하나와 char 하나를 포함하므로 5바이트가 예상되지만 실제 결과는 8바이트다.

test4

#include <stdio.h>

typedef struct test4{
    int a;
    int b;
    char c;
    char d;
}test4;

int main(){
    printf("test4 : %d\r\n", sizeof(test4)); // output : 12
}

test4 구조체는 int 두개와 char 두개를 포함하므로 10바이트가 예상되지만 실제 결과는 12바이트다.

패딩(Padding)

위 테스트 결과 test3과 test4는 예상과 다른것을 볼 수 있다. C언어는 구조체의 멤버 중 가장 크기가 큰 것을 기준으로 잡고 그것의 배수로 구조체의 사이즈를 늘려나간다. 그리고 기준보다 작은 멤버들은 패딩을 더해서 기준과 같게 만들어준다. test3에서의 기준은 int(4바이트)이므로 char(1바이트)는 3바이트의 패딩을 채워서 int와 같게 만들어준다. test4의 기준도 int인데, char가 연달아 두개 있으므로 패딩은 2바이트만 채운다.

그림으로 나타내면 다음과 같다.

test1

test2

test3

test4

이렇게 메모리에 패딩이 생기는 이유는 CPU가 메모리에 접근하는것을 최소화하여 동작속도를 빠르게 하기 위함이다. 자세한 내용은 “Memory Alignment”, “Word”, “Padding”, “Packing” 등의 키워드를 검색하여 찾아볼 수 있다.

구조체 크기 최적화

위와 같은 이유로 멤버의 위치만 바뀌어도 구조체의 크기가 달라질 수 있다.

#include <stdio.h>

typedef struct test5{
    int a;
    int b;
    double c;
}test5;

typedef struct test6{
    int a;
    double b;
    int c;
}test6;

int main(){
    printf("test5 : %d\r\n", sizeof(test5)); // output : 16
    printf("test6 : %d\r\n", sizeof(test6)); // output : 24
}

test5와 6 모두 int 두개, double 한개를 가지고 있지만 두 구조체의 크기는 다르다. test6은 패딩이 필요하기 때문이다.

test5

test6

따라서 구조체의 최적화를 위해서는 멤버의 위치를 고려하여야한다.

Leave a Comment