프로그래밍/C,C++,C#

[C,C++,C#] 구조체 padding 제거(feat. 구조체 크기 계산)

Beginner:) 2023. 6. 4.
320x100

이전 글에서 구조체의 크기가 멤버 변수보다 크게 잡히는 현상을 확인했다.

 

2023.06.04 - [프로그래밍/C,C++,C#] - [C,C++,C#] 구조체 메모리 크기 계산

 

[C,C++,C#] 구조체 메모리 크기 계산

C언어를 하면 구조체를 초반부에 배우는데, 좀 더 깊게 들어가 본다. 아래 코드의 결과는? #include struct Temp{ double a; int b; char c; }; int main() { struct Temp temp; printf("struct size = %ld\n", sizeof(temp)); return 0; }

park-duck.tistory.com

 

해결방법은 크기가 작은 멤버변수 순서로 선언하는 것이었는데,

 

그렇다고 char, double 순서로 놓는다고 해서 16byte가 7byte로 변하진 않는다.

 

padding을 최소화하는 하나의 솔루션인 것이지 아예 없애지는 않는 것이다.

 


다시 한 번,

아래 소스코드의 결과는 16byte이다.

#include <stdio.h>

struct Temp{
    char a;
    double b;
};

int main()
{
    struct Temp temp;

    printf("struct size = %ld\n", sizeof(temp));

    return 0;
}

 

padding을 최소화하는 방법은 __attribute__((__packed__))를 사용하는 방법이다.

#include <stdio.h>

struct __attribute__((__packed__)) Temp{
    char a;
    double b;
};

int main()
{
    struct Temp temp;

    printf("struct size = %ld\n", sizeof(temp));

    return 0;
}

 

#pragma를 사용하는 방법도 있으나, 모든 구조체가 다 적용되니 유의한다.

#include <stdio.h>
#pragma pack(1)

struct Temp{
    char a;
    double b;
};

int main()
{
    struct Temp temp;

    printf("struct size = %ld\n", sizeof(temp));

    return 0;
}
반응형

댓글