목록전체 글 (162)
개발하는 리프터 꽃게맨입니다.
Pivot 주 혹은 Pivot Block (이하 피봇) 이라는 것은 RTS (Reactive Training System) 이라하는 훈련 메소드에서 등장하는 개념입니다. 흔히 말하는 '디로드'와 목적을 어느정도 공유하며 대체하여 진행할 수 있습니다. 피벗을 단순히 디로드의 한 형태로 혼동하거나, 이런저런 운동 다 때려박아서 수행하는 경우가 많은데 피벗 블록을 단순 디로드로 시작하는 것은 좋으나, 더 나아가서 피봇 블록의 목표가 무엇인지, 디로드와 어떻게 다른지에 이해하고 적용시키면 더 좋은 결과가 있을 겁니다. 피봇의 목표는 디로드와 동일하게 피로를 감소시키는 것입니다. 긴 기간의 볼륨 축적, 피로토 피크에 도달하는 훈련 블록을 수행한 뒤, 혹은 대회에 나간 후에는 피로도를 감소시킬 수 있는 일련의 훈련..
template class Iterator { public: Iterator(T* item) : _item(item) {} public: T* operator++() { return ++_item; } T* operator--() { return --_item; } T* operator+(int idx) { return _item + idx; } T* operator-(int idx) { return _item - idx; } int& operator*() { return *_item; } int& operator->() { return *_item; } bool operator==(const Iterator& other) const { return _item == other._item; } bool o..

C++ 예외 처리 C++ 에는 예외처리를 지원하긴 하지만 엄청 중요하게 다루지는 않습니다. 예외처리를 꼼꼼하게 하기는 어려울 뿐더러 예외처리는 속도가 느리기 때문이죠. 실제로 예외처리 구문에 대한 디스어셈블리를 살펴보면 코드가 엄청 많이 생성된 것을 볼 수 있습니다. C++가 속도를 중요시하는 언어인 만큼 예외 처리보다는 assert 나 if 문으로 처리하는 것이 가독성면에서나 속도면에서나 이득이라는 것이죠. 프로그래밍하면서 가장 많이 발생하는 오류는 범위 이탈(out of range)와 nullptr 참조겠죠? 이들은 모두 if 한 줄로 처리 가능합니다. 동적 할당시 메모리 부족 문제도 if 문으로 처리가 가능하구요. 그래서 대부분의 상황에서는 예외처리는 불필요할 뿐더러, 에러코드를 사용하는 방법이 더..

static 키워드 static이 앞에 붙는 변수나 함수는 어떤 객체에 소속되어 있는 것이 아니라 프로그램이 시작되면 독립적인 메모리를 차지한다는 특징이 있습니다. static 키워드는 변수, 클래스의 멤버 변수, 클래스의 멤버 함수에 붙일 수 있으며 저는 '접근이 제한적인 전역 변수'라고 부릅니다. 실제로 전역 변수와 메모리를 차지하는 형태가 비슷합니다. 메모리에는 코드, 데이터, 힙, 스택 총 4개의 영역이 존재하는데요 static 변수, 함수와 전역 변수는 동일하게 데이터 영역에 할당됩니다. 그런데 전역 변수와 다른 점은 전역 변수는 어디에서나 접근이 가능하다는 특징이 있지만 static 키워드가 붙은 변수나 함수는 '제한된 범위'에서만 접근이 가능합니다. 하나의 블럭, 하나의 네임스페이스, 하나의..
함수 호출의 단계 함수를 정의하고 컴파일하면, 함수는 기본적으로 메모리의 '코드 섹션'에 저장되고 알맞은 고유의 주소를 가집니다. 그리고 함수 호출 시에는 스택에 함수의 주소를 올려 함수의 본체(body)를 찾아 실행하는 단계를 거치게 되죠. 함수 정의와 함수 호출에는 생각보다 오버헤드가 조금 있습니다. 1) 함수를 사용하기 위해 기존 레지스터에 들어있던 값을 스택에 푸시 2) 현재 PC(Program Counter) 값을 스택에 푸시 3) 함수 주소로 PC값을 변경하여 점프 4) 함수 실행 5) 기존 PC값과 레지스터 값을 스택에서 팝 하여 복구 이런 단계 때문에 함수 호출은 기본적으로 코드를 쌩으로 사용하는 것보다는 속도가 느리다는 단점이 있습니다. 그래서 '재귀'라는 알고리즘 메커니즘이 속도가 느리..