your programing

new char은 실제로 클래스 유형에 대해 정렬 된 메모리를 보장합니까?

lovepro 2020. 12. 31. 23:05
반응형

new char은 실제로 클래스 유형에 대해 정렬 된 메모리를 보장합니까?


모든 멤버 가 자연스럽고 구현이 정의 된 정렬 (즉, 정렬 을 수정하는 키워드를 사용하지 않음)이 new char[sizeof(T)]있는 유형에 대해 올바르게 정렬 된 메모리를 할당하도록 보장을 통해 버퍼를 할당합니다 .TTalignas

나는 여기에 대한 몇 가지 답변 에서이 보증을 보았지만 표준 이이 보증에 어떻게 도달하는지 완전히 명확하지 않습니다. 표준의 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합니다.

참조 URL : https://stackoverflow.com/questions/10587879/does-new-char-actually-guarantee-aligned-memory-for-a-class-type

반응형