auto
auto가 의도하지 않은 형식으로 추론할 때가 가끔 존재한다.
5. 명시적 형식 선언보다는 auto 를 선호하라.
auto 변수의 형식은 초기값으로부터 추론 되므로, 반드시 초기값을 제공해야한다.
따라서 변수 선언 시 초기화를 빼먹는 실수는 애초에 안하게 된다.
error: declaration of variable 'a' with deduced type 'auto' requires an initializer
초기화 없이 auto 변수 선언 시, 위와 같은 컴파일 에러 발생한다.
auto의 다른 장점으로는, std::function과 비교함으로써 드러난다.
std::function 는 함수 포인터를 일반화한 wrapper이다.
std::function 방식으로 객체 생성 시, 지칭할 함수 형식 (반환값, 매개변수)을 지정해야한다.
auto를 사용함에 따라, std::function보다 반복적인 매개변수 등 형식적 내용을 덜 작성할 수 있다.
이런 번잡함 외에도, 메모리 및 속도에서 auto 접근법이 더 좋은 선택지이다.
std::function은 힙 메모리를 할당하며, 메모리 부족이 발생할 수도 있다.
또한 인라인 제한 및 간접 함수 호출 등 동작 원리 때문에 auto 사용하는 것보다 속도도 느리다.
#include <iostream>
int main() {
std::function<bool(int, int)> fun1 = [] (int a, int b) {
return a>b;
};
auto fun2 = [] (int a, int b) {
return a>b;
};
std::cout << fun1(1,5) << " " << fun2(1,5) << std::endl;
}
위 fun1, fun2 는 동일한 기능을 하는 std::function, auto 의 예시이다.
또 다른 장점으로, 컨테이너 크기 등을 나타낼 때도 auto 가 더 유리하다.
std::vector<int>::size_type 형식은 개발자가 잘 모르므로, 임의로 unsigned 등으로 명시적으로 형식을 정의하다보면 자료형 크기로 인한 문제가 발생한다.
또한 auto는 개발자가 의도하지 않은 형식 불일치의 가능성을 차단할 수 있다.
#include <iostream>
#include <string>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> m;
m.emplace("a", 1);
for (const std::pair<std::string, int> & p : m) {
std::cout << p.first << " " << p.second << std::endl;
}
}
unordered_map의 key는 const 이지만, 사용자가 그렇게 지정하지 않는 경우 비효율적인 변환 과정들이 추가로 발생한다.
전통적인 명시적 형식 선언 (int a = 10;) 과 비교했을 때, auto 사용 시 가독성이 문제가 된다는 말이 있다.
하지만 실제로 type inference 가 일상인 언어 (python, js 등) 인프라는 이미 방대하다.
따라서 형식을 명시적으로 작성하는 것 보다, auto 를 사용하는 것이 추천된다.
'dev > C++' 카테고리의 다른 글
Effective Modern C++ #7 객체 생성 시 괄호()와 중괄호{}를 구분하라. (0) | 2025.06.10 |
---|---|
Effective Modern C++ #13 iterator 보다 const_iterator 를 선호하라 (0) | 2025.06.10 |
Effective Modern C++ #1 템플릿 형식 연역 규칙을 숙지해라. (0) | 2025.06.04 |
스마트 포인터(smart pointer) 사용 예시 (0) | 2025.05.23 |
스마트 포인터(smart pointer) (0) | 2025.05.23 |