을 std::aligned_storage
사용하고 동적 할당이 필요한 경우 정렬 요구 사항에 대해 약간 혼란스러워 합니다. 예:
using storage = typename std::aligned_storage<sizeof(T), std::alignment_of<T>::value>::type;
storage* pool;
pool = ::new storage[num_obj];
합법적입니까? new 연산자는 정렬 메모리를 반환하지 않으므로 결과가 정확합니까?
C ++ 11 표준에서는 [basic.stc.dynamic / 2]에::operator new
정렬 된 반환 메모리 와 같은 할당 함수가 필요합니다 .alignof(std::max_align_t)
반환 된 포인터는 기본 정렬 요구 사항 […]을 가진 완전한 객체 유형의 포인터로 변환 될 수 있도록 적절하게 정렬되어야합니다.
따라서 new
표현식 을 통해 생성하는 객체의 유형이 과다 정렬 된 유형 (보다 엄격한 정렬이 필요한 유형)이 아닌 한 모든 것이 정상 alignof(std::max_align_t)
입니다. 과도하게 정렬 된 유형의 경우 실제로 포인터를 수동으로 정렬하기에 충분한 크기의 저장소를 할당해야합니다. 예를 들어를 사용하여 std::align
적절한 주소에 개체를 구성해야합니다. 예를 들어 new…
C ++ 17부터 new
자동으로 처리됩니다. 보다 엄격한 정렬이 필요한 스토리지를 할당하기 위해 __STDCPP_DEFAULT_NEW_ALIGNMENT__
(할당 함수가 최소한 제공해야하는 정렬), new-expression 은 인수 [expr.txt] 로 할당 될 스토리지의 정렬이 명시 적으로 지정된 할당 함수를 호출합니다 . 신규] / 14 …
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다