[내용]

40 byte → 20byte 사용

 

[코드]

#define _CRT_SECURE_NO_WARNINGS

#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <stddef.h>   // offsetof 매크로가 정의된 헤더 파일

// C 언어에서는 구조체를 정렬할 때 멤버 중에서 가장 큰 자료형 크기의 배수로 정렬합니다.

#pragma pack(push, 1)    // 1 byte 크기로 정렬

typedef struct _DATA_MESSAGE1
{
    // 구조체 전체 크기: 20 byte, 패딩: 메모리 남은 공간

    char a; 
    char b;
    char c;
    char d;
    int e;
    int f;
    double g;

}DATA_MESSAGE1, * PDATA_MESSAGE1;

#pragma pack(pop)        // 정렬 설정을 이전 상태(기본값)로 되돌림

int main(void)
{
    DATA_MESSAGE1 dMeg;

    printf("char 메모리 공간의 크기: %d \n", sizeof(dMeg.a));
    printf("char 메모리 공간의 크기: %d \n", sizeof(dMeg.b));
    printf("char 메모리 공간의 크기: %d \n", sizeof(dMeg.c));
    printf("char 메모리 공간의 크기: %d \n", sizeof(dMeg.d));
    printf("int 메모리 공간의 크기: %d \n", sizeof(dMeg.e));
    printf("int 메모리 공간의 크기: %d \n", sizeof(dMeg.f));
    printf("double 메모리 공간의 크기: %d \n", sizeof(dMeg.g));

    printf("구조체 전체 크기는: %d \n", sizeof(dMeg));

    // offsetof 구조체에서 해당 멤버의 상대 위치가 반환
    printf("구조체 멤버의 a 위치 offset: %d\n", offsetof(DATA_MESSAGE1, a));    // 0
    printf("구조체 멤버의 b 위치 offset: %d\n", offsetof(DATA_MESSAGE1, b));    // 1
    printf("구조체 멤버의 c 위치 offset: %d\n", offsetof(DATA_MESSAGE1, c));    // 2
    printf("구조체 멤버의 d 위치 offset: %d\n", offsetof(DATA_MESSAGE1, d));    // 3

    printf("구조체 멤버의 e 위치 offset: %d\n", offsetof(DATA_MESSAGE1, e));    // 4
    printf("구조체 멤버의 f 위치 offset: %d\n", offsetof(DATA_MESSAGE1, f));    // 8

    printf("구조체 멤버의 g 위치 offset: %d\n", offsetof(DATA_MESSAGE1, g));    // 12

    return 0;
}

 

[pirnt]

char 메모리 공간의 크기: 1
char 메모리 공간의 크기: 1
char 메모리 공간의 크기: 1
char 메모리 공간의 크기: 1
int 메모리 공간의 크기: 4
int 메모리 공간의 크기: 4
double 메모리 공간의 크기: 8
구조체 전체 크기는: 20
구조체 멤버의 a 위치 offset: 0
구조체 멤버의 b 위치 offset: 1
구조체 멤버의 c 위치 offset: 2
구조체 멤버의 d 위치 offset: 3
구조체 멤버의 e 위치 offset: 4
구조체 멤버의 f 위치 offset: 8
구조체 멤버의 g 위치 offset: 12

 

[내용]

기존 C언어 구조체 크기 구하기 4와 동일한 코드 단 자료형 위치가 달라지면서 메모리 효율 있게 사용

32 byte → 24 byte 사용

 

[code]

 

#define _CRT_SECURE_NO_WARNINGS

#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <stddef.h>   // offsetof 매크로가 정의된 헤더 파일

// C 언어에서는 구조체를 정렬할 때 멤버 중에서 가장 큰 자료형 크기의 배수로 정렬합니다.

typedef struct _DATA_MESSAGE1
{
    // 구조체 전체 크기: 24 byte, 패딩: 메모리 남은 공간

    // | 0:a | 1:패딩 | 2:패딩 | 3:패딩 | 4:패딩 | 5:패딩 | 6:패딩 | 7:패딩 | (byte 단위)
    char a; // 첫 번째 메모리 생성 8 바이트

    // | 0:a | 1:b | 2:패딩 | 3:패딩 | 4:패딩 | 5:패딩 | 6:패딩 | 7:패딩 | (byte 단위)
    char b;

    // | 0:a | 1:b | 2:c | 3:패딩 | 4:패딩 | 5:패딩 | 6:패딩 | 7:패딩 | (byte 단위)
    char c;

    // | 0:a | 1:b | 2:c | 3:d | 4:패딩 | 5:패딩 | 6:패딩 | 7:패딩 | (byte 단위)
    char d;

    // | 0:a | 1:b | 2:c | 3:d | 4:e | 5:패딩 | 6:패딩 | 7:패딩 | 8:패딩 | 9:패딩 | 10:패딩 | 11:패딩 | 12:패딩 | 13:패딩 | 14:패딩 | 15:패딩 |
    int e; // 두 번째 메모리 생성 8 바이트

    // | 0:a | 1:b | 2:c | 3:d | 4:e | 5:패딩 | 6:패딩 | 7:패딩 | 8:f | 9:패딩 | 10:패딩 | 11:패딩 | 12:패딩 | 13:패딩 | 14:패딩 | 15:패딩 |
    int f;

    // | 0:a | 1:b | 2:c | 3:d | 4:e | 5:패딩 | 6:패딩 | 7:패딩 | 8:f | 9:패딩 | 10:패딩 | 11:패딩 | 12:패딩 | 13:패딩 | 14:패딩 | 15:패딩 |
    // | 16:g | 17:패딩 | 18:패딩 | 19:패딩 | 20:패딩 | 21:패딩 | 22:패딩 | 23:패딩 |
    double g; // 세 번째 메모리 생성 8 바이트

}DATA_MESSAGE1, * PDATA_MESSAGE1;

int main(void)
{
    DATA_MESSAGE1 dMeg;

    printf("char 메모리 공간의 크기: %d \n", sizeof(dMeg.a));
    printf("char 메모리 공간의 크기: %d \n", sizeof(dMeg.b));
    printf("char 메모리 공간의 크기: %d \n", sizeof(dMeg.c));
    printf("char 메모리 공간의 크기: %d \n", sizeof(dMeg.d));
    printf("int 메모리 공간의 크기: %d \n", sizeof(dMeg.e));
    printf("int 메모리 공간의 크기: %d \n", sizeof(dMeg.f));
    printf("double 메모리 공간의 크기: %d \n", sizeof(dMeg.g));

    printf("구조체 전체 크기는: %d \n", sizeof(dMeg));

    // offsetof 구조체에서 해당 멤버의 상대 위치가 반환
    printf("구조체 멤버의 a 위치 offset: %d\n", offsetof(DATA_MESSAGE1, a));    // 0
    printf("구조체 멤버의 b 위치 offset: %d\n", offsetof(DATA_MESSAGE1, b));    // 1
    printf("구조체 멤버의 c 위치 offset: %d\n", offsetof(DATA_MESSAGE1, c));    // 2
    printf("구조체 멤버의 d 위치 offset: %d\n", offsetof(DATA_MESSAGE1, d));    // 3
    printf("구조체 멤버의 e 위치 offset: %d\n", offsetof(DATA_MESSAGE1, e));    // 4
    printf("구조체 멤버의 f 위치 offset: %d\n", offsetof(DATA_MESSAGE1, f));    // 8
    printf("구조체 멤버의 g 위치 offset: %d\n", offsetof(DATA_MESSAGE1, g));    // 16

    return 0;
}

[print]

 

char 메모리 공간의 크기: 1
char 메모리 공간의 크기: 1
char 메모리 공간의 크기: 1
char 메모리 공간의 크기: 1
int 메모리 공간의 크기: 4
int 메모리 공간의 크기: 4
double 메모리 공간의 크기: 8
구조체 전체 크기는: 24
구조체 멤버의 a 위치 offset: 0
구조체 멤버의 b 위치 offset: 1
구조체 멤버의 c 위치 offset: 2
구조체 멤버의 d 위치 offset: 3
구조체 멤버의 e 위치 offset: 4
구조체 멤버의 f 위치 offset: 8
구조체 멤버의 g 위치 offset: 16

 

[code]

 

#define _CRT_SECURE_NO_WARNINGS

#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <stddef.h>   // offsetof 매크로가 정의된 헤더 파일

// C 언어에서는 구조체를 정렬할 때 멤버 중에서 가장 큰 자료형 크기의 배수로 정렬합니다.

typedef struct _DATA_MESSAGE1
{
    // 구조체 전체 크기: 32 byte, 패딩: 메모리 남은 공간

    // | 0:a | 1:패딩 | 2:패딩 | 3:패딩 | 4:패딩 | 5:패딩 | 6:패딩 | 7:패딩 | (byte 단위)
    char a;

    // | 0:a | 1:패딩 | 2:패딩 | 3:패딩 | 4:패딩 | 5:패딩 | 6:패딩 | 7:패딩 | 8:b | 9:패딩 | 10:패딩 | 11:패딩 | 12:패딩 | 13:패딩 | 14:패딩 | 15:패딩 |
    double b;

    // | 0:a | 1:패딩 | 2:패딩 | 3:패딩 | 4:패딩 | 5:패딩 | 6:패딩 | 7:패딩 | 8:b | 9:패딩 | 10:패딩 | 11:패딩 | 12:패딩 | 13:패딩 | 14:패딩 | 15:패딩 |
    // | 16:c | 17:패딩 | 18:패딩 | 19:패딩 | 20:패딩 | 21:패딩 | 22:패딩 | 23:패딩 | 24:패딩 | 25:패딩 | 26:패딩 | 27:패딩 | 28:패딩 | 29:패딩 | 30:패딩 | 31:패딩 |
    char c;

    // | 0:a | 1:패딩 | 2:패딩 | 3:패딩 | 4:패딩 | 5:패딩 | 6:패딩 | 7:패딩 | 8:b | 9:패딩 | 10:패딩 | 11:패딩 | 12:패딩 | 13:패딩 | 14:패딩 | 15:패딩 |
    // | 16:c | 17:패딩 | 18:패딩 | 19:패딩 | 20:d | 21:패딩 | 22:패딩 | 23:패딩 | 24:패딩 | 25:패딩 | 26:패딩 | 27:패딩 | 28:패딩 | 29:패딩 | 30:패딩 | 31:패딩 |
    int d;

    // | 0:a | 1:패딩 | 2:패딩 | 3:패딩 | 4:패딩 | 5:패딩 | 6:패딩 | 7:패딩 | 8:b | 9:패딩 | 10:패딩 | 11:패딩 | 12:패딩 | 13:패딩 | 14:패딩 | 15:패딩 |
    // | 16:c | 17:패딩 | 18:패딩 | 19:패딩 | 20:d | 21:패딩 | 22:패딩 | 23:패딩 | 24:e | 25:패딩 | 26:패딩 | 27:패딩 | 28:패딩 | 29:패딩 | 30:패딩 | 31:패딩 |
    int e;

    // | 0:a | 1:패딩 | 2:패딩 | 3:패딩 | 4:패딩 | 5:패딩 | 6:패딩 | 7:패딩 | 8:b | 9:패딩 | 10:패딩 | 11:패딩 | 12:패딩 | 13:패딩 | 14:패딩 | 15:패딩 |
    // | 16:c | 17:패딩 | 18:패딩 | 19:패딩 | 20:d | 21:패딩 | 22:패딩 | 23:패딩 | 24:e | 25:패딩 | 26:패딩 | 27:패딩 | 28:f | 29:패딩 | 30:패딩 | 31:패딩 |
    char f;
    
    // | 0:a | 1:패딩 | 2:패딩 | 3:패딩 | 4:패딩 | 5:패딩 | 6:패딩 | 7:패딩 | 8:b | 9:패딩 | 10:패딩 | 11:패딩 | 12:패딩 | 13:패딩 | 14:패딩 | 15:패딩 |
    // | 16:c | 17:패딩 | 18:패딩 | 19:패딩 | 20:d | 21:패딩 | 22:패딩 | 23:패딩 | 24:e | 25:패딩 | 26:패딩 | 27:패딩 | 28:f | 29:g | 30:패딩 | 31:패딩 |
    char g;


}DATA_MESSAGE1, * PDATA_MESSAGE1;

int main(void)
{
    DATA_MESSAGE1 dMeg;

    printf("char 메모리 공간의 크기: %d \n", sizeof(dMeg.a));
    printf("double 메모리 공간의 크기: %d \n", sizeof(dMeg.b));
    printf("char 메모리 공간의 크기: %d \n", sizeof(dMeg.c));
    printf("int 메모리 공간의 크기: %d \n", sizeof(dMeg.d));
    printf("int 메모리 공간의 크기: %d \n", sizeof(dMeg.e));
    printf("char 메모리 공간의 크기: %d \n", sizeof(dMeg.f));
    printf("char 메모리 공간의 크기: %d \n", sizeof(dMeg.g));

    printf("구조체 전체 크기는: %d \n", sizeof(dMeg));

    // offsetof 구조체에서 해당 멤버의 상대 위치가 반환
    printf("구조체 멤버의 a 위치 offset: %d\n", offsetof(DATA_MESSAGE1, a));    // 0
    printf("구조체 멤버의 b 위치 offset: %d\n", offsetof(DATA_MESSAGE1, b));    // 8
    printf("구조체 멤버의 c 위치 offset: %d\n", offsetof(DATA_MESSAGE1, c));    // 16
    printf("구조체 멤버의 d 위치 offset: %d\n", offsetof(DATA_MESSAGE1, d));    // 20
    printf("구조체 멤버의 e 위치 offset: %d\n", offsetof(DATA_MESSAGE1, e));    // 24
    printf("구조체 멤버의 f 위치 offset: %d\n", offsetof(DATA_MESSAGE1, f));    // 28
    printf("구조체 멤버의 g 위치 offset: %d\n", offsetof(DATA_MESSAGE1, g));    // 29

    return 0;
}

 
[print]

char 메모리 공간의 크기: 1
double 메모리 공간의 크기: 8
char 메모리 공간의 크기: 1
int 메모리 공간의 크기: 4
int 메모리 공간의 크기: 4
char 메모리 공간의 크기: 1
char 메모리 공간의 크기: 1
구조체 전체 크기는: 32
구조체 멤버의 a 위치 offset: 0
구조체 멤버의 b 위치 offset: 8
구조체 멤버의 c 위치 offset: 16
구조체 멤버의 d 위치 offset: 20
구조체 멤버의 e 위치 offset: 24
구조체 멤버의 f 위치 offset: 28
구조체 멤버의 g 위치 offset: 29

[code]

 

#define _CRT_SECURE_NO_WARNINGS

#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <stddef.h>   // offsetof 매크로가 정의된 헤더 파일

// C 언어에서는 구조체를 정렬할 때 멤버 중에서 가장 큰 자료형 크기의 배수로 정렬합니다.

typedef struct _DATA_MESSAGE1
{
    // 구조체 전체 크기: 16 byte, 패딩: 메모리 남은 공간

    // | 0:a | 1:패딩 | 2:패딩 | 3:패딩 | 4:패딩 | 5:패딩 | 6:패딩 | 7:패딩 | (byte 단위)
    char a; // 8 byte 에서 1 byte 메모리 사용

    // | 0:a | 1:b | 2:패딩 | 3:패딩 | 4:패딩 | 5:패딩 | 6:패딩 | 7:패딩 | (byte 단위)
    char b; // 기존 8 byte 에서 1 byte 메모리 사용

    // | 0:a | 1:b | 2:패딩 | 3:패딩 | 4:c | 5:패딩 | 6:패딩 | 7:패딩 | (byte 단위)
    int c; // 기존 8 byte 1 byte 메모리 사용

    // | 0:a | 1:b | 2:패딩 | 3:패딩 | 4:c | 5:패딩 | 6:패딩 | 7:패딩 | 8:d | 9:패딩 | 10:패딩 | 11:패딩 | 12:패딩 | 13:패딩 | 14:패딩 | 15:패딩 |
    double d; // 8 byte 에서 1 byte 메모리 사용

}DATA_MESSAGE1, * PDATA_MESSAGE1;

int main(void)
{
    DATA_MESSAGE1 dMeg;

    printf("char 메모리 공간의 크기: %d \n", sizeof(dMeg.a));
    printf("char 메모리 공간의 크기: %d \n", sizeof(dMeg.b));
    printf("int 메모리 공간의 크기: %d \n", sizeof(dMeg.c));
    printf("double 메모리 공간의 크기: %d \n", sizeof(dMeg.d));

    printf("구조체 전체 크기는: %d \n", sizeof(dMeg));

    // offsetof 구조체에서 해당 멤버의 상대 위치가 반환
    printf("구조체 멤버의 a 위치 offset: %d\n", offsetof(DATA_MESSAGE1, a));    // 0
    printf("구조체 멤버의 b 위치 offset: %d\n", offsetof(DATA_MESSAGE1, b));    // 1
    printf("구조체 멤버의 c 위치 offset: %d\n", offsetof(DATA_MESSAGE1, c));    // 4
    printf("구조체 멤버의 d 위치 offset: %d\n", offsetof(DATA_MESSAGE1, d));    // 8

    return 0;
}
 
[print]

char 메모리 공간의 크기: 1
char 메모리 공간의 크기: 1
int 메모리 공간의 크기: 4
double 메모리 공간의 크기: 8
구조체 전체 크기는: 16
구조체 멤버의 a 위치 offset: 0
구조체 멤버의 b 위치 offset: 1
구조체 멤버의 c 위치 offset: 4
구조체 멤버의 d 위치 offset: 8

[code]

 

#define _CRT_SECURE_NO_WARNINGS

#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <stddef.h>   // offsetof 매크로가 정의된 헤더 파일

 // C 언어에서는 구조체를 정렬할 때 멤버 중에서 가장 큰 자료형 크기의 배수로 정렬합니다.

typedef struct _DATA_MESSAGE1
{
    // 구조체 전체 크기: 8 byte, 패딩: 메모리 남은 공간

    // | 0:a | 1:패딩 | 2:패딩 | 3:패딩 | (byte 단위)
    char a; // 4 byte 에서 1 byte 메모리 사용

    // | 0:a | 1:b | 2:패딩 | 3:패딩 | (byte 단위)
    char b; // 기존 4 byte 에서 1 byte 메모리 사용

    // | 0:a | 1:b | 2:패딩 | 3:패딩 | 4:c | 5:패딩 | 6:패딩 | 7:패딩 | (byte 단위)
    int c;  // 4 byte 에서 1 byte 메모리 사용

}DATA_MESSAGE1, * PDATA_MESSAGE1;

int main(void)
{
    DATA_MESSAGE1 dMeg;

    printf("char 메모리 공간의 크기: %d \n", sizeof(dMeg.a));
    printf("char 메모리 공간의 크기: %d \n", sizeof(dMeg.b));
    printf("int 메모리 공간의 크기: %d \n", sizeof(dMeg.c));
    printf("구조체 전체 크기는: %d \n", sizeof(dMeg));

    // offsetof 구조체에서 해당 멤버의 상대 위치가 반환
    printf("구조체 멤버의 a 위치 offset: %d\n", offsetof(DATA_MESSAGE1, a));    // 0
    printf("구조체 멤버의 b 위치 offset: %d\n", offsetof(DATA_MESSAGE1, b));    // 1
    printf("구조체 멤버의 c 위치 offset: %d\n", offsetof(DATA_MESSAGE1, c));    // 4
 
    return 0;
}

 

[print]

char 메모리 공간의 크기: 1
char 메모리 공간의 크기: 1
int 메모리 공간의 크기: 4
구조체 전체 크기는: 8
구조체 멤버의 a 위치 offset: 0
구조체 멤버의 b 위치 offset: 1
구조체 멤버의 c 위치 offset: 4

[code]

#define _CRT_SECURE_NO_WARNINGS

#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <stddef.h>   // offsetof 매크로가 정의된 헤더 파일

// C 언어에서는 구조체를 정렬할 때 멤버 중에서 가장 큰 자료형 크기의 배수로 정렬합니다.

typedef struct _DATA_MESSAGE1
{
    // 구조체 전체 크기: 8 byte, 패딩: 메모리 남은 공간

    // | 0:a | 1:패딩 | 2:패딩 | 3:패딩 | (byte 단위)
    char a; // 4 byte에서 1 byte 메모리 사용

    // | 0:a | 1:패딩 | 2:패딩 | 3:패딩 | 4:b | 5:패딩 | 6:패딩 | 7:패딩 | (byte 단위)
    int b;  // 4 byte 에서 1 byte 메모리 사용

}DATA_MESSAGE1, * PDATA_MESSAGE1;

int main(void)
{
    DATA_MESSAGE1 dMeg;

    printf("char 메모리 공간의 크기: %d \n", sizeof(dMeg.a));
    printf("int 메모리 공간의 크기: %d \n", sizeof(dMeg.b));
    printf("구조체 전체 크기는: %d \n", sizeof(dMeg));

    // offsetof 구조체에서 해당 멤버의 상대 위치가 반환
    printf("구조체 멤버의 a 위치 offset: %d\n", offsetof(DATA_MESSAGE1, a));    // 0
    printf("구조체 멤버의 b 위치 offset: %d\n", offsetof(DATA_MESSAGE1, b));    // 4

    return 0;
}

 

 

[print]

char 메모리 공간의 크기: 1
int 메모리 공간의 크기: 4
구조체 전체 크기는: 8
구조체 멤버의 a 위치 offset: 0
구조체 멤버의 b 위치 offset: 4

'Windows App' 카테고리의 다른 글

C언어 구조체 크기 구하기 3  (0) 2024.05.23
C언어 구조체 크기 구하기 2  (0) 2024.05.23
앱 C++ 외부 라이브러리 사용법  (0) 2024.01.31
C++ 프로젝트 원격 디버그  (0) 2022.08.09
C언어 추천 도서  (0) 2022.07.15

+ Recent posts