2012-01-18 4 views
6

내장형 __is_trivial()true으로 평가되는 경우를 대비하여 GCC STL (4.6.1)을 검토 한 결과 std::copy()에 최적화 된 버전이 사용되는 것을 확인했습니다.std :: copy/memcpy/memmove 최적화

std::copy()std::reverse_copy() 템플릿은 배열의 요소를 복사하는 데 매우 유용하므로 사용하고 싶습니다. 그러나 일부 형식 (템플릿 인스턴스화의 결과)은 포인터가없고 사소한 값을 포함하고 복사 생성자 또는 할당 연산자가없는 구조체입니다.

G ++은 실제로 내 타입이 사소하다는 것을 알기에 충분히 똑똑합니까? C++ 98에서 STL 구현이 내 타입이 사소하다는 것을 알 수있는 방법이 있습니까?

C++ 11에서는 is_trivial<> 형질을 사용하면 편리해질 것입니다. 이게 옳은 거니?

감사합니다.

EDIT : GCC와 llvm에게는 아주 간단한 Type 클래스의 예제가 있습니다. 어떤 아이디어?

#include <iostream> 

struct Spec; 

template <typename TValue, typename TSpec> 
class Type 
{ 
public: 
    TValue value; 

    Type() : value(0) {} 
}; 

int main() 
{ 
    std::cerr << "__is_trivial(...) == " 
       << __is_trivial(Type<char, Spec>) << '\n';                                                          
    return 0; 
} 
+3

C++ 03 POD는 기본 생성자를 forbit로 지정하기도합니다. 그렇다면 사소한 일이 발생하지 않도록 방지 할 수 있습니다. –

+0

@MooingDuck : 고마워, 그게 설명 인 것 같아. 마티유의 대답과 함께이 질문에 대한 답을 얻을 수 있습니다. – Manuel

답변

5

trivial의 의미에 대해 몇 가지 논쟁이있었습니다.

예를 들어, 귀하의 예가 내가 말할 수있는 한 사소한 구성 가능하지는 않습니다 (std::is_trivially_default_constructible은 잘못된 것이라고 생각합니다).

귀하의 경우에는 더 세밀한 새로운 특성 인 std::is_trivially_copyable이 필요하다고 생각합니다. 그래서 ... 컴파일러를 업그레이드 하시겠습니까?

4

__is_trivial은 모든 유형에 적합한 값을 제공합니다.

컴파일러 공급 업체에서 제공 한 경우 컴파일러 관련 개선 사항이 포함되어 있지만 paticular STL 구현에 의존해서 사용할 수는 없습니다.

C++ 11의 std::is_trivial은이 기능을 표준화하는 것일뿐 구현을 사용하지 않을 이유가 없습니다.

+0

분명히 '__is_trivial'은 유형을 쉽게 복사 할 수 있는지 여부를 추론 할 수 없습니다. :(내 업데이트의 예제를 참조하십시오. – Manuel