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);
ptr이 N 바이트에 정렬되어 있다는 사실을 컴파일러가 가정하도록 하고, 같은 포인터 ptr을 반환해요. N은 2의 거듭제곱이어야 해요.
포인터가 실제로 정렬되어 있지 않으면 이 힌트를 신뢰한 동작이 발생할 수 있고, 그 결과는 정의되지 않아요. 따라서 실제로 정렬이 보장되는 경우에만 사용해야 해요.
SIMD나 고성능 메모리 처리 코드에서, 정렬된 접근이 더 빠른 명령을 쓸 수 있게 해주므로 성능 향상에 도움이 돼요. 다만 잘못 쓰면 정의되지 않은 동작을 부르니 주의해야 해요.