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++
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.