프로그래밍/CPP

[C++] 구조체 변수의 크기 (패딩 바이트)

스스배 2024. 1. 5. 23:06

 

구조체와 패딩바이트

모든 시스템은 데이터를 빠르게 읽고 쓰기 위해 일정한 크기 단위로 메모리에 접근합니다.

따라서 컴파일러는 구조체 멤버의 크기가 들쑥날쑥한 경우 패딩 바이트를 넣어 멤버들을 가지런하게 정렬합니다.

이를 바이트 얼라인먼트라고 합니다.

 

보편적으로 바이트의 크기는 바이트의 크기가 가장 큰 멤버가 메모리를 할당하는 기준 단위가 됩니다.

struct Student
{
	int num;
	double grade;
};

 

grade가 패딩바이트 크기의 기준이 되고 (double 8바이트)

num에는 패딩파이트 크기에 맞춰야 하기 때문에 4바이트의 패딩바이트가 추가되면서

총 16바이트 크기의 구조체가 됩니다.

num Padding Byte
grade

 

이때 멤버의 순서에 따라 구조체가 달라질 수 있으므로

패딩바이트가 가장 작도록 구조테를 선언하면 메모리를 아낄 수 있습니다.

 

낭비되는 예

struct Student
{
    char ch1;
    short num;
    char ch2;
    int score;
    double grade;
    char ch3;
};

 

 

정렬된 예

struct Student
{
    char ch1;
    char ch2;
    short num;
    int score;
    double grade;
    char ch3;
};

 

 

패딩 바이트 안 쓰는 방법

#pragma pack(1);

 

이 경우 데이터를 읽고 쓰는 시간은 더 걸릴수 있겠지만 구조체의 크긴는 모든 멤버의 크기를 더한 것과 같아지므로

사용하는 메모리의 크기는 최소화할 수 있습니다.

이 구문은 구조체 선언 전에 적어주며, 보통 include 다음에 넣어줍니다.

 


출처

혼자 공부하는 C언어