Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C++ sizeof와 alignof의 차이점 완벽 정리

C++ 프로그래밍에서 sizeofalignof는 모두 타입과 관련된 정보를 반환하는 연산자지만, 그 목적과 결과는 서로 다릅니다. 이 글에서는 두 연산자의 차이점을 예제 코드와 함께 자세히 살펴보겠습니다.

alignof 연산자란?

alignof 연산자는 C++11부터 새롭게 도입된 기능으로, 특정 타입이 메모리에서 정렬(alignment)되어야 하는 바이트 단위의 값을 반환합니다. 이때 인자로 전달되는 타입은 반드시 완전한 타입(complete type)이거나 참조 타입이어야 합니다.

sizeof 연산자란?

sizeof 연산자는 타입 또는 객체가 실제로 차지하는 전체 메모리 크기를 바이트 단위로 반환합니다. 패딩(padding)으로 인해 멤버 변수들의 크기를 단순히 더한 값보다 커질 수 있다는 점에 유의해야 합니다.

두 연산자의 주요 차이점

int, double과 같은 기본 자료형(primitive type)에서는 sizeofalignof가 일반적으로 동일한 값을 반환합니다. 하지만 구조체나 클래스처럼 사용자가 직접 정의한 타입(user-defined type)에서는 두 값이 달라질 수 있습니다. alignof는 해당 타입 내부 멤버 중 가장 큰 정렬 요구사항을 기준으로 값을 결정하기 때문입니다.

예제 코드

#include<iostream>
using namespace std;
struct MyStruct{
    int x;
    double y;
    char z;
};
main() {
    cout << "The sizeof(MyStruct): " << sizeof(MyStruct) << endl;
    cout << "The alignof(MyStruct): " << alignof(MyStruct) << endl;
}

실행 결과

The sizeof(MyStruct): 24
The alignof(MyStruct): 8

결과 분석

MyStructint(4바이트), double(8바이트), char(1바이트) 멤버를 가지고 있습니다. 컴파일러는 멤버 간 정렬을 맞추기 위해 패딩을 삽입하므로, 전체 크기는 24바이트가 됩니다. 반면 alignof는 가장 정렬 요구사항이 큰 멤버인 double의 기준에 따라 8을 반환합니다.

정리하면, sizeof는 타입이 차지하는 전체 메모리 크기를 알려주고, alignof는 해당 타입이 요구하는 메모리 정렬 단위를 알려줍니다. 저수준 메모리 최적화나 네트워크 프로토콜 설계 시 두 연산자의 차이를 정확히 이해하고 있으면 큰 도움이 됩니다.