2009-07-04 9 views
10

std :: tr1 :: aligned_storage의 기본 사용법은 무엇입니까? 아래처럼 Foo 데이터 타입의 자동 메모리로 사용할 수 있습니까? 그렇다면aligned_storage의 기본 용도는 무엇입니까?

struct Foo{...}; 
    std::tr1::aligned_storage<sizeof(Foo) 
     ,std::tr1::alignment_of<Foo>::value >::type buf; 
    Foo* f = new (reinterpret_cast<void*>(&buf)) Foo(); 
    f->~Foo(); 

,

std::tr1::aligned_storage<5*sizeof(Foo) 
      ,std::tr1::alignment_of<Foo>::value >::type buf; 
    Foo* p = reinterpret_cast<Foo*>(&buf); 
    for(int i = 0; i!= 5; ++i,++p) 
    { 
     Foo* f = new (p) Foo(); 
    } 

는 유효 프로그램은 무엇입니까의 버피와 같은 여러 푸를 저장에 대해? 거기에 다른 유스 케이스가 있습니까? Google 검색은 aligned_storage에 대한 설명서 만 제공하지만 사용법은 거의 없습니다.

답변

9

글쎄, reinterpret_cast을 사용하는 것 외에는 괜찮습니다. (나는 두 번째 것에 100 % 확실하지 않다).

reinterpret_cast의 문제점은 캐스트 결과에 대한 보장이 없으며 결과를 원래 유형으로 다시 캐스팅하면 원래 값을 얻게된다는 것입니다. 따라서 캐스트의 결과에 동일한 비트 패턴이 포함되거나 동일한 주소를 가리킬 것이라는 보장이 없습니다.

는 지금까지 내가 아는 한, 타입 T의 *에 포인터 X 주조 휴대용 솔루션은 동일한 주소에 대한 포인터를 설정하는 보장에 static_cast 이후 및 void*에서, static_cast<T*>(static_cast<void*>(x))입니다.

하지만 이는 단지 귀하의 질문과 관련이 있습니다. :)

+0

좋은 해결책입니다. static_cast와 void * 사이의 상관 관계는 정상이지만 static_cast와 같은 여러 static_cast에 대해서도 마찬가지입니다. (static_cast (x)) 여기서 x는 유형이 있습니까? 그렇다면 더 안전한 느낌을주기 위해 reinterpret_cast가 아닌 2 개의 static_cast로 X 유형의 모든 캐스트를 Y 유형으로 바꿉니다. (GCC & MSVC 9 컴파일러는 reinterpret_cast에 아무런 해를 끼치 지 않지만 다른 유청은 그렇게 할 것이라고 확신하지는 않습니다.)하지만보다 안전한쪽으로 가고 싶습니다 :) – abir

+3

예, reinterpret이 실제로 문제가되는 컴파일러에 대해 알고있다. (그리고 나는 C++ 0x에서 기대했던 것처럼 동작하도록 만들 것이라고 생각한다.) 그러나 표준에 따르면, 정의되지 않은 동작이다. static_cast 트릭은 모든 포인터 유형에서 작동해야합니다. – jalf

+0

'템플릿 T pointer_cast (void * p) {return static_cast (p); }'. 즉, const 과부하 버전 ('const void * p')을 더하면 입력을 줄일 수 있습니다. Boost는'static_pointer_cast'와'dynamic_pointer_cast' 같은 기능을 가지고 있습니다. –

관련 문제