https://stackoverflow.com/questions/1998752/memset-or-value-initialization-to-zero-out-a-struct
https://www.py4u.net/discuss/64954
번역 : 구글
struct
STRUCT theStruct;
memset( &theStruct, 0, sizeof( STRUCT ) );
또는
STRUCT theStruct = {};
두 번째 변형은 더 깔끔해 보입니다. 한 줄로 표시되며 잘못 입력되어 오류가 발생할 수 있는 매개변수가 없습니다.첫 번째 변형과 비교하여 단점이 있습니까? 어떤 변형을 사용해야 하며 그 이유는 무엇입니까?memset
으로 설정 하기 위한 함수를 사용 합니다 . 두 번째로개체 를 초기화합니다 . 약간의 코드로 설명하겠습니다.
POD 유형
("Plain Old Data" - C++의 POD 유형이란? 참조)의 멤버 만 있는 구조가 있다고 가정해 보겠습니다.struct POD_OnlyStruct
{
int a;
char b;
};
POD_OnlyStruct t = {}; // OK
POD_OnlyStruct t;
memset(&t, 0, sizeof t); // OK as well
이 경우POD_OnlyStruct t = {}
or 를 쓰는 것은POD_OnlyStruct t; memset(&t, 0, sizeof t)
큰 차이가 없습니다. 여기서 유일한 차이점은정렬 바이트가memset
사용되는 경우 0 값으로 설정된다는 것뿐입니다 . 일반적으로 해당 바이트에 액세스할 수 없으므로 차이가 없습니다.반면에 질문에 C++로 태그를 지정했으므로 POD와 다른 멤버 유형을 사용 하여 다른 예를 시도해 보겠습니다 .
struct TestStruct
{
int a;
std::string b;
};
TestStruct t = {}; // OK
{
TestStruct t1;
memset(&t1, 0, sizeof t1); // ruins member 'b' of our struct
} // Application crashes here
이 경우 like를 사용하는TestStruct t = {}
것이 좋으며memset
on을 사용하면 충돌이 발생합니다. 다음을 사용하면 어떻게 됩니까?
memset
- 유형의 객체TestStruct
가 생성 되어 유형의 객체 가 생성됩니다. 이는std::string
구조의 구성원이기 때문입니다. 다음으로,memset
객체b
가 위치한 메모리 를 특정 값(예: 0)으로 설정합니다. 이제 TestStruct 개체가 범위를 벗어나면 파괴될 것이며std::string b
해당 개체의 내부 구조가 모두memset
.
따라서 현실은이러한 것들이 매우 다르며memset
어떤 경우에는 전체 구조를 0으로 만들어야 할 때도 있지만 수행 중인 작업을 이해하고 있는지 확인하고 두 번째 단계에서와 같이 실수하지 않는 것이 항상 중요합니다. 예시.내 투표 - 필요한 경우 에만memset
개체에 사용하고 다른 모든 경우에는 기본 초기화 를 사용합니다 .
x = {}
memset
memset
int a;
char b;
int c;
그런 다음 "b"와 "c" 사이에 패딩 바이트가 삽입됩니다. memset()은 그것들을 0으로 만들 것이고, 다른 방법은 그렇지 않을 것이므로 3바이트의 쓰레기가 있을 것입니다(만약 당신의 int가 32비트라면). 구조체를 사용하여 파일에서 읽기/쓰기를 하려는 경우 이것이 중요할 수 있습니다.
memset
또한 올바르게 0이면 모든 POD 유형을 초기화합니다.memset()은 런타임에 수행됩니다.
또한 구조체가 POD가 아닌 경우 memset()을 사용하는 것이 의심됩니다.
int가 아닌 유형을 올바르게 초기화하지 않습니다(0으로).
STRUCT theStruct = {};
변환됩니다
memset( &theStruct, 0, sizeof( STRUCT ) );
assert(struct->member)
그러나
구조체가 공개 API의 일부로 사용되는 경우 memset을 요구 사항으로 사용하도록 클라이언트 코드를 가져와야 합니다. 이것은 새로운 멤버를 추가할 수 있고 클라이언트 코드가 멤버를 (위험할 수 있는) 초기화되지 않은 상태로 두지 않고 memset 호출에서 자동으로 NULL로 만들기 때문에 향후 검증에 도움이 됩니다. 이것은 예를 들어 소켓 구조로 작업할 때 수행하는 작업입니다.