본문 바로가기
Language/effective modern C++

Effective modern C++ ( Auto )

by y.j 2021. 10. 16.
728x90

Auto

항목 5 : 명시적 형식 선언보다는 auto를 선호하라

Auto를 사용하지 않을 때 불편한 점

1. 초기화 하지 않을 때, 쓰레기 값이 들어갈지 초기 값(0 or "")이 들어갈지 모른다.
2. 긴 형식을 짧게 만들 수 있다. ( ex typename std::iterator_traits::value_type )
3. closure형식으로 지역변수를 선언 할 때, 타입을 명시하는 것이 어렵다.

auto를 사용 할 때 무조건 초기 값을 넣어야 한다.
컴파일러가 auto를 연역하려면 초기값이 필요하므로 초기 값을 넣지 않은 실수를 방지 할 수 있다.

int x1;               // 문맥에 따라서는 초기화되지 않을 수 있음
auto x2;              // 오류! 초기치가 꼭 필요함
auto x3 = 0;          // 양호함; x3의 값이 잘 정의됨

컴파일러만 알던 형식을 지정 할 수 있다.
closure의 형식을 알지 못해도 auto로 대체 할 수 있다.

auto derefUPLess = 
  [](const std::unique_ptr<Widget>& p1,
     const std::unique_ptr<Widget>& p2)
  { return *p1 < *p2; }

// C++14
auto derefUPLess = 
  [](const auto& p1,
     const auto& p2)
  { return *p1 < *p2; }

auto를 사용하는 것이 좋은 이유 :

std::function
std::function을 이용 하여 auto를 아예 없애는 방식도 있다.
std::function을 함수처럼 호출 할 수 있는 것들의 포인터의 형식이다.

std::function<bool(const std::unique_ptr<Widget>&,
             bool(const std::unique_ptr<Widget>&)>
derefUPLess = [](const std::unique_ptr<Widget>& p1,
                  const std::unique_ptr<Widget>& p2)
           { return *p1 < *p2; }

auto와 std::function의 차이점

1. auto는 closure와 형식과 같으므로 closure가 요구되는 메모리를 사용한다.
2. std::function은 std::function이 정의되어있는 만큼 인스턴스한 후
   closure가 더 많은 메모리를 요구하게 되면 추가적으로 메모리를 가져오기 때문에 
   런타임시에 out of memory에러가 날 수 있다.
따라서, auto를 사용하는 것이 좋다.

  1. unsigned
    std::vector::size_type은 64bit이지만, unsigned는 32bit이다.64bit OS에서는 정상작동이 불가능 할 수 있다.
std::vector<int> v; 
unisigned sz = v.size();
  1. unordered_map
    unordered_map의 key는 const이다.아래 for문을 원치 않은 결과를 만들 수 있다.
for(const auto& p : m) 
for(pair<string, int> : m)

auto를 사용하면 안 좋은 점 :
가독성이 떨어진다.

728x90

댓글