juhongkim2   6년 전

1,0,-1로 배열을 초기화 해야할때는 memset함수를 애용하고 있습니다.

( memset을 이용할때는 위 세값 이외에 다른 값은 안된다고 알고있습니다)

for문을 이용해서

배열을 초기화 할때와 비교해서

memset함수가 가지는 특별한 차이점이 있나요??

(실행시간이라던지...)

kesakiyo   6년 전

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년 전

정말 감사합니다

자주쓰면서도 어떻게 작동하는지 제대로 몰랐는데

덕분에 또 한가지 배워갑니다ㅠ

Green55   6년 전

memset이 fill이나 for문보다 보통 실행시간이 더 빠르긴 하지만 유의미한 차이는 없습니다. 편한거 쓰시는게 장땡이에요

rdd6584   6년 전

bool[50000][5] 크기를 1만번 초기화 했을 때,

memset// 72ms

for문// 848ms 나왔습니다.

댓글을 작성하려면 로그인해야 합니다.