[내용]

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

Troubleshooting Windows HLK Test Failures
 

1. Install latest updates and filters

https://learn.microsoft.com/en-us/windows-hardware/test/hlk/user/troubleshooting-windows-hlk-test-failures

Troubleshooting Windows HLK Test Failures

Table of contents Troubleshooting Windows HLK Test Failures Article 11/05/2020 3 contributors Feedback In this article --> We recommend that you use this guide as your starting point to troubleshoot Windows Hardware Lab Kit (Windows HLK) test failures. Thi

learn.microsoft.com

 
만약 WHQL 테스팅 실패시 해당 사이트를 참조하여, 수행해보자. 
 
WHCK 테스팅 결과 

 
 
"Installable File System Filter Test"  Windows Server 2012 Server 최신 필터 적용
 

 
다시 한번 WHCK 테스팅 결과 

 
 
Windows Server 2012 Server 최신 필터 버튼 적용



최종 결과
PASS, 이건 운이 좋은 경우만 해당된다. Micrsoft 가 요구하는 문서를 꼼꼼하게 읽는게 핵심.

windbg 출력 상태에서 debugview 실행 시 점유권 넘어감.

debugview 종료 시 windbg로 점유권 넘어감

+ Recent posts