memset 함수에 대해서 오해를 하고 있는 것 같아 memset 함수가 가지는 의미를 자세히 얘기해볼까 합니다.
memset의 의미는 "1byte 단위로 해당 메로리 값을 초기화 시킨다" 입니다.
1byte 단위로 초기화를 하는데 왜 int(4byte) 혹은 long long(8byte) 배열이 0 또는 -1 값으로 memset을 이용해 초기화가 되는지 궁금해할 수 있습니다.
우선 0으로 초기화를 하는 경우를 생각해 봅시다.
0은 1byte에서 2진수로 표현하면 00000000 입니다. 이 값을 연속해서 4byte로 만들면 00000000000000000000000000000000 입니다.
연속된 32bit를 계산하면 0이 되죠. 그래서 memset(A, 0, sizeof(A)) 코드를 실행시키면 배열이 0으로 초기화가 되는 것입니다.
-1 또한 마찬가지입니다. -1을 1byte 이진수로 표현하면 11111111 입니다. 이 값을 연속해서 4byte로 만들면 11111111111111111111111111111111 입니다.
이 값 역시 연속된 32bit를 계산하면 -1이 되죠.
이런 원리를 통해 1byte 단위로 초기화를 해주는 memset 코드가 int, long long에서도 0 또는 -1로 초기화를 해줄 수 있는 것입니다.
(1로 초기화를 해줄 수 있다고 하셨는데 1byte 단위의 자료형이 아니라면 정확히 1로 초기화하는 것은 힘들 것 같습니다.)
원하는 값으로 초기화를 해주고 싶다면 algorithm 헤더에 들어있는 fill 함수를 사용하시는 것을 권장합니다.
* 실행 시간은 내부 구현에 따라 차이가 있겠지만 그 차이가 너무 미비해 굳이 생각할 필요가 없다는게 저의 개인적인 생각입니다.
juhongkim2 6년 전
1,0,-1로 배열을 초기화 해야할때는 memset함수를 애용하고 있습니다.
( memset을 이용할때는 위 세값 이외에 다른 값은 안된다고 알고있습니다)
for문을 이용해서
배열을 초기화 할때와 비교해서
memset함수가 가지는 특별한 차이점이 있나요??
(실행시간이라던지...)