obb

Programing/etc 2012. 5. 22. 18:35 |

struct ST_OBB // OBB구조체
{
     D3DXVECTOR3 vCenterPos; // 상자 중앙의 좌표
     D3DXVECTOR3 vAxisDir[3]; //상자에 평행한 세 축의 단위벡터
     float  fAxisLen[3]; // 상자의 평행한 세 축의 길이 fAxisLen[n]은 vAxisDir[n]에 각각 대응한다.

};

 

 

 // ST_OBB 구조체 두개의 포인터를 각각 인자로 받아, 두 OBB의 충돌 여부를 체크하는 함수

// 충돌 시 TRUE리턴, 충돌하지 않으면 FALSE 리턴

BOOL CheckOBBCollision( ST_OBB* Box1, ST_OBB* Box2 )
{
     double c[3][3];
     double absC[3][3];
     double d[3];

     double r0, r1, r;
     int i;

     const double cutoff = 0.999999;
     bool existsParallelPair = false;

     D3DXVECTOR3 diff = Box1->vCenterPos - Box2->vCenterPos;

 

     for( i = 0 ; i < 3 ; ++i )
     {
          c[0][i] = D3DXVec3Dot( &Box1->vAxisDir[0], &Box2->vAxisDir[i] );
          absC[0][i] = abs( c[0][i] );
          if( absC[0][i] > cutoff )
               existsParallelPair = true;
     }
     d[0] = D3DXVec3Dot( &diff, &Box1->vAxisDir[0] );
     r = abs( d[0] );
     r0 = Box1->fAxisLen[0];
     r1 = Box2->fAxisLen[0] * absC[0][0] + Box2->fAxisLen[1] * absC[0][1] + Box2->fAxisLen[2] * absC[0][2];

     if( r > r0 + r1 )
          return FALSE;

 

     for( i = 0 ; i < 3 ; ++i )
     {
          c[1][i] = D3DXVec3Dot( &Box1->vAxisDir[1], &Box2->vAxisDir[i] );
          absC[1][i] = abs( c[1][i] );
          if( absC[1][i] > cutoff )
               existsParallelPair = true;
     }
     d[1] = D3DXVec3Dot( &diff, &Box1->vAxisDir[1] );
     r = abs( d[1] );
     r0 = Box1->fAxisLen[1];
     r1 = Box2->fAxisLen[0] * absC[1][0] + Box2->fAxisLen[1] * absC[1][1] + Box2->fAxisLen[2] * absC[1][2];

     if( r > r0 + r1 )
          return FALSE;

 

     for( i = 0 ; i < 3 ; ++i )
     {
          c[2][i] = D3DXVec3Dot( &Box1->vAxisDir[2], &Box2->vAxisDir[i] );
          absC[2][i] = abs( c[2][i] );
          if( absC[2][i] > cutoff )
               existsParallelPair = true;
     }

     d[2] = D3DXVec3Dot( &diff, &Box1->vAxisDir[2] );
     r = abs( d[2] );
     r0 = Box1->fAxisLen[2];
     r1 = Box2->fAxisLen[0] * absC[2][0] + Box2->fAxisLen[1] * absC[2][1] + Box2->fAxisLen[2] * absC[2][2];

     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( D3DXVec3Dot( &diff, &Box2->vAxisDir[0] ) );
     r0 = Box1->fAxisLen[0] * absC[0][0] + Box1->fAxisLen[1] * absC[1][0] + Box1->fAxisLen[2] * absC[2][0];
     r1 = Box2->fAxisLen[0];

     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( D3DXVec3Dot( &diff, &Box2->vAxisDir[1] ) );
     r0 = Box1->fAxisLen[0] * absC[0][1] + Box1->fAxisLen[1] * absC[1][1] + Box1->fAxisLen[2] * absC[2][1];
     r1 = Box2->fAxisLen[1];

     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( D3DXVec3Dot( &diff, &Box2->vAxisDir[2] ) );
     r0 = Box1->fAxisLen[0] * absC[0][2] + Box1->fAxisLen[1] * absC[1][2] + Box1->fAxisLen[2] * absC[2][2];
     r1 = Box2->fAxisLen[2];

     if( r > r0 + r1 )
          return FALSE;

 

     if( existsParallelPair == true )
          return TRUE;

 

     r = abs( d[2]*c[1][0] - d[1]*c[2][0] );
     r0 = Box1->fAxisLen[1] * absC[2][0] + Box1->fAxisLen[2] * absC[1][0];
     r1 = Box2->fAxisLen[1] * absC[0][2] + Box2->fAxisLen[2] * absC[0][1];
     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( d[2]*c[1][1] - d[1]*c[2][1] );
     r0 = Box1->fAxisLen[1] * absC[2][1] + Box1->fAxisLen[2] * absC[1][1];
     r1 = Box2->fAxisLen[0] * absC[0][2] + Box2->fAxisLen[2] * absC[0][0];
     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( d[2]*c[1][2] - d[1]*c[2][2] );
     r0 = Box1->fAxisLen[1] * absC[2][2] + Box1->fAxisLen[2] * absC[1][2];
     r1 = Box2->fAxisLen[0] * absC[0][1] + Box2->fAxisLen[1] * absC[0][0];
     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( d[0]*c[2][0] - d[2]*c[0][0] );
     r0 = Box1->fAxisLen[0] * absC[2][0] + Box1->fAxisLen[2] * absC[0][0];
     r1 = Box2->fAxisLen[1] * absC[1][2] + Box2->fAxisLen[2] * absC[1][1];
     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( d[0]*c[2][1] - d[2]*c[0][1] );
     r0 = Box1->fAxisLen[0] * absC[2][1] + Box1->fAxisLen[2] * absC[0][1];
     r1 = Box2->fAxisLen[0] * absC[1][2] + Box2->fAxisLen[2] * absC[1][0];
     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( d[0]*c[2][2] - d[2]*c[0][2] );
     r0 = Box1->fAxisLen[0] * absC[2][2] + Box1->fAxisLen[2] * absC[0][2];
     r1 = Box2->fAxisLen[0] * absC[1][1] + Box2->fAxisLen[1] * absC[1][0];
     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( d[1]*c[0][0] - d[0]*c[1][0] );
     r0 = Box1->fAxisLen[0] * absC[1][0] + Box1->fAxisLen[1] * absC[0][0];
     r1 = Box2->fAxisLen[1] * absC[2][2] + Box2->fAxisLen[2] * absC[2][1];
     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( d[1]*c[0][1] - d[0]*c[1][1] );
     r0 = Box1->fAxisLen[0] * absC[1][1] + Box1->fAxisLen[1] * absC[0][1];
     r1 = Box2->fAxisLen[0] * absC[2][2] + Box2->fAxisLen[2] * absC[2][0];
     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( d[1]*c[0][2] - d[0]*c[1][2] );
     r0 = Box1->fAxisLen[0] * absC[1][2] + Box1->fAxisLen[1] * absC[0][2];
     r1 = Box2->fAxisLen[0] * absC[2][1] + Box2->fAxisLen[1] * absC[2][0];
     if( r > r0 + r1 )
          return FALSE;

 

     return TRUE;
}

'Programing > etc' 카테고리의 다른 글

tinyxml 문제점??  (0) 2013.01.08
킹스툴즈 2008 ( 비주얼스튜디오 문서화 )  (0) 2012.06.12
소멸자를 가상함수로 해야 하는 이유  (0) 2012.05.21
xml 장점 단점  (0) 2012.05.21
순수, 가상함수 차이 활용  (0) 2012.05.21
Posted by 부우산사나이
:

가상함수를 사용하지 않는다면..

여러 파생클래스를 가지는 CTimekeeper라는 기본 클래스가 있다고 가정해보자.

이 클래스에 getTimeKeeper라는 팩토리함수( 새로 생성된 파생 클래스 객체에 대한 기본 클래스 포인터 반환 함수 ) 을 만들었다면,

   CTimeKeeper* ptk = getTimeKeeper();     // CTimeKeeper클래스 계통으로부터 동적으로 할당된 객체를 얻는다.

위와 같이 사용을 한뒤 삭제를 해야한다.

   delete ptk;

하지만 위와 같이 삭제를 할 경우 문제가 발생한다.

   1. getTimeKeeper함수가 반환하는 포인터가 파생 클래스객체에 대한 포인터이다.

  2. 이 포인터가 가르키는 객체가 삭제될 때는 기본 클래스 포인터를 통해 삭제된다.

  3. 결정적으로 기본 클래스에 들어있는 소멸자가 비가상 소멸자이다.( 기본 클래스( CTimeKeeper )의 소멸자가 비가상 소멸자라는 가정 하에 )

위와 같은 상황에선 파생클래스(상속받은)의 멤버들은 삭제되지 않고 소멸자도 실행되지 않는다. 

 

해결방법

가상 소멸자를 사용하면 된다.간단하다..

   ps. 가상 함수를 가진 클래스를 보면 거의 가상 소멸자를 사용해야한다.

 

가상함수 남발로 인한 문제점

클래스에 별도의 자료구조( 가상 함수 테이블 )이 들어가게 된다.

   ps. 가상 함수 테이블 : 가상 함수 테이블 포인터 배열 ( 프로그램 실행 중 주어진 객체에 대해 어떤 가상 함수를 호출해야 하는지 판단하는 정보 )

그로 인해 C 등의 다른 언어로 선언된 동일한 자료구조와 호환성이 없어지고 객체 자체의 크기도 커지게 된다.

   ps. 클래스에 가상 함수가 하나라도 들어 있는 경우에만 가상 소멸자를 사용한다.

 

 가상 소멸자가 없는 것들에 주의하자

 STL 컨테이너 타입 전부 ( vector, list, set 등 ), string클래스 등

이러한 것들을 상속하여 사용하지 않도록 주의 하도록 한다.

 

순수(pure)가상 소멸자

경우에 따라 순수 가상 소멸자를 두면 편리하게 사용할 수 있다.

   ps. 추상 클래스( 그 자체로는 자신 타입의 객체를 생성할 수 없는 )로 만들려고 하지만 마땅히 넣을 순수 가상 함수가 없을 경우 순수 가상 소멸자를 만든 다.

   class AWOV

   {

 public :

virtual ~AWOV() = 0;

   };

   주의점 : 반드시 순수 가상 소멸자의 정의를 해 두어야 한다.

 

 

 

* 다형성을 가진 기본 클래스에는 반드시 가상 소멸자를 선언해야 한다. 즉 어떤 클래스가 가상 함수를 하나라도 갖고 있으면, 이 클래스의 소멸자도가상 소멸자이어야 한다. 

* 기본 클래스로 설계되지 않았거나 다형성을 갖도록 설계되지 않은 클래스에는 가상 소멸자를 선언하지 말아야 한다. 

'Programing > etc' 카테고리의 다른 글

킹스툴즈 2008 ( 비주얼스튜디오 문서화 )  (0) 2012.06.12
obb  (0) 2012.05.22
xml 장점 단점  (0) 2012.05.21
순수, 가상함수 차이 활용  (0) 2012.05.21
STL Map  (0) 2012.05.21
Posted by 부우산사나이
:

xml 장점 단점

Programing/etc 2012. 5. 21. 12:19 |

간편성

일단 간편성이란, XML의 단순한 문법과 형식을 뜻합니다. Tagging과 tree구조라는 것만 잘 알면 XML구조의 전부를 이해했다고도 할 수 있지요. 그리고 XML파일은 텍스트 형식이기 때문에 컴파일도 필요하지 않은 아주 간편한 언어입니다.


호환성

유니코드로 작성되는 텍스트 형식이기 때문에, XML문서는 호환성도 매우 좋습니다. XML문서는 유니코드를 인식하는 모든 운영 체제 상에서 호환성 있는 문서가 됩니다.


확장성

확장성은 HTML언어와 비교하면 쉽게 이해하실 수 있습니다. HTML의 경우 정해져 있는 tag외의 다른 tag를 우리가 정의할 수 없습니다. 하지만 XML은 메타 언어이기 때문에 얼마든지 새로운 tag를 정의해서 사용할 수 있지요. 이것이 XML의 확장성입니다.


누구나 알 수 있는 Context 정보

XML문서는 data와 meta-data가 tag형식으로 동시에 저장됩니다. 따라서 누구나 쉽게 data와 meta-data를 구분할 수 있고, 따라서 쉽게 이해할 수 있는 구조를 가지고 있지요.


내용과 표현의 분리

또한 XML 문서 자체는 데이터의 표현을 어떤 식으로 할지 컨트롤 하지 않습니다. XML 문서가 다루는 것은 오직 데이터내용의 구조화이지요. 우리는 XSL같은 또 다른 언어를 사용하여 XML문서의 data를 표현하게 됩니다. 즉, data의 내용과 표현이 완전히 분리되어 있기 때문에 우리는 data를 좀더 쉽게 다룰 수 있게 됩니다.


데이터의 비교와 연산이 간편

Tree구조인 XML 문서는 데이터 검색 시에 비교, 연산 과정이 간단하기 때문에 원하는 결과를 더욱 빨리 얻게 할 수 있습니다.


네, 하지만 아직도 그리 와 닫지는 않을 겁니다. 왜냐하면 여러분이 실제로 XML을 많이 써보지 않았기 때문이죠. 그럼 한번 고수들의 경험담을 들어볼까요? 사실 저도 XML을 거의 써보지 않았기 때문에 인터넷에서 몇 가지를 퍼왔습니다.


 

 

단점

 

관리는 편해도
직접열어서볼때 난해한것도 있지
구조가 플밍에 맞춰져있어서
트리형태로 저장되니
직접 에디팅하기엔 좀 무리지
데이터 + 구조 = xml
덕분에 용량커지고 내부 텍스트 복잡도가 올라가서 데이터량이 많아지면 사람이 직접보기엔 힘듬

용량이 크다.

'Programing > etc' 카테고리의 다른 글

obb  (0) 2012.05.22
소멸자를 가상함수로 해야 하는 이유  (0) 2012.05.21
순수, 가상함수 차이 활용  (0) 2012.05.21
STL Map  (0) 2012.05.21
run-time error  (0) 2012.05.21
Posted by 부우산사나이
:

class AA 
{
public:
 virtual void Jaeho() = 0;  순수가상 함수
};

class A : public AA
{
public:
 virtual void Jaeho()  가상함수
 {
  printf ("나는 재호야\n");
 }
};

class B : public AA
{
public:
 virtual void Jaeho()
 {
  printf ("나는 진호야\n");
 }
};

int main()
{
 AA* jaeho = new A();
 AA* jinho = new B();
 AA* jjj = new B();

 jaeho->Jaeho();
 jinho->Jaeho();
 jjj->Jaeho();
 return 0;
}

 

순수 가상함수는 상속 받은 자식들이 꼭 정의해서 써먹어야 할때 써먹음 인터페이스같이 사용

가상함수는 오버라이드개념 자기에 맡게 내용 정의하면 됨

 

사용 예 )

 

액션일 경우

기본 baseaction이라는 클래스를 만들어

onStart() =0

onEnd()=0

onUpdate()=0

이런식으로 액션의 시작 끝 업데이트 순수 가상 함수를 만들어 놓은다

 

그다음 죽는액션 이동액션 공격액션등 baseaction을 상속 받아

onstart등 액션마다 다른 행동 할것을 코딩하면 된다.

 

'Programing > etc' 카테고리의 다른 글

obb  (0) 2012.05.22
소멸자를 가상함수로 해야 하는 이유  (0) 2012.05.21
xml 장점 단점  (0) 2012.05.21
STL Map  (0) 2012.05.21
run-time error  (0) 2012.05.21
Posted by 부우산사나이
:

# 일자: 2009-12-05 일곱째날

# 강좌: C# Programing

# 주제: 상속 기법(Overload, Override, Interface)

 

<Lecture>

1. OOP 구조

   객체1 - 객체2 - 객체3

   ☞ 각 객체는 구별, 존재, 고유역할 

 

2. OOP 작성순서

   0) 클래스(분류,구분) 작성

   1) 객체 형성

   2) 객체간 상호작용 시킴

 

3. OOP을 위한 선수학습

   1) 클래스 작성법

       (1) 기본적

       (2) 테크닉

            . 상속: overloading, overriding, interface

   2) 객체 생성법

   3) 객체간의 상호작용 시키는 방법

 

4. Over Load ()

   1) 의미

      - 과적, 많이 실려 있음, 같은 것이 많음

      - 메소드 관련

   2) 대상

      - 상속메소드

      - 단일 Class 내에서

   3) 단일 Class 내에 F라는 이름의 메소드 들이 Overload 됨

      - 메소드 관련(메소드 명이 같고 인자의 갯수와 배치가 다름)

      - Class A

        {

           public void F() {}

           public void F(int a) {}

           public void F(int a, string b) {}

         }

  

   4) 상속에서 F라는 이름의 메소드 들이 Overload 된 경우

      - Class 부모

        {

           public void F() {}

         }

      - Class 자식:부모

        {

           public void F(int a) {}

         }

   5) 생성자에 나타만 Overload

      - Class A

        {

           public A() {}

           public A(int a) {}

           public A(string a) {}

         }

      - MSDN reference

      

 

5. Override

   1) 의미

      - 교체, 대신

   2) 대상

      - 상속(반드시 상속에서만 발생됨)

   3) 기법

      (1) virtual

      (2) abstract

   4) virtual   ☞ 부모의 행동을 자식이 바꾸는거

      (1) 불완전하여 ambigous한 틀린 예

         

     

     ☞ 컴파일러를 헷깔리게 하죠. 부모랑 자식이랑 똑같으니까. 컴파일러에따라 에러를 주는 경

         우도 있고 에러 안주고 그냥 자식 불러야 할때 부모를 부르는 경우도 있어요. (csc.exe경우)

 

      (2) virtual을 사용한 올바른 예

       

    

    ☞ 컴파일러를 헷깔리지 않게 아주 잘해주었죠. virtual 과override 키워드의 힘

        특히 virtual에대한 override 를 써서 재정의 할지 말지는 선택적

 

      (3) 실행 코드

       

      

      (4) 실행 결과

          - 불완전하여 ambigous한 틀린 예

           

         -  virtual을 사용한 올바른 예

           

         ☞ 세번째 결과는 참조는 부모로 선언되었으나 실제 객체는 자식이다.

             부모가 아무리 자식을 가르키고 있다해도 자식객체니까 자식이 호출되죠!

             (부모가 아무리 정약결혼을 시켜도 결국 자식은 사랑하는 사람과 결혼하쟎아요♡)     

 

   5) abstract ☞ 부모가 어떤 행동을 할지 구체적으론 몰라서 실제 행동은 자식이 꼭 해야하는거

      (1) 의미

           ① abstract 메소드

                - abstract 키워드로 body가 없는 메소드

           ② abstract 클래스

               - 클래스 내부에 abstract 메소드를 1개 이상 소유한 클래스

               - 부모가 abstract 메소드여서 추가로 abstract메소드 없이 부모의 abstract 메소드의 body

                  를 구현 안한 클래스

      (2) 예제

           ① 추상화 클래스 선언 

             

           ② 추상화 클래스를 선언받은 일반 클래스 선언

              

           ③ 추상화 클래스를 선언받은 추상화 클래스 선언

              

           ④ 추상화 클래스를 선언받은 추상화 클래스를 선언받은 일반 클래스 선언

             

           ⑤ 추상클래스의 객체생성 과 추상메소드의 호출 

        

 

          * 예제1번의 오류화면

          

 

           ⑥ 실행결과

                   

 

   6) Interface ☞ 부모가 어떤 행동을 할지 몽땅 구체적으론 몰르는 것만 있는 경우

      (1) 의미

           ① interface

                - class에 모두 abstract 메소드만 오는 경우 class가 아닌 interface로 대체하고

                  abstract 메소드를 interface 메소드로 간단히 표시함

           ② interface 메소드

               - public이라고 안써도 무조건 public임

               - abstract를 안씀

               - body가 없음

      (2) 예제

           abstract class로 Unit class를 작성, interface로 Unit interface를 작성한 예제를 비교함

           결국 Unit를 사용하는 방법을 동일함

           ① Unit 선언 using interface

              

 

           ② Unit을 상속받는 마린 class 선언

              

 

           ③ Unit을 상속받는 시즈탱크 class 선언

             

 

           ④ Unit을 사용 using Unit 배열로 마린과 시즈탱크를 객체로 생성하여 한번에 동작시킴

          

         * 주의: 위의 Unit[]의 new는 객체 생성이 아니고 배열이니까 abstract class였어도 문제없음

       - MSDN reference

 

 

6. 다중상속

   1) 디자인

    

   2) 정의

       - 두개 이상의 class, abstract class, interface를 상속 받는 것

   3) 조건

       - Parent들은 class 나 abstract class가 최대 한개여야 함

   4) 주의사항

       - 완전과 불완전의 관계

        

       - 완전과 불완전 경우에 따른 결과

      

         

<Question>

1. 오버라이딩과 오버라이드의 차이점이 있남?

 

Posted by 부우산사나이
:

STL Map

Programing/etc 2012. 5. 21. 00:25 |

map 이 뭐길래 그럴까? perl에서 hash 배열인가? 하는것 아는 사람이 있을지 모르겠지만..

배열의 첨자가 숫자가 아닌 키워드로 인식하는것이다. 숫자가 들어가더라도 그것이 크기와는

상관없고 단지 키값만 되는것이다.

 

즉 키워드와 키워드가 매칭시킬수 있다는것이 map의 큰 장점이다.

 

map<string, info> data; 라고 선언을 한다면

data["seeper"]; data["abcd"]; 라는 표현이가능해진다.

 

map<int, info> data; 라고 선언을 한다면

data[3]; data[5]; ,등의 표현도 가능해진다.

여기서 data[4]를 선언하기전까지 data[4]는 존재하지 않는다.

 

물론 iterator를 이용해서 전체를 찾아볼수도 있다.

또한 key를 찾는 key를 만들어서 두가지의 인덱스로 데이터를 찾게 할수도 있을것이다.

활용범위는 config값이나 resource manager 등에서 쓸수 있다.

서버쪽에서는 아마도 로그인정보를 이렇게 관리하는것도 괜찮을것 같다.

(이 경우는 좀더 고민하긴 해야한다. 동접이 몇명이냐에 따라 또 달라질것이다.)

 

머리만 잘쓰면 map의 활용범위는 많을것 같다. ^^

그리고 STL은 포인터의 구조보다 일반적인 스트럭쳐나 단일 타입을 위해서

설계되었다. 물론 포인터를 사용할수 있지만 new와 delete는 개발자의 몫이된다.

따라서 메모리 누수가 일어날 확률이 높다.

특별한 경우가 아니고는 포인터를 사용하지 않는 것이 좋다.

[출처] STL : map|작성자 시퍼렁새

 

단점 삽입 삭제가 느리다

'Programing > etc' 카테고리의 다른 글

obb  (0) 2012.05.22
소멸자를 가상함수로 해야 하는 이유  (0) 2012.05.21
xml 장점 단점  (0) 2012.05.21
순수, 가상함수 차이 활용  (0) 2012.05.21
run-time error  (0) 2012.05.21
Posted by 부우산사나이
:

STL의 Vector와 List는 언듯 보기엔 비슷하지만 큰 차이점이 있다. 

 

Vector의 방식은 메모리 할당을 연속적으로 하고, List는 따로따로 할당을 한다.

따라서 Vector는 배열과 같은 방식으로 사용할 수 있지만 List는 그렇지 않다.

 

단순하게 놓고 본다면 Vector는 배열과 비슷하고 List는 Linked List와 비슷하다.

이제 여기서 발생하는 현상(?)들을 보자.

 

 1. 메모리 할당

Vector는 미리 일정크기의 메모리를 할당해 놓고 그 이상의 값들이 추가되면 새로운 더 큰 메모리를 할당한다.*1

List는 값을 넣을때마다 메모리를 할당하게 된다.

Vector는 메모리 할당을 매번 하지 않기 때문에 매번 할당하는 List보다 pushback이 빠르다.

중간에 추가하는 Insert의 경우 Vector는 배열을 계속 재구성 해야하기 때문에 속도가 느리다.

 

 

 2. 메모리 해제

Vector는 값을 삭제하더라도 메모리 해제를 하지 않는다. 심지어 Clear를 하더라도 메모리는 그대로 남게 된다.

반대로 List의 경우 변수가 해제 될때마다 메모리에서 해제하게 된다.

할당과 마찬가지로 해제또한 popback의 경우 vector가 훨씬 빠르다.

하지만 역시 중간에 값을 삭제하는 것은 List가 더 빠르다.

Vector는 변수들을 삭제할 때 메모리 해제가 되지 않는다. 심지어 Clear함수를 사용해도 메모리는 그대로 남아있다.

 

Vector의 메모리를 해제 하는 함수

Visual Studio 2010 버전 이상 (C++11)

값들의 개수에 맞춰 메모리를 다시 할당하는 함수로 shrink_to_fit() 맴버 함수가 있다.

Visual Studio 2008 버전 이하는 함수를 만들어야 함

template <class T>

void vector_clear(vector<T>& vecObj)

{

vector<T> tempObj;

tempObj.swap(vecObj);

}

* vector의 메모리를 해제해주는 것은 상당히 많은 시간을 소요하므로 특별한 경우만 사용해야한다.  capacity()맴버함수는 현재 할당된 크기를 반환 한다.

 

 3. 메모리 사용량

Vector의 경우 연속적인 주소에 할당 되므로 추가적인 linked list처럼 next의 주소등 다른 변수들을 가지고 있을 필요가 없다.

따라서 Vector가 list보다 적은 메모리를 사용한다. 하지만 Vector도 일정 크기 이상이 넘어가면 오류가 발생 한다.

(vector는 최대 크기가 정해져 있다. 32bit 내 컴퓨터 기준으로 10억개, max_size()맴버함수로 알 수 있다.)

 

 

** 정리

맨뒤에 추가 삭제가 일어나는 경우는 vector가 빠르며 메모리도 적게 먹는다.

따라서 순서와 상관없거나 순차적으로만 추가, 삭제되는 데이터는 vector를 쓰는게 좋다.

순서가 중요하여 리스트의 중간위치에 값이 추가, 삭제가 되는 경우 list를 사용하는 것이 좋다. (메모리는 더 먹지만 속도가 빠르다)

vector는 이제까지 사용했던 가장 많은 크기의 메모리를 사용하므로 주의해야한다.

 

 

실제 게임에서 활용

벡터

- 예를 들어서 액션 관련 정보가 있다.

   이 정보들은 바뀔 경우가 거의 없다.

   읽고 쓰면 되니 이런 경우는 벡터에 저장하면 될 듯 싶다.

리스트

-

'Programing > 자료구조' 카테고리의 다른 글

stl의 list 만들어 보기  (0) 2012.05.30
Big - O 표기법  (0) 2012.05.18
Posted by 부우산사나이
:

run-time error

Programing/etc 2012. 5. 21. 00:11 |

프로그램 실행 중에 일어나는 에러를 말한다.

 

예를 들어서 동적할당 된 오브젝트가 있는데 프로그램 돌아가는 도중

 

그 오브젝트의 함수를 실행하게 되는데 그 때 그 오브젝트가 비어 있으면

 

에러가 발생하게 된다. 이런 상황이 런타임 에러이다

'Programing > etc' 카테고리의 다른 글

obb  (0) 2012.05.22
소멸자를 가상함수로 해야 하는 이유  (0) 2012.05.21
xml 장점 단점  (0) 2012.05.21
순수, 가상함수 차이 활용  (0) 2012.05.21
STL Map  (0) 2012.05.21
Posted by 부우산사나이
:

http://blog.naver.com/0bloodwind0/20127908176

여기에 설명 잘되어 있음!!!

Posted by 부우산사나이
:

출처 : http://blog.naver.com/anjindago?Redirect=Log&logNo=150119261447

 

빅오 표기법이란?

어떤 하나의 함수의 복잡도를 정의하는 데 즐겨 사용하는 것.
간단히 말하자면 알고리즘이 처리할 자료집합의 크기가 성장함에 따라 알고리즘의 효율이
어떻게 변화하는지를 대략적이나마 추정하는 하나의 함수라고 정의 할 수 있다.


알고리즘의 복잡도를 표현하는 데 흔히 쓰이는 함수들이 몇 가지 있는데,
복잡도의 낮은 것부터 높은 순으로 나열해보자면
(상수), (log₂n), (n), (nlog₂n), n², n³, 2ⁿ 이라고 한다.


O(c)
빅 O 표기에서 c는 상수를 뜻한다.
상수 함수의 그래프는 항상 수평을 유지한다. 이는 알고리즘의 수행에 걸리는 시간이 자료집합의 크기에
상관없이 항상 동일하다는 뜻이다. 대체로 이런 함수들이 가장 빠른 것으로 간주된다.


O(log₂n)
로그 기반의 알고리즘은 자료의 크기에 의존적인 알고리즘들 중에서는 가장 효율적인 것으로 간주된다.
즉, 데이터가 추가되면 될수록 효율이 좋아지는 녀석이다.


O(n)
선형 함수라 불리며, 어떠한 알고리즘이 1000개의 항목을 20초안에 처리한다면, 2000개의 항목은
40초에 처리하게되는 자료의 크기와 직접적인 관계를 갖는 함수이다.


O(nlog₂n)
이 함수는 일반적인 정렬 알고리즘이 가져야 할 최소한의 복잡도로 간주된다.


O(n²)
자료가 증가함에 따라 급격히 커지기 때문에 대부분의 과제들에 비해 비효율적이라고 간주된다.
예를들어 1000개의 항목을 처리하는데 20초가 걸렸다면 2000개의 항목을 처리하기위해선 80초의
시간이 소요된다. 항목의 갯수가 2배증가하면 시간은 4배가 증가하는 셈이다.
일반적으로 어떤 알고리즘이 O(n²)이라면 일단 다른 알고리즘을 찾아보는 것이 더 낫다. (최대한 쓰지말자)
전형적인 예는  for 루프 안에 다른 for 루프가 내포된 형태이다.


O(n³)
1000개의 항목을 처리하는데 20초라면 2000개는 160초(8배)
위의 것보다 더 최악... 그냥 쓰지말자


O(2ⁿ )
흔히 기수 2 지수 함수라 부르며 항목 개수가 1 증가할 때마다 함수는 2배가 된다.
매우 비효율적이므로 피해야하는 알고리즘이다.


여러가지 복잡도들의 비교


복잡도

16

32

64

128

O(log n)

4

5

6

7

O(n)

16

32

64

128

O(nLog n)

64

160

384

896

O(n2)

256

17

68

273

O(n3)

68

546

74시간

24

O(2n)

18시간

136

5억년

--------

'Programing > 자료구조' 카테고리의 다른 글

stl의 list 만들어 보기  (0) 2012.05.30
STL Vector와 List 차이점  (0) 2012.05.21
Posted by 부우산사나이
: