[C++] 구조체 특성, 패딩이란? 공용체란?
구조체 (struct)
- 사용자가 C++의 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 타입을 말한다.
- 구조체를 이용하면 하나 이상의 변수를 그룹지어서 새로운 자료형을 정의할 수 있다.
- 구조체의 크기는 구조체가 가지는 각 변수의 크기와 정렬방식에 따라 결정된다. 이때, 구조체의 크기가 변수 크기의 합보다 더 커지는 경우가 있는데, 이는 구조체의 패딩 때문이다.
패딩 (Padding)
- 패딩은 구조체 내의 변수들 사이에 삽입되는 비어있는 메모리 공간을 의미한다.
- 패딩 바이트는 byte를 일정한 간격으로 끊어 CPU의 데이터 접근 성능을 향상시키기 위해 사용한다.
- 클래스(구조체)에 패딩 바이트를 추가하면 메모리 낭비를 발생하지만, CPU의 데이터 접근 속도가 빨라지고 메모리 정렬 규칙에 따라 접근해야 하는 경우가 줄어들기 때문에 성능이 향상된다.
패딩 비트/바이트의 문제점
- 네트워크를 이용하여 구조체를 전송하게 된다면 패딩비트/패딩 바이트가 구조체의 값을 변경시킬 수 있다.
- 구조체가 메모리에 정의되는 형태는 OS와 컴파일러에 따라 다르기 때문에 패딩비트의 삽입 위치나 패딩 비트의 수가 다르다.
- 따라서 서로 다른 메모리 정의를 갖는 시스템 간의 구조체를 구조받는다면 패딩 비트로 인해 구조체의 값이 달라질 수 있다.
해결방법
- #pragma pack(push, n)을 이용하여 컴파일러가 패딩비트를 사용하지 않도록 한다.
- 개발자가 직접 패딩 비트를 삽입한다 -> 구조체를 만들 때 dummy 값인 멤버변수를 생성하여 패딩 비트로 넣는다.
공용체 (union)
- 공용체 union은 모든 면에서 구조체와 동일한 기능이지만, 모든 멤버변수가 하나의 메모리 공간을 공유한다는 점만 다르다.
- 모든 멤버 변수가 같은 메모리를 공유하기 때문에 공용체는 한 번에 하나의 멤버 변수만 사용할 수 있다.
- 즉, 공용체는 같은 주소의 이름을 다르게 사용하기 위한 구조체이다.
union Vector3
{
struct {
float x, y, z;
}
float vec[3];
}
- &x와 &vec[0]는 같은 주소를 갖는다.
![]() |
![]() |
http://www.tcpschool.com/cpp/cpp_struct_unionEnum
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com