출처: https://bumcrush.tistory.com/182 [맑음때때로 여름]

상세 컨텐츠

본문 제목

memset 함수

cs 지식

by 장동균 2020. 7. 7. 00:34

본문

https://minusi.tistory.com/entry/memset-%EC%82%AC%EC%9A%A9%EC%8B%9C-%EC%A3%BC%EC%9D%98%ED%95%A0-%EC%A0%90

 

memset 사용시 주의할 점

C 또는 C++ 언어에서, 구조체 또는 배열을 초기화할 때 memset 함수를 사용하는 것을 종종 볼 수 있습니다. #ifdef CPP // C++에서는 cstring 헤더를 사용합니다(string.h 를 사용해도 됩니다) #include #elif #in..

minusi.tistory.com

일단 결론부터 말하자면 memset 함수로 초기화 가능한 값은 0, -1, 10101010 01010101과 같이 8bit씩 규칙적으로 잘려지는 수들 뿐인다. 나는 이것도 모르고 memset함수로 배열 전체를 100000을 초기화 시키려다가 낭패를 봤다.

 

memset함수는 1byte씩 초기화 시킨다. 이 때문에 0을 뜻하는 00000000 -1을 뜻하는 11111111은 온전히 초기화가 되는 것이다. 

 

우리가 1을 초기화 한다고 가정한다면 4byte 초기화 된 00000001의 값을 기대할 것이다. 하지만 memset 함수는 01010101로 초기화 시켜버린다.

 

나는 항상 memset함수가 for문보다 빠르다고 생각해서 사용해 왔었다. 하지만 이 둘의 성능 이슈 차이는 거의 없다고 한다. 오히려 4byte씩 초기화 시키는 for문이 더 빠르다고 한다.

 

 

결국, memset 함수 사용은 최대한 지양해야한다!! 내가 제대로 알지도 못하고, 언제 잘못된 값으로 초기화 시킬지 모르는 놈이기 때문이다. 이 자료처럼 fill 함수를 사용하는 습관을 들여야 겠다.


memset으로 2차원 배열을 초기화할 때

for(int i=0;i<N ;i++){
	memset(arr[i], 0, sizeof(arr[i]))
}

와 같이 초기화를 해왔다.

 

하지만, 굳이 이런 식으로 초기화하지 않았어도 됐다.

memset(arr, 0, sizeof(arr))

이렇게만해도 다차원 배열 전체를 초기화 시킬 수 있다.

'cs 지식' 카테고리의 다른 글

http 통신  (0) 2021.01.13
Ajax 요청 중 Axios or Fetch  (0) 2021.01.11
참고할 사이트!  (0) 2020.08.26
javascript의 hoisting  (0) 2020.08.13
깊은 복사, 얕은 복사  (0) 2020.07.05

관련글 더보기

댓글 영역