snappy의 내부에는 이러한 작업 (예 : x86)을 지원하는 것으로 알려진 아키텍처에서 잠재적으로 정렬되지 않은 16, 32 및 64 비트 정수를 읽고 쓸 수있는 최상의 구현으로 dereferencing a reinterpret_cast'ed 포인터를 선택하는 조건부로 컴파일 된 섹션이 있습니다. . 다른 아키텍처의 대체 방법은 memcpy based implementation입니다.정렬되지 않은 메모리 액세스 대 memcpy에 대한 reinterpret_cast의 유효한 유스 케이스는 무엇입니까?
제 생각에 reinterpret_cast 구현은 정의되지 않은 동작을 나타내며 clang의 정의되지 않은 동작은 새니 타이 저의 플래그입니다.
내가 당황한 이유는 다음과 같습니다. memcpy 기반 구현을 사용하지 않는 이유는 무엇입니까? 크기가 컴파일 타임에 알려지기 때문에이 memcpy 호출을 구현하는 데 intrinsic을 사용하는 컴파일러 중 가장 많이 망가진 컴파일러를 제외하고는 모두 기대할 것입니다. 사실 모든 현대적인 툴체인에서 구현 된 것과 동일한 코드gen을 기대합니다.
그러나 나는 또한 그들이 뭘 알고 있는지 사람들이 작성한 것으로 알고 있습니다. 그래서 이것은 정의되지 않은 행동을 능가하는 reinterpret_cast 메카니즘을 사용하는 것에 여전히 이점이 있는지 궁금하게 생각합니다. 컴파일러의 구현 품질에 따라 성능을 원하지 않습니까? 내가 고려하지 않은 다른 것?
소리가 지뢰밭과 같습니다. 처음에는 정렬되지 않은 주소의 객체를 얻거나 * 얻는 올바른 방법이 없으므로이 코드의 유일한 사용 사례는 I/O이므로이 코드는 줄 바꿈되어있는 것처럼 보입니다 "정수를 비 직렬화"하는 것. –
@KerrekSB 예, 이것은 IO 또는 프로토콜/형식 크래킹 코드입니다. 그러나 문자 배열 바이트의 정렬에 대한 참조없이 char 배열을 통해 쉽게 복사 가능한 유형 (명시 적 폭의 정수 유형이 확실 함)을 왕복 할 수 있음을 명시하는 3.9.2 절 [기본 유형]을 참조하십시오. 그래서 memcpy 구현은 확실히 정의 된 동작이다. 그리고 reinterpret_cast는 확실히 정의되지 않았습니다. – acm
[이 커밋] (https://code.google.com/p/snappy/source/detail?r=59&path=/trunk/snappy-stubs-internal.h)에 첨부 된 설명이 흥미 롭습니다. 분명히 성능에 차이가 있습니다. –