프로그래밍 언어 64

<memory> smart pointer

smart pointer 스마트 포인터는 헤더 파일의 std namespace에 정의된다. smart pointer는 포인터처럼 행동하는 클래스 객체이지만, 몇 가지 추가 기능을 지닌다. 이번 게시물에서는 예시를 통해 동적 메모리 대입을 관리하기 위한 스마트 포인터 템플릿에 대하여 알아볼 것이다. 가령 어떠한 함수가 원시 포인터를 사용한다고 가정하면, 마지막에 delete 구문을 빼먹었거나, 혹은 delete 구문 전에 오류가 나면 대입된 메모리가 해제되지 못한다. 지역 변수는 스택 메모리부터 삭제된다. 그래서 포인터가 차지하고 있던 메모리가 해제되고 이때, 포인터가 지시하는 메모리도 함께 해제된다면 좋을 것이다. 이러한 과정을 거치기 위해서는 포인터의 수명이 다했을 때 프로그램이 어떤 추가 조치를 취해..

volatile

volatile 란? 하드웨어에 의해 프로그램에서 수정할 수 있는 개체를 선언하는 데 사용할 수 있는 형식 한정자이다. volatile declarator; 일반적으로 volatile은 컴파일러 최적화를 제한하는 용도로 사용한다. 컴파일러는 훌륭하게 최적화하지만, volatile를 사용해서 최적화를 제한해야 하는 상황이 있다. 즉, volatile int t 구문은 변수 t의 값은 프로그램을 수행하는 어느 순간에나 외적인 요인에 의해 값이 변할 수 있음을 컴파일러에게 알려 주어, 컴파일러가 변수 t의 값을 사용할 때 주의하도록 만든다. (주로 하드웨어를 제어하는 프로그램에서 발생하는데, 변수가 특정 하드웨어의 레지스터나 포트를 가리키는 겨웅에 사용한다) 특히 volatile로 정의된 변수는 레지스터에 할..

포인터

포인터 포인터란? 포인터는 개체의 메모리 주소를 저장하는 변수이다. 포인터는 세 가지 기본 목적으로 C 및 C++에서 광범위하게 사용된다. 힙에 새 개체를 할당하려면 함수를 다른 함수에 전달하려면 배열 또는 기타 데이터 구조의 요소를 반복한다 원시포인터 원시 포인터란( = raw pointer)? 원시 포인터( = raw pointer )는 스마트 포인터와 같이 캡슐화 개체에 의해 수명이 제어되지 않는 포인터다. 원시 포인터는 즉, 값에 비포인터 변수의 주소를 할당하거나 nullptr을 할당할 수 있다. 값이 할당되지 않은 포인터는 임의 데이터가 포함이 된다. 포인터를 역참조하여 포인터가 가리키는 개체의 값을 검색하는 것 또한 가능하다. 멤버 엑세스 연산자는 개체의 멤버에 대한 엑세스를 제공한다. * 역..

부동소수점

부동 소수점 C / C++ , 자바와 같은 프로그래밍 언어에는 수를 표현하기 위해 크게 두 가지 타입을 제공한다. 바로 정수 타입과 부동소수점 타입이다. 부동소수점타입과 정수타입을 나누어 놓은 이유는 매우 간단하다. 부동소수점은 실수를 완벽하게 표현할 수 없다. 사실 정수조차 제대로 표현하지 못한다. 떄문에 본래 목적의 일부분만을 나타낼 뿐이다. 부동소수점은 아주 작은 수와 아주 큰 양수를 표현하기 위해 도입되었다. 고정소수점과 부동소수점 부동소수점이란 실수를 표현할 때 소수점의 위치를 고정하지 않은 것을 말한다. 고정소수점은 나타낼수 있는 범위가 무척 한정된다. 그에 비해서 부동소수점은 고정소수점보다 훨씬 넓은 범위의 수를 표현할 수 있는 장점이 있다. 그래서 프로그래밍에서 실수를 표현할 때는 부동소수..

포인터 & 함수 포인터 & 깊은 복사 & 얕은 복사 & 생성자 & 오버로딩 & explicit & 형변환 연산자 & R-value , L-value

포인터 지금까지 변수 선언으로 메모리에 공간을 확보하고, 그곳을 데이터를 넣고 꺼내 쓰는 공간으로 사용했다. 변수명은 그러한 메모리 공간을 식별할 수 있는 이름이었다. 그러나 변수는 선언된 블록({}), 함수 내부로 사용이 제한되어 있다. 같은 변수명을 사용했다 하더라도 블록이나 함수가 다르면 별도의 저장 공간을 확보하므로 전혀 다른 변수로 사용되는 것이다. 그래서 사용 범위를 벗어난 경우도 데이터를 공유할 수 있는 새로운 방법이 포인터 개념이다. 메모리의 주소 메모리라는 것은 우리가 데이터를 넣고 꺼내 쓰는 공간으로, 그 위치를 식별할 수 있어야 한다. 프로그램은 사용하는 메모리의 위치를 주소 값으로 식별할 수 있다. 메모리의 위치를 식별하는 주소 값은 바이트 단우로 구분된다. 이 값은 0부터 시작하고..

템플릿의 특수화

암시적 구체화 암시적 구체화를 사용하는 이유는 말 그대로 암시적인 제한성 때문인데, 즉 사용하기를 원하는 데이터형을 나타내는 하나 또는 그 이상의 객체를 선언하기 때문이다. ArrayTP stuff; // 암시적 구체화 컴파일러는 객체가 요구될 때까지 그 클래스의 암시적 구체화를 생성하지 않는다. ArrayTP *pt; // 포인터, 아직 객체가 필요 없다. pt = new ArrayTP ; // 이제 객체가 요구된다. 두 번째 구문은 컴파일러에게 하나의 클래스 정의와, 그 정의에 따라 생성되는 하나의 객체를 생성하라고 지시한다. 명시적 구체화 키워드 template을 사용하여 클래스를 선언하고, 사용하려는 데이터형을 나타냈을 때, 컴파일러는 명시적 구체..

복사 생성자 & 복사 대입 연산자 & explicit & extern

explicit 키워드는 자신이 원하지 않은 형변환이 일어나지 않도록 제한하는 키워드이다. extern 키워드는 전역 변수, 함수 또는 템플릿 선언에 적용할 수 있다. extern 키워드는 컨텍스트(문맥)에 따라 네 가지 의미가 있다. 1. 전역 const 변수가 아닌 선언에서 변수 또는 함수가 다른 변환 단위에 정의되도록 지정한다. 변수가 정의된 파일을 제외한 모든 파일에 extern적용해야 한다. 2. const 변수 선언시, 변수에 extern 링크가 있음을 명시해야한다. 모든 선언된 파일에서 extern 은 반드시 선언되어야한다(Global const 변수는 기본적으로 내부 연결을 가진다.) 3. c언어에서의 extern은 한정자 또는 블록의 여러 함수 선언에 적용될 수 있다. 4. 템플릿 선언 ..

C++ STL Pair & Map

Pair Pair 란? pair 클래스는 사용자가 지정한 2개의 타입의 데이터를 저장하는 데 사용한다. 서로 연관된 2개의 데이터를 한 쌍으로 묶어서 다룰 때 사용하면 편리하다. 만약 pair 클래스를 사용하지 않고 코드를 짜야 한다면, 서로 연관된 2개의 데이터를 다룰 때, 구조체를 따로 정의해야 한다. 여간 번거로운 일이 아니기에 pair 클래스를 이용함으로써 서로 다른 2개의 연관된 2개의 데이터를 편리하게 관리가 가능하다. Pair의 헤더파일 pair 클래스는 #include 라는 헤더파일에 존재하는 STL이다. 그러나 다음 헤더파일들은 utility 헤더 파일을 포함하는 헤더 파일이다. #include // utility 헤더파일이 포함됨. #include // utility 헤더파일이 포함됨...

C++ STL) deque란?

deque( double ended queue ) 양쪽에서 끝나는 que(큐)를 줄여서 '데크'라고 불린다. stack의 경우엔 최상단에서 삽입, 삭제가 일어나지만, queue같은 경우는 한쪽에서 삽입, 반대쪽에서 삭제가 일어난다. (한쪽 입구에서 삽입, 삭제 중 하의 기능만 가능) deque 의 클래스는 선형 배열로 지정된 형식의 요소를 정렬하고 벡터와 같이 모든 요소에 대한 빠른 임의 액세스를 허용하고 컨테이너 뒷면에서 효율적인 삽입 및 삭제를 허용하는 시퀀스 컨테이너의 클래스 템플릿이다. 이러한 특성은 스택과 큐를 합친 기능으로 모든 입구에서 삽입 삭제가 가능하다. 구조 stack의 경우엔 LIFO(Last In First Out) deck의 경우엔 FIFO(First In First Out) de..

OBB 충돌

OBB 충돌 체크 알고리즘 설명이다. 이 설명은 벡터를 다룬다. 벡터와 벡터의 내적을 모르면 이해하기가 어려울 수 있다. AABB와 OBB는 직사각형 모양의 Bounding Box를 이용해 객체들이 충돌했는지를 판단한다. AABB는 Axis Aligned Bounding Box의 약자로, 축 방향으로 정렬된 경계 경계 상자(Bounding Box)를 뜻한다. 2차원으로 생각했을 때, 모든 변이 x, y 축에 평행한 직사각형을 경계 상자로 정해 충돌 체크를 한다. 반면, OBB는 Oriented Bounding Box의 약자로, 방향성이 있는 경계 상자(Bounding Box)를 뜻합니다. 2차원으로 생각했을 때, 회전이 있는 (회전이 된) 도형을 경계 상자로 정해 충돌 체크를 합니다. (이 글에서는 2차..