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를 사용하는 것이 좋다.
- unsigned
std::vector::size_type은 64bit이지만, unsigned는 32bit이다.64bit OS에서는 정상작동이 불가능 할 수 있다.
std::vector<int> v;
unisigned sz = v.size();
- unordered_map
unordered_map의 key는 const이다.아래 for문을 원치 않은 결과를 만들 수 있다.
for(const auto& p : m)
for(pair<string, int> : m)
auto를 사용하면 안 좋은 점 :
가독성이 떨어진다.
728x90
'Language > effective modern C++' 카테고리의 다른 글
현대적 C++에 적응하기 (0) | 2021.10.17 |
---|---|
Effective modern C++ ( Auto ) (0) | 2021.10.16 |
Effective modern C++ ( 형식 언어 ) (0) | 2021.10.14 |
Effective modern C++ ( 형식 언어 ) (0) | 2021.09.26 |
Effective modern C++ ( 형식 언어 ) (0) | 2021.09.22 |
댓글