2017-10-19 7 views
0

이 메모리는 char 배열이 표준에 따라 C++에서 유일하게 안전하게 패닝 가능한 유형입니다. 즉, char의 적절하게 정렬되고 크기가 지정된 배열의 첫 번째 요소에 대한 포인터가 char* 인 경우 해당 포인터는 reinterpret_cast<T*>에 안전하지만 예를 들어 안전하지 않을 수 있습니다. 표준에 따라 uint8_t.C++ : 표준에 따라 문자 배열을 실행하는 방법은 무엇입니까?

그러나 현재 초안 표준에서이 위치를 찾을 수 없습니다. 나는 잘못 읽고 있니? 이것이 C++ 17에서 변경 되었습니까? 누군가 표준의 관련 부분을 인용 할 수 있습니까?

+3

있습니다. 'char' 배열에 대해서는 특별한 것이 없습니다. 'char' * 포인터 *에 관해서는 특별한 것이 있습니다. –

+0

@ n.m. 다른 방법으로는 (일종의) ... char 포인터에 대해서는 특별한 것이 없지만'char' lvalues는 특별합니다 (엄격한 앨리어싱 측면에서). –

+0

@ M.M 맞습니다. 그러나 어떻게이 값들을 얻을 것입니까? 오, 당신이 참고 문헌을 사용할 수 있다고 생각합니다. 공정하다. –

답변

2

(T이 규칙의 예외 중 하나가 아닌 경우)를 읽거나 char의 배열을 작성하는 형식 T의 표현을 사용하는 엄격한 앨리어싱 위반입니다.

엄격한 앨리어싱은 양방향 거리가 아닙니다. char 표현식을 사용하여 T에 액세스 할 수 있지만 그 반대는 마찬가지입니다.

섹션은 C++ 14 표준에서 [basic.lval]/10입니다. 전체 텍스트는 See here입니다.

또한 표준에서는 uint8_t이 다른 유형의 typedef라고 말합니다. 알려진 모든 구현은 char 또는 unsigned char에 대한 typedef입니다.

표준에 명시 적으로 uint8_t을 문자 유형으로 지정하는 것이 좋습니다. 또한 uint8_t x = 'a'; cout << x;과 같이 잘 정의되지 않은 문제도 해결할 수 있습니다.

+0

감사합니다. 엄격한 앨리어싱 규칙 ([draft standard link (http://eel.is/c++draft/basic#lval-8))에서'char '에 대한 예외는 내가 생각하고있는 것입니다. – jacobsa

+0

이 작업은'std :: aligned_storage'와 어떻게 상호 작용합니까? 확실히'char '의 배열을 가져 와서'T * '로 바꾸는 표준적인 안전한 방법이 있을까요? 아니면'std :: aligned_storage'와 같은 축복 된 유형을 통해서만 가능합니까? – jacobsa

+0

@jacobsa 정렬 된 저장소 또는 문자 배열에 개체를 만들 때 placement-new를 사용합니다. 그런 다음 영역은 생성 된 유형의 객체로 간주되며 더 이상 정렬 된 저장 클래스 등의 객체가 아닙니다. –