memset으로 초기화 시...
memset( this, 0, sizeof(this) );
memset( this, 0x00, sizeof(this) );
2가지 방식이 있다. 결과는 똑같다. 메모리(배열) 초기화....
0으로 초기화 하는 것은 그 배열의 값을 0으로 대입한다는 것.
0x00은 16진수이다.... 16진수 최대 사이즈는 0xff는 255 이다.
뭔 말이냐고 하면 1byte의 사이즈는 0 ~ 255
즉, 0x00 초기화는 그 사이즈를 초기화 하겠다는 의미.
뭐 그렇다고...
근데 그외 내용을 좀더 알고 싶다면 밑의 추가 내용이 있수다.
일단 memset이 뭔지 알아보자.
Sets the first num bytes of the block of memory pointed by ptr to the specified value
(interpreted as an unsigned char).
메모리 블럭에 바이트 단위로 기록을 한다.
추가 내용을 왜 더 쓰냐면...
0과 -1외 수를 넣으면 memset 문제가 터진다... 그 문제점을 설명할려고 추가 내용을 쓴다.
0x00 아닌 예를 들어 int 배열에 10진수로 9 값을 대입 한다면,
논리적 모순이 발생하는데 1byte에 값이 대입 된다는 말.
실제 값은 0x09090909가 된다.
초기화 할때 해당 Type 사이즈 만큼 초기화 되는 것이 아니라. 초기화시 1byte 단위로 끊어서 초기화 해 버리는 것이다.
그러니 4byte 였다고 해도 0x00000009 으로 초기화 되는 것이 아닌 0x09 0x09 0x09 으로 초기화 되어서
값이 0x09090909 10진수로 151587081이 되는 것!
0과 -1은 16진수로 0x00 0xFF 이다.
즉, int 4byte를 1byte로 끊어서 0x00 0x00 0x00 0x00 으로 초기화 하든 0xFF 0xFF 0xFF 0xFF 하든 결과값은
4byte로 0x00000000 0xFFFFFFFF 이렇게 나오니 0과 -1은 모순에서 절묘하게 피해 가는것이다.
돌려 말하면 char로 9를 초기화 했다면 char 자체가 1byte 단위라 문제가 없다.
해당 문제는 memset의 논리적 모순으로 인하여 생기는 문제점이다.
memset 초기화는 0 아니면 -1 외엔 초기화 해도 의도 되로 될 수가 없으니 참조 하도록.
그리고... 클래스 객체를 초기화 하는 뻘짓은 하지 말도록... 뭐 말 안해도 다들 알것지.
memset 문자열 초기화 할려고 만든건데 어쩌다 보니 그렇게 쓰는건디...
객체를 초기화 한다는 거 자체가 뻘투더짓.
할당 값으로 초기화를 하고 싶다면 STL fill을 사용하자. (자세한건 링크)
(ex code)
int iData[3];
char szData[3];
memset( iData, 1, sizeof(iData) );
memset( szData, 1, sizeof(szData) );
for( int i = 0; i < 3; ++i )
printf( " iData[%d] = %d \n", i, iData[i] );
for( int i = 0; i < 3; ++i )
printf( " szData[%d] = %d \n", i, szData[i] );
>> --------------------------------------
iData[0] = 16843009 // 0x01010101
iData[1] = 16843009 // 0x01010101
iData[2] = 16843009 // 0x01010101
szData[0] = 1
szData[1] = 1
szData[2] = 1
------------------------------------------
참고 : lab.gamecodi.com
'[ Programing ] > C++' 카테고리의 다른 글
struct 와 class 의 차이 (0) | 2013.09.04 |
---|---|
커스텀 날짜 관련 구조체 (0) | 2013.05.22 |
비트 필드 (bit field) (0) | 2013.05.22 |
템플릿 클래스(Template Class)에서 멤버 로 iterator 가지기 (0) | 2013.05.22 |
[코딩 팁]조건문에서 상수를 앞에 두기 (0) | 2013.05.22 |