2012-11-08 6 views
8

가능한 중복 : 내가 지금처럼, 아니 10 개 이상의 바이트 길이 알 수없는 원시적 형의 값을 수용하기위한 std::arraychar의의를 사용하고
Aliasing `T*` with `char*` is allowed. Is it also allowed the other way around?std :: array의 사용은 정의되지 않은 동작입니까?

:

나는 캐스팅을 앞뒤로 char * 통해 읽었습니다. 컴파일러에서 char *이 모든 유형의 값에 별명을 지정할 수 있다고 가정하기 때.입니다. 값이 객체 내부에 배열 된 char의 배열에있을 때 여전히 작동합니까?

참고 : 여기에 노동 조합을 사용하고있을 수 있지만, 내가하는 일에 대해 많은 양의 상용구 코드가 생길 수 있다는 것을 알고 있습니다. 필요하다면이를 피하고 싶습니다. 따라서 질문이 필요합니다.

+0

다른 질문, 같은 대답. – Dan

+0

같은 질문, 다른 단어. ; -] – ildjarn

답변

13

예, std::array< char, 10 >reinterpret_cast이 UB를 유발하도록 double의 정렬 요구 사항을 충족하지 않습니다.

대신 std::aligned_storage을 시도하십시오.

+0

정렬! 물론 그것은 나에게 일어나지도 않은 것입니다. 그 링크를 가져 주셔서 감사합니다, 그건 내가 필요한 것입니다. – Dan

0

그것은 배열에 포함 된 중요하지 않습니다.

표준을도 뭔가를 둘러싸는 것을 고려하지 않습니다 (그것은 그 기본이다), 그러나/char의 순서로 지원 변환을 수행합니다.

reinterpret_cast을 통해 직접 할당하고 할당하려면 버퍼를 올바르게 정렬해야합니다.

대체 방법은 맞춤을 염려하지 않는 memcpy을 사용하는 것입니다.

관련 문제에 대해 일반적으로 이진 수준으로 내려가는 것은 좋지 않습니다. 예를 들어 컴파일러의 간단한 버전 변경으로 인해 이진 직렬화 된 데이터 파일을 액세스 할 수 없게 될 수 있습니다. 어쨌든이를 수행하기위한 주요 드라이버는 원시 성능 고려 사항입니다.

+0

임의의'char *'를'double *'로 변환하는 것을 지원합니까? 나는 포인터 변환이 손실 될 수 있다고 생각한다. 다른 크기의 포인터를 가진 ABI를 고려하십시오. – Potatoswatter

+0

컴파일러 변경으로 인해 어떤 일이 발생할 수 있습니까? – Dan

+0

'char' 포인터는'void'와 같은 포인터와 마찬가지로 세분화 된 주소 지정 해상도를 가지고 있습니다. 버퍼가 올바르게 정렬되지 않으면 포인터 변환이 손실 될 수 있습니다. 어쨌든 데이터 복사는 비효율적 일 수 있습니다. –

관련 문제