DeltaTime을 구현하는 과정에서 LARGE_INTEGER에 대해 알게 되었는데, 이것이 공용체에 해당한다는 것을 보고 공용체와 LARGE_INTEGER에 대해 더욱 자세히 알아보기로 했다.
- 공용체의 정의
공용체(union)는 모든 멤버 변수가 동일한 하나의 메모리 공간(위치)를 공유하는 사용자 정의 형식의 구조체이다.
구조체(struct)와 모든 면에서 동일하지만 공용체는 모든 멤버 변수가 하나의 메모리 공간을 공유하기 때문에 한 번에 하나의 멤버 변수 밖에 사용할 수 없다.
공용체는 내부에 있는 의미 있는 변수들 중에서 가장 크기가 큰 멤버 변수의 크기를 공유한다.
또한 모든 데이터의 시작점이 동일하기 때문에 하나의 주소에 여러 개의 데이터를 겹쳐서 넣는 것이 가능해진다. - 어떻게 이런 작동이 가능할까?
객체의 이름을 식별자라고도 하는데, 이는 사실 개발자가 임의로 지정해준 것일 뿐 컴파일러 입장에서 각 객체를 구분하는 기준은 메모리 주소가 된다. 즉, 이름에 의미를 두지 않는다는 뜻이다.
그렇기 때문에 공용체와 같이 하나의 메모리 공간을 공유하는 것도 가능하다. - 공용체의 해석
각 공용체에 저장된 값의 의미는 값을 저장할 때 공용체의 어떤 멤버 변수를 사용했는지에 따라 다르게 해석된다.
그렇기 때문에 공용체가 어떤 멤버 변수를 사용해 저장했는지를 별도의 변수로 저장하여 사용(액세스)할 때 같은 멤버 변수를 사용해야 한다. - 공용체의 의의
공용체는 순서가 규칙적이지 않고, 미리 알 수 없는 다양한 타입의 데이터를 저장할 수 있도록 설계된 타입이다.
따라서 공용체 배열을 사용하면 같은 크기로 구성된 배열 요소에 대해 다양한 크기의 데이터를 저장할 수 있게 된다.
그렇기 때문에 객체가 많고 메모리가 제한된 경우 메모리를 절약하는데 유용하게 사용할 수 있다. - 공용체 사용 예시
union RecordType // union 키워드를 사용하여 공용체 정의
{
char ch;
int i;
long l;
float f;
double d;
int *int_ptr;
};
int main()
{
RecordType t;
t.i = 5;
t.f = 7.25;
}
- LARGE_INTEGER 공용 구조체의 정의
부호가 있는 64비트 정수 값을 나타내는 공용 구조체이다. Windows.h 헤더에 포함되어 있다.
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
} DUMMYSTRUCTNAME;
struct {
DWORD LowPart;
LONG HighPart;
} u;
LONGLONG QuadPart;
} LARGE_INTEGER;
LARGE_INTEGER는 컴파일러가 64비트를 지원하는 경우 QuadPart 멤버를 사용하여 64비트 정수를 저장한다.
만약 64비트를 지원하지 않는 경우에는 총 64비트 중에서 절반에 해당하는 32비트씩 두개로 나누어 각각 LowPart와 HighPart에 저장한다.
- LARGE_INTEGER는 어디서 사용되는가? 왜 사용하는가?
나는 델타타임을 구현하는 과정에서 QueryPerfomanceCount와 QueryPerformanceFrequency 함수에서 이를 사용하는 것을 보고 자료를 찾아보게 되었다.
이 두 함수의 경우에는 다른 포스팅에서 자세히 정리하겠지만 컴퓨터 메인보드에 있는 고해상도 타이머를 이용해 시간 간격을 측정해주는데, 이 때 더욱 정밀하게 시간 값을 기록하기 위해서는 크기가 큰 정수형이 필요하다. 메모리 크기가 클 수록 표현할 수 있는 숫자 범위가 더 넓어지기 때문이다.
'C,C++' 카테고리의 다른 글
다형성 (0) | 2023.02.13 |
---|---|
오버라이딩 (0) | 2023.02.12 |
상속 (0) | 2023.02.11 |
Tree 구현 + Enum (0) | 2023.02.10 |
[C++] list iterator (0) | 2023.02.06 |