C++

[C++] Struct alignas

햇썽이 2025. 5. 24. 22:43

 

C++에서 struct는 멤버 변수들의 메모리 배치를 최적화하기 위해 패딩(padding)을 추가할 수 있다.

 

기본 구조체의 메모리 크기 확인

기준은 구조체에서 가장 자료형이 큰것을 선정한다.

여기서는 float인데 char의 경우 사실상 1 byte이기 때문에 float 4byte를 선정한다.

int main()
{
    struct Person
    {
        float height;      // 4 bytes
        float weight;      // 4 bytes
        char name[10];     // 10 bytes 
        short grade;       // 2 bytes
    };

    std::cout << sizeof(Person) << std::endl; // 출력 결과: 20
    return 0;
}
// height, grade, weight, name 순으로 정렬하면?
// 4, 2 (+2 padding), 4, 10 (+2 padding) = 총 24 바이트가 된다

 

24바이트가 되는 이유는 컴파일러의 효율성을 위해 메모리 레이아웃을 4의 배수대로 맞추다 보니 강제로 padding을 넣는 현상이 발생한다.  

 

alignas 이용 정렬

위와같은 이유로 아예 강제로 지정하는 방식이 있음

alignas(16)을 사용하면 컴파일러는 구조체를 16바이트 경계에 맞춰 정렬 가능

int main()
{
    struct alignas(16) Person
    {
        float height;      // 4 bytes
        short grade;       // 2 bytes
        float weight;      // 4 bytes
        char name[10];     // 10 bytes
    };

    std::cout << sizeof(Person) << std::endl;  // 출력 결과: 32 (패딩 포함)
    // 16의 배수대로 맞추다 보니 4,2,4(+6), 10(+12)가 나와서 그런거 같다
    std::cout << alignof(Person) << std::endl; // 출력 결과: 16
    return 0;
}

 

'C++' 카테고리의 다른 글

[C++] enum class & enum struct  (0) 2025.05.28
[C++] enum  (0) 2025.05.27
[C++] Union 유니온  (0) 2025.05.26
[C++] Struct 구조체  (0) 2025.05.23