C++ - auto&, const auto, const auto&

뭉크의 개발·2024년 2월 28일

C++

목록 보기
3/3

타입 추론?

  • 타입 추론(Type Inference)는 코드의 가독성과 유지보수성을 위해 사용된다. C++ 11이상에서는 'auto' 키워드를 사용해 변수의 타입을 컴파일러에 자동으로 결정하게 할 수 있다.

장점

  • 코드 간결성
    : 타입 추론을 사용하면, 복잡한 타입 선언을 간편하게 만들 수 있다. STL 컨테이너나 제네릭 프로그래밍을 사용하면 타입 이름이 매우 길고 복잡해질 수 있는데, 이때 auto를 사용한다.
std::vector<std::pair<int, std::string>> vec;

// 타입 추론 사용 X
for (std::vector<std::pair<int, std::string>>::iterator it = vec.begin();
}

// 타입 추론 사용

for (auto it = vec.begin(); it != vec.end(); ++it){
}
  • 유지 보수성 향상
    : 변수의 타입을 변경해야 할 때, auto를 사용하면 해당 변수의 타입을 한 곳에서만 변경하면 된다.

    1. 오류 감소
      : 컴파일러가 자동으로 정확한 타입을 결정하기 떄문에, 타입 불일치로 인한 오류 방지가 가능하다.
  • 람다 호환성
    : C++ 11 이상에서 람다 표현식을 사용할 때, auto를 사용하면 람다의 타입을 쉽게 처리할 수 있다.

auto func = [] (int a, int b) { return a + b; };

const auto

  • const auto를 사용하면, 각 요소는 루프의 각 반복마다 새로운 변수로 복사된다. 이 변수는 원본 컨테이너의 요소를 수정할 수 없다. 즉, 읽기 전용이다.

  • 원본 데이터를 보호할 때 유용하지만, 복사 비용이 발생하기 때문에 큰 객체를 다룰 때 성능 저하가 발생할 수 있다.

for(const auto a : array){
    if(height < a) answer++;
}
  • 각 요소를 const 값으로 처리한다. 복시 비용이 발생하기 때문에 큰 객체를 다루는 경우에는 성능 저하의 원인이 될 수 있지만, 이렇게 간단한 경우에는 상관없다.

auto&

  • auto&를 사용하면, 컨테이너의 각 요소는 참조로 처리된다. 즉, 원본 요소에 대한 참조를 생성하여, 원본 데이터를 직접 수정할 수 있다. 복사가 발생하지 않아 성능상의 이점이 있다.

  • 그러나 의도치 않게 데이터를 변경할 위험이 있다.

for(auto& a : array){
    if(height < a) answer++;
}
  • 각 요소를 비상수 참조로 처리한다. 필요시 array의 각 요소를 루프 내에서 변경할 수 있다. 그러나 이런 경우에는 요소를 직접 변경할 필요가 없다.

const auto&

  • const auto&는 const auto와 auto&의 장점을 결합했다. 컨테이너의 각 요소에 대한 참조를 생성하지만, 읽기 전용이다. 원본 데이터를 보호하면서도, 큰 객체를 다룰 때 발생할 수 있는 복사비용을 피할 수 있다.
for(const auto& a : array){
    if(height < a) answer++;
}
  • 각 요소를 const 참조로 처리한다. 각 요소를 변경할 수 없고, 복사 비용 없이 직접 참조한다.

0개의 댓글