2010-12-29 5 views
5

나는 aligned_storage라고하는 TR1 추가에 대해 머리를 터지려고 노력했습니다. 다음 문서를 읽는 동안 N2165, N3190N2140 나는 내 인생에서 사용할 메모리의 스택 또는 힙 특성을 명확하게 설명하는 문장을 볼 수 없습니다.std :: aligned_storage (스택 또는 힙)의 할당 대상

msvc2010, boost 및 gcc에서 제공하는 구현을 살펴 보았습니다. 이들 모두는 공용체를 중심으로 스택 기반 솔루션을 제공합니다. 한마디로

:

  • 은 aligned_storage 구현에 의해 사용되는 메모리 유형 (스택 또는 힙) 정의 또는 항상 기반으로 스택 할 의미인가?

  • 및이를 정의하거나 결정하는 특정 문서는 무엇입니까?

참고

template<class _Ty, size_t _Len> 
union _Align_type 
{ 
    // union with size _Len bytes and alignment of _Ty 
    _Ty _Val; 
    char _Pad[_Len]; 
}; 
다음 aligned_storage 데이터 (_Val, _Pad)는 스택에 생성되고 자동 가변 경우 MSVC10에서 다음이 경우 aligned_storage의 유형의 정의는, 인

참고 : 이것은 아니요 간단한 질문입니다. 답변을 게시하기 전에 질문을 이해하고 시도하십시오.

답변

12

std::aligned_storage<Len, Align>은 단지 회원을 typedef (type)로 선언합니다.

type 타입 정의 부재 크기 Len 많아야하고, 그 배향 어떤 객체 초기화 저장소로서 사용하기에 적합한 POD 타입이어야한다하면 Align

의 제수 (이 최신에서이다 C++ 0x 초안, N3225, 20.7.6.6 표 53은 TR1 사양의 언어 인 N1836을 제외하고는 C++ 0x에서 Align 템플릿 매개 변수의 기본 인수가 최대 맞춤 값을 갖음을 제외하고는 사실상 동일합니다.

std::aligned_storage은 메모리 자체를 할당하지 않습니다. 유형이 std::aligned_storage<Len, Align>::type 인 오브젝트를 작성하고 해당 오브젝트를 위에서 언급 한 요구 사항을 충족하는 유형의 오브젝트로 다시 해석 할 수 있습니다.

+2

나는 이것보다 더 좋은 답변을 얻을 수 있을지 확신하지 못합니다. 데이터가'type'에 동적으로 할당되면 요점은 무엇입니까? 정렬에 어떤 도움이 될 수 있습니까? – icecrime

+2

@ Zenikoder - 표준에서 인용문을 다시 읽습니다. 그리고 필요하다면 다시. :)'std :: aligned_storage <...> :: type'은 요청 된 정렬을 가진 POD 타입을 정의합니다. 이 유형의 저장소를 스택 또는 힙에 할당 할 수 있습니다. 관련이 없습니다. – atzz

+0

@Zenikoder - 구현 정의가 아닙니다. 사용자 정의입니다. James가 인용 한 성명서는 모든 것을 분명하게 설명합니다. – atzz

0

모든 할당 (new/malloc)이 어떤 유형으로도 정렬 된 주소에서 메모리를 반환하기 때문에 일반적으로 힙에 내용을 정렬 할 필요가 없습니다.

+3

이것은 사실이 아닙니다. SIMD 명령어를 사용하는 경우 데이터를 16 바이트 단위로 정렬해야하는 경우가 있지만 new/malloc은 이러한 보증을 제공하지 않습니다. 예를 들어, libc malloc은 8 바이트 경계에 정렬 된 메모리를 반환합니다. Linux에서는'posix_memalign' 함수를, Windows에서는'_aligned_malloc' 함수를 참조하십시오. –

+1

std :: align을 사용하여 힙에 정렬 ​​된 메모리를 할당 할 수있었습니다. 아직 gcc4.8에 없으므로이 구현을 사용합니다. http://code.google.com/p/c-plus/source /browse/src/util.h#57 –

관련 문제