2013-04-22 6 views
1

많은 멤버 변수가있는 많은 POD 구조체가 있습니다. 생성자의 각 멤버를 초기화하는 대신 단순히 memset을 사용합니다. 이것은 C++에서 유효합니까?Memset이 포인터가있는 POD 구조체

struct foo 
{ 
    foo() { std::memset(this, 0, sizeof (foo)); } 

    int var1; 
    float var2; 
    double var3; 
    // more variables.. 
}; 
+0

감사합니다. – grasshopper

답변

2

표준에 따르면 구조체는 POD 유형이 아니므로 memset을 사용할 수 없습니다.

9 클래스

일반의 클래스는 기본 생성자 (12.1)에있는 클래스이며 에는 비 단순 기본 생성자, 이없고
10 A POD의 struct108가있다 하찮게 복사 가능한 것이다 비 공용체 클래스이며 일반 클래스 및 표준 레이아웃 클래스이며 비 POD 구조체, 비 POD 구조체 (또는 이러한 유형의 배열) 유형의 비 정적 데이터 멤버는 입니다.

클래스에는 간단한 기본 생성자가 있으므로 더 이상 사소하지 않으며 결과적으로 POD 유형이 아닙니다.
대부분의 컴파일러에서 작동 할 것이며, 보증은 제공되지 않습니다.

3

C++ 표준은 모든 비트 0이 트랩 표현이 float 또는 double 인 구현을 허용하므로 작동하지 않을 수도 있습니다. 따라서 이러한 구현에서 해당 구성원을 읽는 것은 정의되지 않은 동작을 갖습니다.

구현이 데이터 멤버간에 넣을 수있는 모든 패딩 바이트에도 동일하게 적용됩니다. 정의되지 않은 동작이거나 수정되지 않은 상태이거나, 사용할 때 정의되지 않은 동작을가집니다. 나는 어느 것을 잊어 버린다.

사실 내가 알고있는 모든 구현에서 작동 할 것입니다.

다른 답변은 POD가 아닌 클래스 (C++ 03) 및 중요하지 않은 클래스 (C++ 11)에 대한 유효 포인트를 만듭니다. 비록 당신이 생성자를 제거하고 어딘가에서 memset을 호출했다면 여전히은 표준에 의해 작동하지 않을 것입니다. 생성자를 제거했다면하지만 당신은 집계 초기화 사용할 수 있습니다

foo f = {0}; 

을하고는, 보장 (즉, 모든 비트 - 0으로 표현되는지 여부) 0 값으로 모든 구성원을 초기화하기 것입니다.