/ The Blog of Jinho Ko / Computer science / Programming / C++ / Effective C++

·

2 min read

2. auto

By Jinho Ko

Item 5. Prefer auto to explicit type declaration

  • auto의 가장 큰 강점은, 초기화되는 값이 제공되어야 그 값으로부터 type를 연역하므로, 초기와 없는 선언에 의한 실수를 방지할 수 있다는 것이다
    • auto x; => invalid
  • auto를 썼을 때의 역효과도 거의 없다.
  • std::function을 담을 때 유리한 점이 많다
    • std::function은 하나의 stl template임 (closure)
    • auto로 선언된 closure 변수는 요구되는 만큼의 메모리만 사용한다. 하지만 std::function으로 선언하게 되면 고정 크기를 가지고 추가 용량은 힙에서 가져오게 됨
    • 장점
      1. 메모리 소비 적음
      2. std::function변수에 대한 inlining 제한 등이 덜 해 optimization 기회 늘어남
      3. std::function 정의는 OOM 발생 가능
      4. 쓰기 편함
  • 값의 type을 잘 모를 때 발생하는 이상한 casting을 막을 수 있음
  • 복잡한 자료구조의 내부 변수를 접근할 때 auto로 접근하지 않으면 의도하지 않은 초기화/복사를 마구 유발할 수 있음. 이 부분이 compiler에 의해 대체되므로 더 강력함.
  • 물론 auto 자체가 type deduction의 영역에서 functional programming언어들에 비해 혁신적인 성과를 낸 것은 없다. 하지만 그 자체로 많은 도움이 된다.
  • auto를 쓰면 refactoring cost가 줄어들기도 함.

Item 6. Use explicit type initialization when auto fails to deduct to unwilled type

  • 내가 의도하지 않은 경우
vector<bool> features();

auto highPriority = features()[5];
process(highPriority);

여기서 highPriority는 bool이 아니라 vector<bool>::reference의 객체이다. 하지만 vector<bool>은 내부적으로 1bit를 가지기 때문에 Cpp에서는 비트에 대한 참조가 금지되어 있다. 이걸 전달하게 되면 vector<bool>에 대한 dangling pointer가 전달되고 미정의 행동을 유발한다.

  • 그래서 내부적으로 std:vector<bool>::reference는 Proxy class로써 이러한 semantics를 처리하게 된다.
    • Proxy class의 다른 예에는 smart pointer(unique pointer, shared pointer)이다.
  • 이러한 Proxy pattern이 프로그래머에게 잘 드러나지 않는 경우(reference의 예임. unique_ptr는 숨겨진 경우임)에 이는 auto class의 사용과 잘 맞지 않는다.
    • 이러한 class들은 객체의 수명이 한 문장 안에 끝난다는 가정이 있기 때문에, 중간에 auto를 둠으로써 변수를 생성하게 되면 라이브러리의 수많은 가정을 깨게 되며 예상 밖의 행동을 할 수 있다.
  • auto로 선언하되 그 type를 명시하고 싶다면 아래의 패턴을 사용할 것,
    • auto x = static_cast<bool>(...)
last modified June 2, 2024
comments powered by Disqus

© Copyright 2024. Jinho Ko. All rights reserved. Last updated: June 02, 2024.