IT Share you

메모리 정렬 : alignof / alignas를 사용하는 방법?

shareyou 2020. 12. 12. 12:42
반응형

메모리 정렬 : alignof / alignas를 사용하는 방법?


저는 지금 공유 메모리로 작업합니다.

나는 이해할 수 없다 alignof하고 alignas.

cppreference 가 명확하지 않습니다. alignof"alignment"를 반환하지만 "alignment"는 무엇입니까? 정렬 할 다음 블록을 위해 추가 할 바이트 수? 패딩 사이즈? 스택 오버플로 / 블로그 항목도 명확하지 않습니다.

사람이 명확하게 설명 할 수 alignofalignas?


정렬은 값의 첫 번째 바이트를 저장할 수있는 메모리 위치에 대한 제한입니다. (프로세서의 성능을 개선하고 특정 정렬이있는 데이터에서만 작동하는 특정 명령어의 사용을 허용하는 데 필요합니다. 예를 들어 SSE는 16 바이트로 정렬되고 AVX는 32 바이트로 정렬해야합니다.)

16의 정렬은 16의 배수 인 메모리 주소가 유일한 유효한 주소임을 의미합니다.

alignas

필요한 바이트 수로 강제 정렬 (cppreference는 언급하지 않지만 2 : 1, 2, 4, 8, 16, 32, 64, 128, ...의 거듭 제곱으로 만 정렬 할 수 있다고 생각합니다.)

#include <cstdlib>
#include <iostream>

int main() {
    alignas(16) int a[4];
    alignas(1024) int b[4];
    printf("%p\n", a);
    printf("%p", b);
}

예제 출력 :

0xbfa493e0
0xbfa49000  // note how many more "zeros" now.
// binary equivalent
1011 1111 1010 0100 1001 0011 1110 0000
1011 1111 1010 0100 1001 0000 0000 0000 // every zero is just a extra power of 2

다른 키워드

alignof

매우 편리합니다.

int a[4];
assert(a % 16 == 0); // check if alignment is to 16 bytes: WRONG compiler error

하지만 당신은 할 수 있습니다

assert(alignof(a) == 16);
assert(alignof(b) == 1024);

실제로 이것은 단순한 "%"(모듈러스) 연산보다 더 엄격합니다. 사실 우리는 1024 바이트로 정렬 된 것이 반드시 1, 2, 4, 8 바이트로 정렬된다는 것을 알고 있지만

 assert(alignof(b) == 32); // fail.

더 정확하게 말하자면, "alignof"는 어떤 것이 정렬 될 때 가장 큰 2의 거듭 제곱을 반환합니다.

또한 alignof는 기본 데이터 유형에 대한 최소 정렬 요구 사항을 미리 알 수있는 좋은 방법입니다 (아마도 문자의 경우 1, 부동의 경우 4를 반환합니다).

여전히 합법적 :

alignas(alignof(float)) float SqDistance;

16으로 정렬 된 항목은 16의 배수 인 사용 가능한 다음 주소에 배치됩니다 (마지막으로 사용 된 주소에서 암시 적 패딩이있을 수 있음).


정렬은 패딩이 아닙니다 (정렬 요구 사항을 충족하기 위해 패딩이 도입되는 경우도 있음). C ++ 유형의 intrisic 속성입니다. 표준에 넣으려면 ( 3.11[basic.align])

객체 유형에는 해당 유형의 객체가 할당 될 수있는 주소에 제한을 두는 정렬 요구 사항 (3.9.1, 3.9.2)이 있습니다. 정렬은 주어진 객체가 할당 될 수있는 연속 주소 사이의 바이트 수를 나타내는 구현 정의 정수 값입니다. 개체 유형은 해당 유형의 모든 개체에 대해 정렬 요구 사항을 부과합니다. 더 엄격한 정렬은 정렬 지정자 (7.6.2)를 사용하여 요청할 수 있습니다.


Each type has an alignment requirement. Generally, this is so variables of the type can be accessed efficiently, without having to cause the CPU to generate more than one read/write access in order to reach any given member of the datatype. Furthermore, it also ensure efficient copying of the entire variable. alignof will return the alignment requirement for the given type.

alignas is used to force an alignment on a datatype (so long as it is not less stringent that what alignof said datatype would return)

참고URL : https://stackoverflow.com/questions/17091382/memory-alignment-how-to-use-alignof-alignas

반응형