> 백엔드 개발 > C++ > 본문

Modern C에서 어떻게 안전하게 Punning을 입력할 수 있나요?

Barbara Streisand
풀어 주다: 2024-11-24 06:14:13
원래의
278명이 탐색했습니다.

How Can You Safely Type Punning in Modern C  ?

C의 유형 기호에 대한 현대적이고 올바른 접근 방식

빠른 역 제곱근 함수의 예시처럼 유형 기호에 대한 전통적인 접근 방식에는 비트 패턴을 재해석하는 것이 포함됩니다. 낮은 수준의 캐스트를 사용하여 한 유형을 다른 유형으로 변환합니다. 그러나 이 접근 방식에는 다음과 같은 함정이 많습니다.

  • 지정되지 않은 동작: 하드웨어 및 컴파일러에 따라 정의되지 않은 결과가 발생할 수 있습니다.
  • 엄격한 앨리어싱 위반: 호환되지 않는 유형 간의 캐스팅으로 인해 다음이 발생할 수 있습니다. 오류.
  • 수명 문제: Punned 객체가 의도한 것보다 일찍 삭제될 수 있습니다.
  • 엔디안 및 정렬 문제: 바이트 순서 및 데이터 정렬에 대한 가정 실패할 수 있습니다.

현대적인 문자 메커니즘 Punning

현대 C에는 유형 Punning을 위한 더 안전하고 신뢰할 수 있는 메커니즘이 여러 가지 있습니다.

1. std::bit_cast(x) (C 20)

std::bit_cast는 x의 비트 패턴을 T 유형의 새 객체에 복사합니다. 이는 다음을 보장하기 때문에 유형 펀치에 권장되는 방법입니다.

  • 비트 수준 보존: 비트 패턴이 보존됩니다. 정확합니다.
  • 정확한 정렬 및 엔디안: 결과 객체는 T의 정렬 및 엔디안 요구 사항을 준수합니다.
  • 런타임 안전성: 다음과 같은 경우 예외가 발생합니다. 변환이 불가능합니다.

2. std::memcpy(&y, &x, x.size())

std::memcpy를 사용하여 메모리 위치 간에 바이트를 복사하는 것도 또 다른 안전한 옵션입니다. 다음과 같은 경우에 적합합니다.

  • 소스 및 대상 유형의 크기가 일치합니다.
  • 메모리 레이아웃이 플랫폼에 종속되지 않습니다.
  • 소스의 수명 객체가 관리됩니다.

3. std::launder (C 17)

를 사용한 새로운 배치 이 기술은 기존 객체 x:

new (&x) T;
return *std::launder(reinterpret_cast<T*>(&x));
로그인 후 복사

의 메모리를 사용하여 T 유형의 새 객체를 생성하는 데 사용할 수 있습니다. std::bit_cast와 유사하지만 캐스팅하기 전에 메모리 내용을 수정할 수 있습니다.

4. std::byte 및 reinterpret_cast

std::byte는 다른 유형의 비트 패턴을 재해석하는 데 사용할 수 있는 단일 바이트를 나타냅니다.

return *reinterpret_cast<T*>(reinterpret_cast<std::byte*>(&x));
로그인 후 복사

이 방법은 원본과 유사합니다. reinterpret_cast를 사용하지만 바이트 순서 및 정렬을 명시적으로 제어할 수 있습니다.

빠른 역제곱근 재작성 기능

std::bit_cast를 사용하면 빠른 역제곱근 함수를 다음과 같이 다시 작성할 수 있습니다.

float fast_inverse_square_root(float number)
{
    // Assuming sizeof(long) == sizeof(float) on target platform
    return std::bit_cast<float>(0x5f3759df - (
        std::bit_cast<long>(number) >> 1
    ));
}
로그인 후 복사

이 버전은 안전하고 성능이 뛰어나며 최신 C 모범 사례를 준수합니다.

위 내용은 Modern C에서 어떻게 안전하게 Punning을 입력할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿