알고리즘 문제를 풀 때나, C++ 코딩을 할 때 배열을 초기화할 일이 있으면 습관적으로 memset()을 사용하는데, memset()이 배열의 타입단위가 아니라 1바이트단위로 초기화를 하기때문에 0x00으로 초기화할 경우에만 사용했었다. 

아래는 내가 참고한 글

https://stackoverflow.com/questions/1373369/which-is-faster-preferred-memset-or-for-loop-to-zero-out-an-array-of-doubles

 

memset() : assembler로 작성되어서 속도는 무지 빠름

std::fill() : 내부적으로 루프문을 수행해서 초기화를 수행

 

fill_n의 구현체를 살펴보자. ( fill_n 함수의 명세에 맞는 서로 다른 구현체가 있을 수 있다. )

template <class OutputIterator, class Size, class T>
  OutputIterator fill_n (OutputIterator first, Size n, const T& val)
{
  while (n > 0) {
    *first = val;
    ++first; --n;
  }
  
  return first;     // since C++11
}

 

결론: 앞으로 배열을 초기화할 일이 있으면 memset() 대신 std::fill_n()을 사용하자.

 

피드백에 따른 추가사항

memset 함수를 사용할 수 있다면 더 좋은 퍼포먼스를 낼 수 있다.

따라서, fill_n 함수도 memset 함수가 사용 가능한지 먼저 체크해보고 안되면 루프을 돌려 초기화 작업을 수행한다.