출처: https://bumcrush.tistory.com/182 [맑음때때로 여름]
일단 결론부터 말하자면 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))
이렇게만해도 다차원 배열 전체를 초기화 시킬 수 있다.
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 |
댓글 영역