내장형 __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;
}
C++ 03 POD는 기본 생성자를 forbit로 지정하기도합니다. 그렇다면 사소한 일이 발생하지 않도록 방지 할 수 있습니다. –
@MooingDuck : 고마워, 그게 설명 인 것 같아. 마티유의 대답과 함께이 질문에 대한 답을 얻을 수 있습니다. – Manuel