-
바이트를 정렬할 때 윈도우에서는 __declspec(align(#))을 지원했지만 이는 언어 상의 표준은 아니었습니다. MS에서 지원해주는 거였죠. C++11부터는 표준으로 alignas를 사용할 수 있습니다.
다음에 적용할 수 있습니다.
- 클래스, 구조체, 공용체, 열거체의 선언이나 정의부
- 비트 필드가 아닌 데이터 멤버의 선언부
- 변수의 선언부(다만 함수의 파라미터와 함수의 예외 파라미터에는 사용할 수 없음
0을 넣는 것은 언제나 무시되고 자연스럽게 정렬된 정렬 값보다 작은 숫자 역시 무시됩니다.
위의 예제에서는 4 이상의 값을 넣어야 합니다. 표준이기 때문에 컴파일 타임에 오류를 잡아주지만, __declspec(align(#))을 사용하면 컴파일 과정에서 해당 정렬이 무시된다는 경고를 콘솔 창에 띄워줍니다.
바이트를 정렬한다는 것의 의미를 조금만 더 살펴보겠습니다. 어떤 구조체를 8바이트 단위로 정렬하는 것은 무엇을 말하는 걸까요. 해당 구조체는 8바이트 단위로 메모리 공간을 확보하는데 OS에게 메모리를 받을 때 시작 주소 값이 8의 배수가 됩니다. 왜냐하면 운영체제에서 메모리, 페이지를 관리할 때 바운더리가 있고 정해놓은 단위의 배수에 해당하는 경계에 메모리를 위치시키기 때문입니다. 때문에 8바이트 정렬을 수행한 구조체의 객체의 시작 주소는 8배수이고 16바이트라면 16배수가 됩니다.
8의 배수는 8, 16, 24...인데 이를 이진 수로 표현하면 다음과 같습니다.
8 -> 1000
16 -> 0001 0000
24 -> 0001 1000
하위 3개의 비트는 언제나 0입니다. 이러한 특성이 어떻게 사용될지는 상황에 따라 다르겠지만 경우에 따라 해당 위치에 어떤 플래그를 넣을 수도 있을 것 같습니다.
'개발 > C·C++' 카테고리의 다른 글
복사 생성자와 이동 생성자 (0) 2021.12.27 객체 생성 시 함수 호출 순서 (0) 2021.12.27 union (0) 2021.09.24 스마트 포인터 (0) 2021.09.19 스레드 함수를 람다식 안에서 사용할 때 주의할 점 (0) 2021.09.15