분류 전체보기 294

[Effective Modern C++] 항목 2: auto의 형식 연역 규칙에 숙지하라

항목 1에서 템플릿 형식 연역을 알고 있다면 auto 형식 연역에 관해 알아야 할 것은 거의 알고 있는 셈입니다. 예외를 빼면 auto 형식 연역이 곧 템플릿 형식 연역이기 때문입니다. auto를 이용해서 변수를 선언할 때 auto는 템플릿의 T와 동일한 역할을 하며, 변수의 형식 지정자(type specifier)는 ParamType과 동일한 역할을 합니다. (T, ParamType이 무엇인지 모른다면 항목 1을 살펴봐주세요.) auto x = 27; // x의 형식 지정자는 auto const auto cx = x; // cx의 형식 지정자는 const auto const auto& rx = x; // rx의 형식 지정자는 const auto& 이 예들에서 x와 cx, rx의 형식들을 연역할 때, 컴..

[Effective Modern C++] 항목 1: 템플릿 형식 연역 규칙을 숙지하라

항목 1: 템플릿 형식 연역 규칙을 숙지하라 템플릿 선언은 다음과 같은 모습입니다. template void f(ParamType param); 호출하는 코드는 다음과 같은 모습니다. f(expr); 예를 들어 템플릿의 선언이 다음과 같습니다. template void f(const T& param); 그리고 이를 다음과 같이 호출한다고 합시다. int x = 0; f(x); T가 expr의 형식일 것이라고 기대합니다. 실제로 위의 예제에서 x는 int이고 T는 int로 연역됩니다. 그러나 항상 그런 것이 아닙니다. T에 대해 연역된 형식은 expr의 형식과 Paramtype의 형태에 의존합니다. 그 형태에 따라 총 세가지 경우로 나뉩니다. ParamType이 포인터 또는 레퍼런스이지만 Universal..

[C++] Online C++ 컴파일러

온라인 컴파일을 사용하면 매우 유용합니다. Wandbox https://wandbox.org/ [Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ wandbox.org Compiler Explorer https://gcc.godbolt.org/ Compiler Explorer gcc.godbolt.org 각종 CPU, 컴파일러별 어샘블리 코드를 바로 볼 수 있습니다. Quick C++ Benchmarks https://quick-bench.com/ Quick C++ Benchmarks Quickly benchmark C++ runtimes quick-bench.com

[C++] decltype 과 auto

decltype은 주어진 식의 구체적인 타입 그대로 전달하는(추출하는) 키워드입니다. decltype(expression) auto는 상응하는 타입을 추론하는 키워드라면, declytype은 상응하는 타입을 추출하는 키워드 입니다. const int n = 1; auto m = i; // auto는 추론되며 int decltype(i) k = i; // decltype(i)는 추출되어 const int decltype의 expression에 식별자(객체의 이름)가 아닌 expression이 온다면 어떻게 추출 되는지를 알아야 합니다. 이를 알기 위해서는 lvalue, prvalue, xvalue가 무엇인지 명확히 알아야 하며 Type Category를 참고해주세요. [객체 지향 프로그래밍/C++ 프로그래..

[C++] 문자열 리터럴이 lvalue인 이유

C 문자열 리터럴은 Lvalue 입니다. C의 lvalue와 rvalue를 가집니다. 직관적으로 생각하면 lvalue은 왼쪽에 올 수 있는 표현들을 rvalue는 오른쪽에 올 수 있는 표현들입니다. 예를 들면 다음과 같이 두 항당 문이 있다고 생각해 봅시다. int x; x = 1; // OK 1 = x; // Error 첫번째 문장은 x가 lvalue이고 1이 rvlaue이며 이상없습니다. 두번째 문장은 왼쪽에 rvalue가 왔기 때문에 에러가 발생합니다. 러터럴(literal)은 일반저긍로 7, tue, 1.0f와 같은 rvalue들을 말합니다. 이는 리터럴들은 할당 표현에서 오른쪽에 올 수 있습니다. 그러나, 예외의 경우가 있습니다. 문자열 리터럴(예:"hello")는 실제로는 lvalue입니다. ..

C++ Type Category

glvalue(generalized lvalue)는 일반화된 좌측값 rvalue는 우측값 lvalue는 좌측값 xvalue(eXpiring value)는 소멸하는 값 prvalue(pure rvalue)는 순수 우측값 C++에서 타입 카테고리를 따질 때 크게 두 가지로 구분 합니다. Identity(정체를 알 수 있는가?) Movable(이동 시킬 수 있는가?) 모든 타입은 다음과 같이 다섯 가지고 구분 할 수 있어요. lvalue Identity && Not Movable 즉, 정체를 알 수 있고 이동 시킬 수 없습니다. int n; int m; n과 m은 정체를 알 수 있나요? n와 m은 다른 주소를 가지고 있고 이 주소값들에 의해서 구분 됩니다. 즉, 정체를 알 수 있습니다. 그렇다면 이동은 가능한..

[Effective Modern C++] 형식 연역(type deduction)

형식 연역이 일어나는 경우는 다음의 경우입니다. C++98 : template만 존재 C++11 : auto, decltype 추가 C++14 : auto와 decltype를 사용할 수 있는 문맥 확장, decltype(auto) [C++] decltype 과 auto 참고해 주세요. 형식 연역의 범위가 증가한 덕분에 자명하거나 이미 언급된 형식들을 여러 번 일일이 지정해야하는 경우가 크게 줄었습니다. 코드의 한 곳만 수정하면 그 변화가 형식 연역을 통해 다른 장소들로 자동으로 전파됩니다. 그러나 코드의 의미를 추론하기는 좀 더 어려워졌습니다. 컴파일러가 연역하는 형식이 독자가 언뜻 보고 추측하는 것과 다른 경우가 있기 때문입니다. 형식 연역이 일어나는 방식을 확실히 이해해야야 효과적인 프로그래밍을 할 ..

프로그래밍, 귀찮으면 지는 것이다.

오래 전 부터 프로그래밍을 하면서 제가 가장 많이 되새기는 말이 하나 있다. 그것은 바로 '귀찮으면 지는 것이다.' 입니다. Clean Code, Clean Corder, Code Complete, 소프트웨어 장인 등등... 프로그래머의 코딩 정신, 코딩 기법, 직업 정신 등의 중요성을 알려주는 책들을 봐와서 익히 이를 알고 넘칩니다. 그러나, 실제 코딩 작업을 할때 유혹에 빠지기 쉽다. 바로 앞에 지금길이 보이고 아주 달콤 합니다. 이미 구현은 되었고 코드는 잘 돌아 갑니다. 그리고, 이것 말고도 해야할 일이 많습니다. 아.... 고민을 하게 되죠. 분명 이 부분은 구조화가 안되었거나 중복 코드이거나 가독성이 떨어 지거나 의도가 명확히 전달되지 않고나 등등... 수정해야 할 것들이 보입니다. 이때 귀찮..

피, 땀, 픽셀

어느 나라든 게임 개발은 정말이지 힘든 과정인가 봅니다. 저 또한 여러 게임들을 개발하고 서비스 하면서 여러 고난의 과정들을 격어온 경험이 있어서 너무 공감하며 재미 있게 이 책을 읽었네요. 명작을 만든 게임 개발사의 개발팀들이 얼마나 열정적으로 원하는 게임을 만들기 위해 노력하는지 느낄 수 있어서 좋았어요. 책 제목 그대로 피, 땀으로 픽셀 들이 만들어 졌네요. 기억에 남는 내용이 두 가지를 소개하고 싶어요. 첫 번째는 디아블로3의 램덤의 함정이 예요. 핵&슬래시 게임은 주로 랜덤 옵션을 채용하고 있고 더 좋은 옵션이 붙은 아이템을 얻기 위해 같은 던전을 수 없이 반복 플레이를 하게 되지요. 디아블로3 서비스를 하던 도중 개발자는 이 사실을 깨닫게 되었다고 해요. '랜덤은 유저를 귀찮게 하기 위해서 있..

독서 리뷰 2020.08.02