개발자 면접 공부/C-C++

구조체, 클래스 패딩 바이트

chogyujin 2023. 8. 28. 20:33
728x90

1. 개요

오늘은 C++의 구조체, 클래스 패딩 바이트에 대해 공부하겠습니다.

 


2. 크기

구조체와 클래스의 크기는 어떻게 결정이 될가요? 구조체나 클래스는 안에 선언되있는 변수에 따라 결정이 된다고 생각을 하고 있을겁니다.

하지만 실제로 크기를 살펴보면 매우 다르다는것을 알수있습니다.

대부분 내부에 선언되는것보다 매우 많은 크기를 차지하는데요 그것은 패딩 바이트 때문에 그렇습니다.

패딩 바이트란 클래스나 구조체에 패딩 바이트를 추가하여 CPU 접근을 더 용이하게 해 주는 것을 말합니다(정확히 말하면 레지스터의 fetch).

자칫 공간 낭비일 수도 있는 불필요한 패딩 공간을 확보하면서 메모리의 크기를 맞추는 이유는 캐시 hit율을 높이고 CPU의 연산 횟수를 줄이기 위함입니다.

 


3. 패딩 규칙

패딩 규칙에는 다음과 같다.

 

구조체가 메모리에 잡히는 규칙 0

  • 메모리에 공간이 잡힐 경우 연속적으로 잡힌다.

마치 배열이 메모리에 잡히는 것과 유사하다. 구조체도 마찬가지로 변수들의 값이 연속적인 메모리 공간에 할당되어 있다. (char a)(int b)(short c)가 나란한 공간에 잡혀 있다.

 

구조체가 메모리에 잡히는 규칙 1

  • 구조체가 가진 자료형 중 가장 큰 자료형이 기준이 되어 메모리에 공간이 잡힌다.

 

구조체가 메모리에 잡히는 규칙 2

  • 구조체에 선언된 변수의 순서대로 메모리에 저장한다

 


4. 구조체 패딩 예제

 

#include<iostream>

using namespace std;

struct s
{
    int a; // 4byte
    int b; // 4byte
    char c; // 1byte
    char d; // 1byte
    double e; // 8byte
    short f; // 2byte
};

int main()
{
    cout << "구조체 s의 크기 " << sizeof(s);

	return 0;
}

위의 예제 파일을 실행시켜보면 구조체의 크기가 32byte가 나옵니다. 실질적으로 s 구조체 안에 있는 변수는 int(4byte) 2개 , char(1byte)2개, double(8byte) 1개, short(2byte) 1개로 총 선언되어있는 맴버 변수들의 크기는 (4+4+1+1+8+2) = 20byte가 나와야하는데 실제는 32byte가 나왔습니다.

 

출처 : https://coding-factory.tistory.com/670

실질적으로는 위와 같이 padding이 들어가 있어 총 32byte라는 크기가 나오는 겁니다.

 

출처 : https://coding-factory.tistory.com/670

자기 경계에 자료를 넣습니다.

하지만 만약 double형인 8바이트가 나오면 큰 값을 따라 패딩을 만들어집니다.

그래서 double이 아래에 있으므로 char c, d는 뒤에 6개의 패딩이 생깁니다.

출처 : https://coding-factory.tistory.com/670

위의 상황을 방지하기 위해 패딩 바이트가 들어가게 됩니다.

위와 같이 패딩 바이트를 추가하여 한 번의 연산에 하나의 값이 들어가게 되고 메모리는 더 사용하나 CPU는 한 번의 동작만 하면 되기에 연산은 보다 빠르게 처리가 됩니다.

 


5. 클래스 패딩 예제

#include<iostream>

using namespace std;

class s
{
    int a; // 4byte
    char c; // 1byte
    int b; // 4byte
    char d; // 1byte
    double e; // 8byte
    short f; // 2byte
};

int main()
{
    cout << "구조체 s의 크기 " << sizeof(s);

	return 0;
}

클래스도 똑같이 32바이트가 나옵니다.


6. 효율적인 공간 설계

 

#include<iostream>

using namespace std;

struct s
{
    double e; // 8byte
    int a; // 4byte
    int b; // 4byte
    char c; // 1byte
    char d; // 1byte
    short f; // 2byte
};

int main()
{
    cout << "구조체 s의 크기 " << sizeof(s);

	return 0;
}

어떠한 상황에서든 메모리는 효율적으로 사용하는 것이 매우 좋습니다.

별 차이 나지 않겠지 하며 대수롭게 여기기보다는 개발자라면 패딩 바이트는 최소한으로 생성되도록 유도하는 것이 필요합니다.

char형은 1byte이기에 어디든지 붙을 수 있어 상관 없지만 double형 long long 형과 같은 큰 byte를 소모하는 자료형이라면 될 수 있으면 가장 위에 선언해주어 불필요한 메모리 낭비를 줄이는것이 현명한 선택입니다.

출처 :&nbsp;https://coding-factory.tistory.com/670

double형 변수의 자리만 옳겼을 뿐인데 크기가 8이나 줄었습니다.


7. Ref

https://coding-factory.tistory.com/670

 

[C언어/C++] 구조체, 클래스의 패딩 바이트에 대하여

구조체, 클래스의 크기와 패딩바이트 구조체나 클래스의 크기는 어떻게 결정될까요? 구조체나 클래스 내부에 선언된 변수들의 크기로 결정된다고 생각하실 수 있는데 실제로 크기를 확인해보

coding-factory.tistory.com

https://nomad-learner.github.io/study/2021/03/07/%EA%B5%AC%EC%A1%B0%EC%B2%B4%EC%97%90%EC%84%9C-%ED%8C%A8%EB%94%A9%EA%B3%BC-%EA%B5%AC%EC%A1%B0%EC%B2%B4-%EB%A9%A4%EB%B2%84-%EB%A7%9E%EC%B6%A4.html

 

c++ 구조체에서 패딩 && 구조체 멤버 맞춤(struct member alignment)

```c++

nomad-learner.github.io

 

'개발자 면접 공부 > C-C++' 카테고리의 다른 글

함수에 const 위치에 따른 결과  (0) 2023.09.09
가변길이 템플릿  (0) 2023.09.04
C++11,14 람다식  (2) 2023.06.14
상수와 리터럴 (Constant & Literal)  (0) 2023.05.20
정렬 알고리즘(퀵, 병합)  (2) 2023.05.14