auto, static_assert, default/delete, final/override, offsetof

2020. 9. 21. 20:25프로그래밍/C++

auto

 

자료형을 추론

실제 자료형은 컴파일하는 동안 결정됨

따라서, 반드시 auto 변수를 초기화해야 됨

 

포인터와 참조를 받을 수 있음

포인터를 받을 때 : auto 또는 auto* -> 포인터형을 받을 때는 auto* 쓰자(가독성 때문)

참조를 받을 때 : auto&

 

const도 auto가 이어받음(컴파일러가 알아낼 수 있기 때문)

const 참조 받을 때는 const auto& 쓰자

 

반복자에는 auto 키워드가 매우 유용

일부 템플릿형 받을때도 유용

 

auto 베스트 프랙티스

> 명시적이여야 함

> 1. auto보다 실제 자료형 사용을 권장

> 2. 예외: 템플릿 매개변수와 반복자에는 auto 사용

> 3. auto보다 auto* 사용

> 4. auto&보다 const auto& 를 사용

전부 가독성과 관련된 것

런타임 성능은 동일


static_assert

 

assert

실행 중에 가정(assertion)이 맞는지 평가

오직 디버그 빌드에서만 작동

실패한 assert를 보려면 반드시 프로그램을 실행해야 함

> 모든 코드 경로가 실행되었다고 어떻게 장담할까?

> 일부 어서션은 프로그램을 실행하기도 전에 알 수 있음

"모든 곳에 assert를 쓰자"

> 여전히 유효한 조언

 

static_assert

컴파일 중에 어서션 평가

컴파일러가 assert 조건이 참인지 아닌지 앎

실패하면 컴파일러는 컴파일 에러를 뱉음

많은 경우에 유용함

 

static_assert 베스트 프랙티스

최대한 assert보다 static_assert를 사용

> 첫째 "모든 곳에 static_assert를 쓰자"

> 그러고 나면 "모든 곳에 assert를 쓰자"

 

assert를 사용한다면...

여전히 프로그램을 실행시켜야 됨

실행 도중에만 어서션을 포착. 그것도 오직 디버그 빌드에서만...

 

static_assert를 사용한다면

컴파일 중에 모든 문제를 즉시 알아챔

또한 컴파일러처럼 생각하는 데도 도움이 됨!


default / delete

 

'= default' 키워드를 사용하면, 컴파일러가 특정한 생성자, 연산자 및 소멸자를 만들어 낼 수 있음

그래서, 비어 있는 생성자나 소멸자를 구체화할 필요가 없음

또한 기본 생성자, 연산자 및 소멸자를 더 분명하게 표시할 수 있음

> 명확하게 표현하는 것은 항상 좋다

 

컴파일러가 자동으로 생성자를 만들어 주길 원치 않는다면 '= delete' 키워드를 사용

private 접근 제어자로 빈 생성자를 만드는 트릭은 이제 그만

올바른 에러 메시지도 나옴

 

default/delete 에 관한 베스트 프랙티스

컴파일러가 코드를 생성하는 암시적 방식에 기댈 필요가 없음

명확해야 함

어디에나 default/delete 키워드를 넣자


final

 

클래스나 가상 함수를 파생 클래스에서 오버라이딩 못 하도록 하려면 final 키워드를 사용

컴파일 도중에 확인함

당연히 가상 함수가 아니면 쓸 수 없음

 

 

override

 

잘못된 가상 함수 오버라이딩을 막으려면 override 키워드를 사용

컴파일 도중에 검사

당연히 가상 함수가 아니면 쓸 수 없음


offsetof 매크로

 

특정 멤버가 본인을 포함한 자료 구조의 시작점에서부터 몇 바이트만큼 떨어져 있는지 알려줌

직렬화(serialize, 어떤 데이터를 파일에 쓰는 것)나 역직렬화(deserialize, 데이터를 읽어오는 과정)를 할 때 꽤나 유용

 

 

 

출처 : 포큐아카데미 C++ 언매니지드 프로그래밍