고흐의 연구실/C언어와 C++

[C언어] 구조체 정렬 크기 조절, #pragma 란??

전고흐 2020. 8. 9. 20:43
728x90

구조체 크기?

구조체는 기본적으로, 가장 사이즈가 큰 요소에 맞춰지게 된다.

예를들면,

struct Ex {
    int a;
    char b;
    long long c;
};

라고 한다면, a의 크기는 4, b의 크기는 1, longlong의 크기는 8이면, 이 구조체 각 요소는 크기가 8로 맞춰진다.

그렇다면 이 구조체의 총 크기는, 8 * 3 =24 이다.

하지만, 이 구조치를 #pragma를 사용하여 원하는 크기로 잘라서 조절 할 수 있다.

아래 내용 참조.

 

구조체 정렬 크기 조절하기

ㅇVisual Studio, GCC 4.0 이상

#pragma pack(push, 정렬크기)
#pragma pack(pop)

ㅇGCC 4.0 미만

__attribute__((aligned(정렬크기), packed))

ㅇExample

#include <stdio.h>

#pragma pack(push, 1) // 1바이트 크기로 정렬
struct PacketHeader {
    char flags; // 1바이트
    int seq; // 4바이트
};
#pragma pack(pop) // 정렬 설정을 이전 상태(기본값)로 되돌림

int main()
{
    struct PacketHeader header;
    printf("%d\n", sizeof(header.flags)); // 1: char는 1바이트
    printf("%d\n", sizeof(header.seq)); // 4: int는 4바이트
    printf("%d\n", sizeof(header)); // 5: 1바이트 단위로 정렬했으므로 // 구조체 전체 크기는 5바이트
    return 0;
}

 

728x90