Zeromemory(&구조체, sizeof(구조체));
memset(&구조체, 0, sizeof(구조체));
이 두개는 컴파일 최적화 옵션을 해제하고 디스 어셈블 해보면
004017F0 push 24h
004017F2 push 0
004017F4 lea eax, [ebp-70h]
004017F7 push eax
004017F8 call memset(401000h)
004017FD add esp, 0CH
결과 값과 컴파일 결과가 일치하는 것을 알 수 있다.
인자를 스택에 넣고, memset의 주소를 콜하는 방식이다.
실제적으로 두개의 차이는 없다고 할 수 있지만 Zeromemory는 0으로만 채워줄 뿐 memset과 같이 원하는 값을 초기화 값으로 줄 수 없다.
단지 Zeromemory는 0x00으로 해주는 수고를 줄여줄 뿐이다.
가독성면으로 보더라도 Zeromemory가 0으로 초기화 하겠다는 것을 쉽게 알 수 있으므로 별 차이가 없다면 Zeromemory를 쓰도록 하자.
또 다른 구조체 초기화 방법은
구조체타입 객체변수 = {0};
ex) Student S1 = {0};
코드를 디스 어셈블 해보면 결과는
00401800 mov dword ptr[ebp-4Ch], 0
00401807 xor ecx, ecx
00401809 mov dword ptr[ebp-48h], ecx
0040180C mov dword ptr[ebp-44h], ecx
0040180F mov dword ptr[ebp-40h], ecx
2번째 줄에서 볼 수 있듯이 xor, ecx, ecx 명령어로 단순히 그 값을 0으로 채워주는 것 밖에 없다.
한가지 알아 둘 것은 구조체의 크기가 커지면 컴파일 시 자동으로 memset으로 변환한다는 것이다.
즉 3개의 차이는 그다지 크지 않으므로 자신이 보기 편하고 가독성이 좋다고 생각하는 것을 쓰도록 하자.
'Basic Programming > C, C++' 카테고리의 다른 글
C++ - #pragma (0) | 2016.03.03 |
---|---|
C++ - 멤버 이니셜라이져(Member Initializer) (0) | 2016.03.03 |
C++ - volatile 과 register 키워드 (0) | 2016.03.03 |
C++ - 타입 캐스팅(static_cast, reinterpret_cast, dynamic_cast, const_cast) (0) | 2016.03.03 |
C++ - auto_ptr의 문제점 (0) | 2016.02.26 |