new char은 실제로 클래스 유형에 대해 정렬 된 메모리를 보장합니까?
의 모든 멤버 가 자연스럽고 구현이 정의 된 정렬 (즉, 정렬 을 수정하는 데 키워드를 사용하지 않음)이 new char[sizeof(T)]
있는 유형에 대해 올바르게 정렬 된 메모리를 할당하도록 보장을 통해 버퍼를 할당합니다 .T
T
alignas
나는 여기에 대한 몇 가지 답변 에서이 보증을 보았지만 표준 이이 보증에 어떻게 도달하는지 완전히 명확하지 않습니다. 표준의 5.3.4-10은 기본 요구 사항을 제공합니다. 기본적 new char[]
으로 max_align_t
.
내가 놓친 것은 alignof(T)
항상 최대 값을 가진 유효한 정렬이 될 것이라고 말하는 비트 입니다 max_align_t
. 내 말은, 그것은 명백해 보이지만 구조의 결과 정렬은 기껏 max_align_t
해야? 3.11-3 지점에서도 확장 정렬이 지원 될 수 있다고 말하는데 컴파일러가 클래스가 과도하게 정렬 된 유형인지 스스로 결정할 수 있습니까?
내가 놓친 것은
alignof(T)
항상 최대 값을 가진 유효한 정렬이 될 것이라고 말하는 비트 입니다max_align_t
. 내 말은, 그것은 명백해 보이지만 구조의 결과 정렬은 기껏max_align_t
해야? 3.11-3 지점에서도 확장 정렬이 지원 될 수 있으므로 컴파일러가 자체적으로 클래스가 과다 정렬 된 유형이라고 결정할 수 있습니까?
Mankarse가 언급했듯이 내가 얻을 수있는 가장 좋은 인용문은 [basic.align] / 3 에서 가져온 것입니다 .
확장 된 정렬 요구 사항이있는 유형은 오버 정렬 된 유형입니다. [참고 : 과도하게 정렬 된 모든 유형은 확장 정렬이 적용되는 클래스 유형이거나이를 포함합니다 (비 정적 데이터 멤버를 통해 가능). —end note]
이는 확장 된 정렬이 명시 적으로 필요하고 전파되어야 함을 의미하는 것처럼 보이지만
나는 더 명확한 언급을 선호했을 것입니다. 컴파일러 작성자에게는 의도가 분명하며 다른 행동은 여전히 미쳤습니다.
표현식 new char[N]
과는 new unsigned char[N]
충분히 모든 개체에 대한 정렬 반환 메모리에 보장됩니다. §5.3.4 / 10 참조 "[...] char 및 unsigned char 배열의 경우 new-expression의 결과와 할당 함수에서 반환 된 주소 간의 차이는 가장 엄격한 기본 정렬 요구 사항의 정수 배수 여야합니다. (3.11) 크기가 생성되는 배열의 크기보다 크지 않은 모든 개체 유형 [참고 : 할당 함수는 기본 정렬이있는 모든 유형의 개체에 대해 적절하게 정렬 된 저장소에 대한 포인터를 반환하는 것으로 간주되기 때문에이 제약 조건은 배열 할당 오버 헤드는 나중에 다른 유형의 객체가 배치 될 문자 배열을 할당하는 일반적인 관용구를 허용합니다. —end note] ".
물론 스타일의 관점에서 볼 때 : 원하는 것이 원시 메모리를 할당하는 것이라면 그렇게 말하는 것이 더 명확합니다 operator new(N)
.. 개념적으로 new char[N]
생성 N
char
; 바이트를 operator new(N)
할당 N
합니다.
'your programing' 카테고리의 다른 글
WPF / C #에서 전역 키보드 후크 (WH_KEYBOARD_LL) 사용 (0) | 2020.12.31 |
---|---|
가능한 값 : PHP_OS (0) | 2020.12.31 |
"auto"를 사용하는 선언이 구체적인 유형 지정자를 사용하는 extern 선언과 일치합니까? (0) | 2020.12.31 |
java.lang.Object에서 'shadow $ _klass_'및 'shadow $ _monitor_'변수는 무엇입니까? (0) | 2020.12.31 |
Rails 마이그레이션을 어떻게 테스트하나요? (0) | 2020.12.31 |