수색…


소개

C ++의 모든 유형에는 정렬이 있습니다. 이는 해당 유형의 객체를 생성 할 수있는 메모리 주소에 대한 제한 사항입니다. 객체의 정렬에 의해 그 주소를 정수로 나누면 객체가 생성 될 때 메모리 주소가 유효합니다.

타입 정렬은 항상 2의 제곱입니다 (1 포함).

비고

표준은 다음을 보장합니다 :

  • 유형의 정렬 요구 사항은 크기의 약수입니다. 예를 들어 크기가 16 바이트 인 클래스는 1, 2, 4, 8 또는 16의 정렬을 가질 수 있지만 32는 정렬 할 수 없습니다. 클래스 구성원의 크기는 총 14 바이트이지만 클래스는 정렬 요구 사항이 필요합니다 8의 경우 컴파일러는 클래스의 크기가 16이되도록 2 개의 패딩 바이트를 삽입합니다.
  • 정수형의 부호있는 버전과 부호없는 버전의 정렬 요구 사항은 동일합니다.
  • void 대한 포인터는 char 대한 포인터와 동일한 정렬 요구 사항 char 집니다.
  • 타입의 cv 수식 형과 cv 수식 화되지 않은 버전은 같은 정렬 요건을 가지고 있습니다.

C ++ 03에서는 정렬이 존재하지만 C ++ 11 이후에는 alignof 사용하여 정렬을 쿼리하고 alignas 사용하여 정렬을 제어 할 수 alignas .

형식의 정렬 쿼리

c ++ 11

유형의 정렬 요구 사항은 단항 연산자로 alignof 키워드 를 사용하여 쿼리 할 수 ​​있습니다. 결과는 std::size_t 유형의 상수 표현식입니다. 즉, 컴파일시 평가할 수 있습니다.

#include <iostream>
int main() {
    std::cout << "The alignment requirement of int is: " << alignof(int) << '\n';
}

가능한 출력

int의 정렬 요구 사항은 다음과 같습니다.

배열에 적용되면 요소 유형의 정렬 요구 사항이 생성됩니다. 참조 유형에 적용되면 참조 된 유형의 정렬 요구 사항이 산출됩니다. (참조 자체는 객체가 아니기 때문에 참조가 없습니다.)

정렬 제어

C ++ 11

alignas 키워드 는 변수, 클래스 데이터 멤버, 클래스의 선언 또는 정의 또는 열거 형의 선언 또는 정의가 지원되는 경우 특정 정렬을 갖도록 강제하는 데 사용할 수 있습니다. 그것은 두 가지 형태로 제공됩니다 :

  • alignas(x) , x 정수 표현은 엔티티에게 제공 배향 x 지원하는 경우.
  • alignas(T) , T 일종는 엔티티의 배향을 요구 동일한 배향 제공 T 즉,, alignof(T) 지원하는 경우.

여러 개의 alignas 지정자가 동일한 엔티티에 적용되면 가장 엄격한 지정자가 적용됩니다.

이 예에서는, 요소의 형태가 unsigned char 인 경우에도, 버퍼 bufint 객체를 보관 유지하도록 ( buf ) 적절하게 정렬되어 보증되고 있습니다.

alignas(int) unsigned char buf[sizeof(int)];
new (buf) int(42);

alignas 는이 선언을 사용하지 않고 유형보다 작은 정렬을 유형에 제공하는 데 사용할 수 없습니다.

alignas(1) int i; //Il-formed, unless `int` on this platform is aligned to 1 byte.
alignas(char) int j; //Il-formed, unless `int` has the same or smaller alignment than `char`.

alignas , 정수 상수 표현식을 받으면 유효한 정렬을 지정해야합니다. 유효한 배열은 항상 2의 거듭 제곱이며 0보다 커야합니다. 컴파일러는 std::max_align_t 형식의 정렬까지 모든 유효한 정렬을 지원해야합니다. 이것보다 큰 정렬을 지원할 있지만 이러한 객체에 대한 메모리 할당에 대한 지원은 제한적입니다. 정렬에 대한 상한선은 구현에 따라 다릅니다.

C ++ 17은 over-aligned 타입을위한 메모리 할당을 operator new 에서 직접 지원합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow