슭의 개발 블로그 : 10 월 2017 
 [ C ++] C ++ Core Guidelines - modern C ++ 을 위한 안내서 
 C ++ 은 사용 하 기 어려운 언어 이 다 . C ++ 이후 에 나온 언어 들 에 비해 사용 자 에게 너무 많 은 자유도 를 주 기 때문 에 안 전하 게 사용 하 기 어렵 다 . 그래서 구글 , 웹 킷 , LLVM 등 많 은 스타일 가이드 들 이 단순히 문법 적 인 포맷 을 어떻게 작성 할지 디자인 에 대한 부분 도 같이 제안 한다 . 
 오늘 소개 할 C ++ Core Guidelines 도 이런 스타일 가이드 문서 중 하나 다 . modern C ++, 즉 , C ++ 11 이후 C ++ 을 어떻게 사용 할지 에 초점 을 맞힌 가이드 문서 로 , C ++ 의 창시자 인 Bjarne Stroustrup 이 주축 이 되 어 작성 되 었 다 . C ++ Core Guidelines 는 다른 문서 보다 C ++ 자체 를 어떻게 하 면 더 안 전하 게 쓸 수 있 을지 에 초점 을 두 기 때문 에 문법 적 인 포맷 에 대한 조언 은 거의 하 지 않 는다 . 그 보다 는 어떻게 하 면 로직 의 문제 를 최대한 빠르 게 , 가능 하 면 컴파일 타임 에 잡 을 수 있 는지 에 대한 디자인 조언 을 많이 한다 . 개인 적 으로 는 지금 까지 읽 었 던 modern C ++ 코딩 에 관한 문서 중 가장 실용 적 인 문서 라고 생각 한다 . 
 C ++ Core Guidelines 를 읽 다 보 면 GSL 이 라는 단어 가 자주 나온다 . C ++ Core Guidelines 는 반복 되 는 몇 가지 사용 패턴 을 위해서 몇몇 라이브러리 를 사용 할 것 을 권하 고 있 다 . 이 를 Guideline Support Library , 줄여서 GSL 이 라고 부른다 . 정의 상 으로 는 가이드라인 에서 제안 하 는 GSL 의 스펙 을 만족 하 는 라이브러리 는 모두 GSL 이 라고 부를 수 있 다 . 하지만 현존 하 는 구현 체 는 Microsoft 에서 만든 GSL 뿐 이 기 때문 에 사실 상 Microsoft 의 GSL 과 같 은 의미 라고 생각 해도 된다 . 
 앞 으로 시간 나 는 대로 C ++ Core Guidelines 와 GSL 의 내용 중 에서 좋 아 하 는 항목 몇 개 를 소개 할 생각 이 다 . 하지만 그 와 는 별개 로 앞 으로 계속 해서 C ++ 프로그래머 를 할 생각 이 라면 한 번 쯤 은 읽 어 보 기 를 추천 한다 . 
 작성자 : Seulgi Kim 시간 : 01 : 20 댓글 3 개 : 
 라벨 : C ++, Cpp Core Guidelines , GSL , modern c ++ 
 작성자 : Seulgi Kim 시간 : 03 : 34 댓글 없 음 : 
 [ C ++] array to pointer decay 
 C ++ 은 그 근본 이 C 에서 나왔 기 때문 에 C 에서 많 은 문제점 을 물려받 았 다 . 대표 적 으로 implicit conversion 이 그런데 , 그 중 에서 array 가 pointer 로 implicit conversion 되 는 것 을 decay . 혹은 다른 decay 들 과 구분 하 기 위해 array to pointer decay 라고 부른다 . 이 는 말 그대로 T [ N ] 타입 으로 선언 된 변수 의 값 이 T * 타입 의 변수 에 바인딩 될 때 implicit casting 이 되 는 것 을 말 한다 . 이 는 컴파일 타임 정보 인 배열 의 크기 를 잃 는다는 문제 도 있 지만 , 그 보다 더 큰 문제 는 포인터 에 대해서 upcasting 또한 implicit conversion 이 가능 하 다는 데 서 생긴다 . 
 위 와 같 은 코드 가 있 다고 해 보 자 . A 를 상속 받 은 B 클래스 가 있 고 , B instance 의 크기 는 A instance 의 크기 보다 크다 ( 정확히 따지 자면 사용 하 는 alignment 의 크기 가 B 클래스 보다 작 은지 따져 봐야 하 지만 , 여기 서 는 설명 을 간단히 하 기 위해 int 크기 로 align 된다고 가정 하 고 진행 하 도록 하 겠 다 ) . 이때 f 함수 가 하 는 일 은 다음 과 같 다 . 
 B ( 3 , 4 ) 를 생성 한다 . 
 1 에서 생성 한 객체 의 A 부분 만 slice 한 A ( 3 ) 을 인자 로 받 은 a 위치 에 넣 는다 . 
 B ( 5 , 6 ) 를 생성 한다 . 
 3 에서 생성 한 객체 의 A 부분 만 slice 한 A ( 5 ) 를 인자 로 받 은 a 에 1 더 한 주소 에 저장 한다 . 
 앞 에서 말 했 듯이 위 의 코드 는 일단 포인터 는 실제 배열 의 크기 를 알 지 못하 기 때문 에 f 함수 가 받 은 a 의 길이 가 2 이상 인지 알 수 없 다는 문제 가 있 다 . 하지만 이 보다 더 큰 문제 가 있 다 . 만약 f 함수 를 아래 와 같이 사용 했 다고 해 보 자 . B [ 4 ] 타입 인 a 는 B * 타입 으로 decay 되 고 , B * 는 부모 타입 인 A * 로 upcasting 되 어 f 함수 에 넘어간다 . 
 f 함수 를 실행 한 뒤 사용 자 가 원했 던 모습 은 아마 위 와 같 은 모습 일 것 이 다 . 혹은 object slice 가 일어난다는 것 을 생각 하 지 않 고 아래 와 같 은 결과 를 생각 했 을 수 도 있 다 . 
 하지만 실제 실행 한 결과 는 다음 과 같 은 값 을 가지 게 된다 . 
 이 는 실제 정의 된 메모리 레이아웃 과 f 함수 가 해석 한 메모리 레이아웃 이 다르 기 때문 이 다 . 
 실제 레이아웃 
 f 가 해석 한 레이아웃 
 이 문제 를 해결 하 는 방법 은 크 게 2 가지 있 다 . 첫 번 째 방법 은 함수 를 정의 할 때 배열 을 넘기 기 위해서 포인터 를 사용 하 지 않 는 것 이 다 . 이 는 함수 에 넘겼 을 때 배열 의 크기 라는 정보 를 잃 지 않 기 위해서 이기 도 한데 C ++ Core Guidelines 에서 추천 하 는 방법 이 기 도 하 다 . 
 두 번 째 방법 은 배열 을 선언 할 때 C 스타일 의 [ ] 가 아닌 std : : array 를 사용 하 는 것 이 다 . std : : array 는 C ++ 11 에 추가 된 배열 을 표현 하 기 위한 타입 으로 , C 스타일 배열 과 다르 게 이터 레이터 와 begin , end 등 이 정의 돼 있 어서 다른 표준 컨테이너 들 과 같 은 코드 를 공유 할 수 있 다는 장점 이 있 다 . 하지만 여기 서 는 코드 를 재 사용 할 수 있 다는 것 보다 이 는 템 플릿 클래스 이 고 따라서 A 가 B 의 부모 일 때 , std : : array < A , N > 가 std : : array < B , N > 의 부모 가 아니 라는 특성 이 더 중요 하 다 . 따라서 template < int N > void f ( std : : array < A , N >& a ) 라는 함수 를 호출 할 때 인자 로 B 의 std : : array 를 넘길 수 없 기 때문 에 위 와 같 은 문제 가 발생 하 지 않 는다 . 
 작성자 : Seulgi Kim 시간 : 16 : 59 댓글 없 음 : 
 라벨 : array , C ++, C ++ 11 , modern c ++ 
 crash - only software - high availability server 만들 기 . ..