2013년 10월 13일 일요일

set과 multiset

능력

  • 자동정렬(바이너리 트리가 좋은 성능을 보장,로그 복잡도)
  • 직접적인 원소 액세스를 허락하지 않는다.
  • 수정하려면 원소를 제거하고, 새로운 값으로 변경된 새로운 원소를 삽입
  • 반복자를 통하여 간접적으로 액세스하는 것 또한 제한을 받는다. 반복자의 측면에서 본다면 모든 원소의 값은 상수값이다.


특별한 검색 함수들
set과 multiset은 빠른 검색을 위해서 최적화 되어 있다.
따라서 이들은 특별한 검색 함수들을 제공한다
이 함수들은 알고리즘과 동일한 이름을 가질 뿐 성능적인 측면에서 본다면 전혀 다르다.
사용자는 반드시 이 버전의 함수들을 이용해야 한다.
이 버전의 함수들은 로그 복잡도를 보장하지만 알고리즘의 함수들은 선형 복잡도를 보장한다.

count(elem)
elem의 값을 가지는 원소의 개수를 반환

find(elem)
elem의 값을 가지는 첫 번째 원소의 위치를 반환한다. 만약 존재하지 않는다면 end()를 반환

lower_bound(elem)
elem의 값보다 크거나 같은 값을 가지는 원소의 위치를 반환

upper_bound(elem)
elem의 값보다 큰 값을 가지는 원소의 위치를 반환

equal_range(elem)
정렬된 상태를 깨트리지 않고 elem이 삽입될 수 있는 첫 번째 위치와 마지막 위치를 반환

2013년 8월 6일 화요일

자동 기억 존속 시간, 정적 기억 존속 시간, 동적 기억 존속 시간

C++는 세 가지 유형으로 데이터를 저장한다.
이 세 가지 유형은 메모리에 데이터를 존속시키는 시간에서 차이가 난다.

1. 자동 기억 존속 시간(automatic storage duration)
함수 매개변수를 포함하여, 함수 정의 안에 선언된 변수는 자동 기억 존속 시간을 가진다.
그들은 프로그램 실행이 그들을 정의하고 있는 함수나 블록 안으로 들어갈 때 생성된다.
그리고 그들에게 할당된 메모리는, 프로그램 실행이 해당 함수나 블록을 떠날 때 해제된다.
C++는 두 종류의 자동 변수를 가진다.

2. 정적 기억 존속 시간(static storage duration)
함수 정의의 바깥에서 정의된 변수 또는 키워드 static을 사용하여 정의된 변수는, 정적 기억
존속 시간(static storage duration)을 가진다. 그들은 프로그램이 실행되는 전체 시간 동안 존속한다. C++는 세 종류의 정적 변수를 가진다.

3. 동적 기억 존속 시간(dynamic storage duration)
new 연산자를 사용하여 할당된 메모리는, delete 연산자로 해제되거나 프로그램이 종료할 때 까지, 둘 중 어느 것이 먼저 일어날 때 까지 존속한다. 이 메모리는 동적 기억 존속 시간(dynamic storage duration)을 가진다. 때로는 이 메모리를 자유 공간(free store)이라 부른다.

2013년 7월 22일 월요일

Big Endian 과 Little Endian

Big Endian 과 Little Endian
이상하게 들리겠지만, 정수들에 대해 2진 표현을 사용하는 서로 다른 컴퓨터 플랫폼들이, 동일한 수를 서로 다르게 나타낼 수 있다. 예를 들어, Intel 기종의 컴퓨터들은 Little Endian 방식으로 바이트를 저장한다. 그러나 Motorola 컴퓨터, RISC 기반의 MIPS 컴퓨터, DEC Alpha 컴퓨터 등은 Big Endian 방식으로 바이트를 저장한다.
(RISC 기반의 MIPS 컴퓨터와 DEC Alpha 컴퓨터는 두 저장 방식 중 어느 한 가지를 선택할 수 있다.)

Big Endian과 Little Endian이라는 용어는 "Big End In"과 "Little End In"을 의미한다고 생각 할 수 있다. 이들은 메모리의 한 워드(word)에 바이트들이 저장되는 순서를 설명하는 용어이다.
Little Endian 저장 방식을 사용하는 Intel 컴퓨터는 낮은 바이트가 먼저 저장된다. 즉, 16진수 0xABCD는, 메모리에 0xCD 0xAB의 순서로 저장된다. 그와 반면에 Big Endian 저장 방식을 사용하는 Motorola 시스템은, 동일한 값을 그와 반대 순서로 저장한다. 따라서 16진수 0xABCD, 메모리에 0xAB 0xCD의 순서로 저장된다.

조나단 스위프트의 책 < 걸리버 여행기 >가 이 용어들의 원천적인 소스이다. 스위프트는, 소인국 릴리퍼트에서 논쟁하기 좋아하는 두 정치적 당파 즉, 달걀의 둥근 부분을 깨야 한다고 주장하는 Big Endian들과 달걀의 뾰족한 부분을 깨야 한다고 주장하는 Little Endian들을 만들어 냄으로써, 많은 정치적 논쟁의 비합리성을 풍자했다.

소프트웨어 엔지니어는 자신이 작성하는 프로그램을 동작시킬 플랫폼에서 하나의 워드가 어떤 순서로 저장되는지 알고 있어야 한다. 무엇보다도, 그것은 네트워크를 통해 전송받은 데이터를 해석하는 데 영향을 주고, 2진 파일에 데이터가 저장되는 방식에 영향을 준다. 앞의 예제에서, 2바이트 메모리 패턴인 0xABCD는, Littme Endian 시스템에서 10진수 52651로 해석된다. Big Endian시스템에서 이것은 10진수 43981로 해석된다.

출처 - C++기초플러스 5판

x86 프로세서는 리틀 엔디언 순서로 메모리에서 데이터를 저장하고 꺼낸다.
이 순서에서는 변수의 최하위 바이트가 변수의 (최하위의)시작 주소에 저장된다.
출처 - x86 프로세서를 위한 어셈블리언어

2013년 7월 8일 월요일

D3DXMatrixRotationYawPitchRoll( yaw, pitch, roll )



D3DXMatrixRotationYawPitchRoll( yaw, pitch, roll )

yaw, pitch, roll 의 단어들은 무슨 뜻일까?

Normal axis (yaw) > 수직축 or Y축






Lateral axis (pitch) > 가로축 or X축











Longitudinal axis (roll) > 세로축 or Z축



출처
http://en.wikipedia.org/wiki/Aircraft_principal_axes



참고할만한 사이트
http://blog.naver.com/mirzzz79/110014895772

2013년 6월 21일 금요일

GetMessage와 PeekMessage

윈도우지 프로그램은 사용자가키보드를 두드리고 있거나 마우스를 굴리고 있지 않는 경우 대부분
GetMessage에서 다음 메시지를 기다리고 있다.
이 노는 시간에 다른 프로세스가 CPU를 쓸 수 있도록 양보하는데 GetMessage의 이런 특성 때문에
멀티 태스킹이 부드럽게 이루어지는 것이다.

만약 메시지 루프가 무한 루프를 돌며 끊임없이 메시지 큐를 감시하기만 한다면 CPU는 한없이
바쁘기만 하겠지만 GetMessage가 적당히 양보를 하기 때문에 CPU가 쉬어갈 시간이 있는 것이다.
그래서 GetMessage 함수는 멀티 태스킹의 핵심 함수이며 대부분의 응용 프로그램은 GetMessage에서 대기하면서
한가롭게 놀고 있는 셈이다.
GetMessage 함수의 주요한 세가지 특징을 요약하면 1) 제거한다. 2) 대기한다. 3) 양보한다. 로 정리할 수 있다.

이렇게 GetMessage에서 놀고 있는 시간을 데드 타임(dead time)이라고 한다.
데드 타임을 잘 활용하면 에니메이션이나 기타 틈틈이 해야 할 일을 다른 작업 시간에 영향을 주지 않고도 할 수 있다.
그런데 문제는 GetMessage 함수가 메시지를 받기 전에는 절대로 리턴하지 않기 때문에 데드 타임을 활용할 수 없다는 점이다.
이때는 GetMessage 함수를 대신 다음 함수를 사용한다.

BOOL PeekMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax,
UINT wRemoveMsg );

PeekMessage는 GetMessage의 세 가지 특징과 완전히 반대되는 성질을 가지는데 메시지 큐에서 메시지를 꺼내거나
검사하되 메시지가 없더라도 즉각 리턴한다. 즉, 대기하지 않으며 따라서 양보도 할 줄 모른다. 이때 리턴값이
TRUE이면 메시지가 있다는 뜻이며 FALSE 이면 메시지가 없다는 뜻이다.

wRemoveMsg 플래그는 메시지가 있을 경우 이 메시지를 큐에서 제거할 것인가 아닌가를 지정하는데 PM_REMOVE 이면
GetMessage처럼 메시지를 큐에서 제거하지만 PM_NOREMOVE 이면 제거하지 않을 수도 있다. 즉, 슬쩍 엿보기만 하는 것이
가능한데 그래서 이름이 Peek이다. PM_NOREMOVE 플래그를 사용하면 메시지 큐에 어떤 메시지가 있는지 검사만 해 볼 수
있다. PeekMessage는 메시지가 있든 없든 즉시 리턴하므로 메시지가 없을 때 다른 일을 할 수 있다.
즉, 데드 타임을 활용할 수 있다.

PeekMessage 함수는 메시지 루프 밖에서도 사용할 수 있다. 단순히 원하는 메시지가 있는지 검사해 보는 용도로
쓸 수 있고 시간이 좀 오래 걸리는 작업중에 다른 메시지를 처리할 기회를 주기 위해 쓸수도 있다.

요약
GetMessage
메시지 큐에 메시지가 있다면 즉각 리턴, 메시지 제거
메시지가 없다면 대기(다른 프로세스가 CPU를 쓸수 있도록 양보 = 멀티 태스킹)
메시지를 받기 전에는 절대로 리턴하지 않기 때문에 데드 타임을 활용할 수 없다.(  Blocking )

PeekMessage
메시지 큐에서 메시지를 꺼내거나 검사하되 메시지가 없더라도 즉각 리턴한다.
즉, 대기하지 않으며 따라서 양보도 할 줄 모른다.
메시지가 있든 없든 즉시 리턴하므로 메시지가 없을 때 다른 일을 할 수 있다.(=데드 타임을 활용할 수 있다. = NonBlocking)