57. 객체 정렬(alignment): alignof/alignas·패딩·over-aligned·new 정렬 보장

난이도 상 해설 보기 →

결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커 (A)(B) 는 주목 위치 힌트다.

결함 코드 · C++
// 주제: 객체 정렬(alignment) — alignof/alignas, 구조체 패딩, over-aligned 타입, new 의 정렬 보장
//
// 아래 프로그램의 출력을 예측하고 각 값을 설명하라. 대상 플랫폼은 x86-64 Linux(g++)이다.
// 특히 다음을 논하라:
//   - 기본 타입의 정렬(alignof)과 그로 인한 구조체 내부 패딩·전체 크기.
//   - alignas 로 over-aligned 한 타입의 크기·정렬.
//   - C++17 부터 operator new 가 over-aligned 타입의 정렬을 보장하는지.
//
// 과제:
//  1) 표준 출력을 한 줄씩 예측하라.
//  2) struct A 의 각 멤버 오프셋과 전체 크기가 왜 그렇게 되는지 그림으로 설명하라.
//  3) 정렬이 원자성/캐시라인/직렬화에 왜 중요한지 논하라.
//  g++ -std=c++17 로 컴파일/실행된다.

#include <iostream>
#include <cstdint>
#include <cstddef>

struct A { char c; int i; char d; };
struct alignas(16) Over { int x; };
struct Packed { char c; double d; };

int main() {
    std::cout << alignof(char) << " " << alignof(int) << " " << alignof(double) << "\n";
    std::cout << sizeof(A) << " " << alignof(A) << "\n";
    std::cout << sizeof(Over) << " " << alignof(Over) << "\n";
    std::cout << sizeof(Packed) << " " << alignof(Packed) << "\n";
    std::cout << offsetof(A, i) << " " << offsetof(A, d) << "\n";

    Over* p = new Over();
    std::cout << (reinterpret_cast<uintptr_t>(p) % 16 == 0 ? "aligned16" : "unaligned") << "\n";
    delete p;
    return 0;
}
내 리뷰 · C++
내 답안 · 자동 저장

작성 후 위 해설 보기에서 모범 해설과 대조하세요.