Type-Punning Float-to-Int 변환: Memcpy의 엄격한 앨리어싱 문제 해결
프로그래밍에서 Type-Punning은 액세스를 의미합니다. 다른 유형에 대한 참조를 통해 한 유형의 데이터. 성능 최적화에는 편리하지만 유형 퍼닝은 GCC C와 같은 최적화된 컴파일러에서 엄격한 앨리어싱 위반을 유발할 수 있습니다.
비트 해킹을 사용하여 역 제곱근 연산을 수행하는 아래 코드를 고려하세요.
float InverseSquareRoot(float x) { float xhalf = 0.5f*x; int32_t i = *(int32_t*)&x; // Dereferencing type-punned pointer, breaking strict-aliasing rules i = 0x5f3759df - (i >> 1); x = *(float*)&i; x = x*(1.5f - xhalf*x*x); return x; }
이 코드는 엄격한 앨리어싱 규칙과 관련하여 GCC로부터 경고를 생성합니다. 이 문제를 해결하려면 int32_t lvalue를 통해 float 개체에 액세스하지 않도록 코드를 수정해야 합니다. 대신 memcpy()를 사용하여 float 및 int32_t 객체 사이의 바이트를 안전하게 복사할 수 있습니다.
float InverseSquareRoot(float x) { float xhalf = 0.5f*x; uint32_t i; assert(sizeof(x) == sizeof(i)); std::memcpy(&i, &x, sizeof(i)); // Use memcpy to safely copy bytes i = 0x5f375a86 - (i >> 1); std::memcpy(&x, &i, sizeof(i)); x = x*(1.5f - xhalf*x*x); return x; }
memcpy를 사용하여 이 코드는 유형 안전성을 보장하고 엄격한 앨리어싱 규칙을 준수하면서 데이터 무결성을 유지합니다. .
위 내용은 `memcpy`는 유형-Punning Float-to-Int 변환에서 엄격한 앨리어싱 문제를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!