Home [C++] emc++ 01: Type Deduction(auto 등)
Post
Cancel

[C++] emc++ 01: Type Deduction(auto 등)

EMC++ 소개 부분

  • lvalue, rvalue

    • 주소를 취할 수 있으면 lvalue, 아니면 rvalue
    • 매개변수 자체는 lvalue (Widget&& rhs 에서, 타입은 rvalue 참조, rhs 자체는 lvalue)
  • 잘 설계된 함수

    • 예외에 안전: 기본 보장: 불변식 위반 x
    • 강한 보장 함수를 호출할 때에는 예외가 발생해도 프로그램의 상태가 호출 이전 상태와 동일하게 유지될 것

Type Deduction

  • C++98 : 템플릿에 대한 것 만 있었음
  • C++11 : 새로운 규칙 집합 두개

    • auto를 위한 규칙
    • decltype을 위한 규칙
  • C++14 : auto, decltype을 사용할 수 있는 문맥이 확장

항목1~4: 생략

  • 항목1: 템플릿 타입 연역 규칙

  • 항목2: auto의 타입 연역 규칙

    • auto는 auto a = {1, 2, 3}에서 타입을 std::initializer_list 로 해석
    • Template는 그렇지 않음
    • 리턴 타입이 auto일 경우 Template 타입 연역이 적용됨
  • 항목3: decltype의 작동방식

  • 항목4: 연역된 형식을 파악하는 방법

항목5: auto 사용


auto 의 장점

  • 변수 초기화 누락 방지
  • 장황한 변수 선언 회피
  • 클로저를 직접 저장
  • 리팩터링하기 쉬워짐
  • type shortcut 관련 문제 회피
    • 64비트, 32비트 호환성 관련(unsigned 와 vector::size_type 의 바이트 크기)
  • 기대하지 않은 암묵적 변환 회피
  • auto 의 단점
    • 초기화 표현식의 타입이 기대하지 않은 것일 경우가 있음
      • 항목2, 항목6 참고
    • 코드의 가독성 저하
auto 선언된 클로저는 더 효율적
  • 그 클로저에 요구되는 만큼의 메모리만 사용

  • 클로저를 담는 std::function의 단점

    • std::function 템플릿의 한 인스턴스가 타입
    • 그 크기는 고정됨.
    • 요구된 클로저의 크기보다 작을 수 있고
    • 이 경우 힙 메모리를 할당해서 클로저를 저장
    • auto 보다 메모리 더 많이 소비
    • 인라인화를 제한, 간접 함수 호출을 산출하는 구현 세부사항 —> auto 접근방식보다 느림
    • 메모리 부족 예외 가능성이 있음

기억해 둘 사항

  • auto 는 반드시 초기화
  • auto는 이식성 or 효율성 문제를 유발할 수 있는 타입 불일치가 발생하는 경우가 거의 없음
  • 항목2와 항목6에 대해 주의해야함

항목6: auto… 원치 않은 타입으로 연역될 때 명시적 타입의 초기치 사용


  • auto var = "보이지 않는" 대리자 클래스 형식의 표현식은 피해야함

    • 인터페이스를 세심하게 살펴봐야함.
    • auto가 다른 형식을 연역하도록 강제 -> explicitly typed initializer idiom
  • 타입 명시 초기치 관용구(explicitly typed initializer idiom)

    • auto sum = static_cast<bool>(features(w)[5]);
    • 의도 표현이 명확해짐 (암묵적 타입 변환보다)
ex) vector bool
1
2
std::vector<bool> features(const Widget& w);
auto highPriority = features(w)[5];
위에서 auto는 bool 이 아님: std::vector의 문제 </span> </summary>
  • std::vector<bool>

    • 부울당 1비트의 압축된 형태로 표현하도록 명시되어있음
    • C++에서는 비트에 대한 참조는 금지되어 있어 bool& 을 리턴할 수 없음
    • 그래서 operator[]는 std::vector<bool>::reference 형식을 리턴함
  • std::vector<bool>::reference

    • 구현방식에 따라 동작이 다름
    • UB
    • dangling pointer의 가능성
      • 위에서 highPriority는 std::vector<bool>::reference의 복사본
      • highPriority는 포인터와 5번 비트의 오프셋을 담게됨
      • 이는 임시 객체이므로, 문장의 끝에서 소멸
</details>
Proxy class
  • 다른 타입의 행동을 흉내 및 보강
  • ex) 스마트 포인터과 포인터 (명백히 보이는 클래스), ::reference 과 std::bitset
  • expression template 기법
    • 암묵적 변환 지원…
    • Sum<Matrix, Matrix> … 를 사용하면 더 효율적으로 표현식 계산??
  • 보이지 않는 대리자 클래스는 auto와 맞지 않음
</div> </details> ## **출처** emc++ 1~52p
This post is licensed under CC BY 4.0 by the author.

[ostep] Virtualization: 프로세스 개념

[C++] 참고할만한 링크 목록