assume_aligned — std::assume_aligned

assume_aligned — std::assume_aligned

std::assume_aligned는 컴파일러에게 전달된 포인터가 지정된 바이트 경계에 정렬되어 있다고 가정하라고 알려주는 힌트 함수예요. C++20에서 도입됐어요.

정렬이 보장된 메모리(예: SIMD 처리를 위해 정렬된 버퍼)를 다룰 때, 컴파일러가 이 정보를 믿고 더 효율적인 코드(예: 정렬된 로드/스토어)를 생성하도록 도와줘요. 만약 가정이 틀리면 동작은 정의되지 않아요.

출처: cppreference

본문

std::assume_aligned는 컴파일러 최적화 힌트예요.

template<std::size_t N, class T>
[[nodiscard]] constexpr T* assume_aligned(T* ptr);

ptrN 바이트에 정렬되어 있다는 사실을 컴파일러가 가정하도록 하고, 같은 포인터 ptr을 반환해요. N은 2의 거듭제곱이어야 해요.

포인터가 실제로 정렬되어 있지 않으면 이 힌트를 신뢰한 동작이 발생할 수 있고, 그 결과는 정의되지 않아요. 따라서 실제로 정렬이 보장되는 경우에만 사용해야 해요.

SIMD나 고성능 메모리 처리 코드에서, 정렬된 접근이 더 빠른 명령을 쓸 수 있게 해주므로 성능 향상에 도움이 돼요. 다만 잘못 쓰면 정의되지 않은 동작을 부르니 주의해야 해요.

더 알아보기 (Learn more)

cppreference