블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2850)
Unity3D (893)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (189)
협업 (64)
3DS Max (3)
Game (12)
Utility (142)
Etc (99)
Link (34)
Portfolio (19)
Subject (90)
iOS,OSX (52)
Android (16)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (19)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday





2. codeproject(코드프로젝트) http://www.codeproject.com/

각종 오픈 소스/라이브러리를 다운받을 수 있음



3. c-sharpcorner(시샾코너) http://www.c-sharpcorner.com/Default.aspx

각종 오픈 소스/라이브러리를 다운받을 수 있음



4. Devpia(데브피아) http://www.devpia.com/CSharp.MAEUL

기초 강좌, 예제소스, 그리고 활발한 Q&A가 이뤄지는 국내 커뮤니티 싸이트




기초 강좌, 예제소스, 그리고 활발한 Q&A가 이뤄지는 국내 커뮤니티 싸이트


 

출처 : http://youngik.tistory.com/entry/C-공부하기-도움되는-각종-Source-다운-라이브러리-참조-싸이트

반응형
Posted by blueasa
, |

프로그램의 오류를 찾기 위해 가장 기본적으로 쓰는 기능 중 하나가 바로  assert 문 입니다.

 

사용법은 다음과 같지요.

 

#include <assert.h>              // C++ 로는 #include <cassert>

 

Pointer* p = new Pointer();      // 임의로 메모리를 할당하곤

 

assert( p != NULL );               // 메모리가 할당되지 않았다면 메세지 박스와 함께 프로그램이 죽습니다.

 

...                                        // 그렇지 않으면 프로그램은 계속 실행되겠죠.

 

보다시피 사용방법은 매우 직관적입니다.

 

assert( p != NULL ); 구문은 디버그 모드에서만 작동되며 p가 반드시 NULL이 아니어야 한다는 조건을 부여합니다. 따라서, p가  NULL 이라면 메세지 박스가 활성화 되면서 assert가 걸린 라인 수까지 표시가 되지요.

 

물론 릴리즈 모드로 컴파일하면 위의 구문들은 모두 생략됩니다.

 

 

 

이제, 기본적인 사용방법을 알았으니 추가적인 비법을 알려드리지요.

 

 #include  <assert.h>              // C++ 로는 #include <cassert>

 

Pointer* p = new Pointer();      // 임의로 메모리를 할당하곤

 

assert( p != NULL && "포인터 메모리 할당을 실패했잖아" );             

 

...                                        // 그렇지 않으면 프로그램은 계속 실행되겠죠.

 

결과는 메세지 박스에 "포인터 메모리 할당을 실패했잖아" 라는 문구까지 부가적으로 표시됩니다.

 

 

매우 간단한 반면 그 기능은 탁월합니다. 저 같은 경우는 항상 포인터 NULL  여부 및 인덱스 참조 시에  assert 문을 사용하곤 합니다만

 

여러분도 필요한 곳에 사용하시길 바랍니다.

[출처] assert 문 사용하기|작성자 Hermet


반응형

'Programming > C/C++' 카테고리의 다른 글

A * pA = new B 과 B * pB = new B의 차이점.  (0) 2010.06.21
__super C++ 키워드  (0) 2010.06.03
[펌] try-catch 예외처리 비용?  (0) 2010.05.13
[펌] 순수 가상 소멸자  (2) 2010.05.06
C/C++에서 assert  (0) 2010.05.03
Posted by blueasa
, |

본 글을 읽기 전에 다음 글을 읽으시면 도움이 됩니다.  http://hermet.pe.kr/92422706 (c++ 예외처리), 

 

 

예전부터 궁금한 사실이었지만,   과연 try - catch를 사용함에 따른 비용은 어느정도일까?

 

궁금해서 직접 c++을 통해 테스트 해보기로 했습니다.

 

 #define ENABLE_EXCEPTION

 

struct Test {
      int    m[100];
      Test() { printf( "." ); }
 };

 

int _tmain(int argc, _TCHAR* argv[])
{

          DWORD begin = GetTickCount();

      

          for( int idx = 0; idx < 1000000; ++idx ) {

 #ifdef ENABLE_EXCEPTION
         try {
                Test* test = new Test();        delete( test );
         }catch( ... ) {    printf( "Exception!\n" );        }
 #else
         Test* test = new Test();
         delete( test );
#endif
}       

          DWORD end = GetTickCount();

          printf( "Elapsed - %d\n", end - begin );
          return 0;
}

 

위 코드에 대해 주목할 것은 어떤 임의의 루프문에서 Test라는 객체를 생성하고 제거하는 것인데,  예외처리 지정일 경우 try - catch 문에서 이를 수행한다는 것입니다.

 

그럼 과연 try-catch를 했을 경우와 하지 않았을 경우의 출력 값은 어떠했을까?

 

예외 처리한 결과 - 85723

안한 결과 -          76503

 

성능 결과는 무려 9초 차이가 납니다. 그리고 언어마다 그 차이는 조금씩 다르겠죠. (매우 클 수도 있고.. -_- )

 

그래도 확실한 것은,  try - catch에 의한 비용은 분명히 있습니다.

 

자, 어찌됐든 위 코드에서 우리는 메모리 할당의 예외 가능성을 예측할 수 있으므로 다음과 같이 수정해 봅시다.

 

 Test* test = new Test();

 

if( test ) {

    delete( test );

}else {

      printf( "Exception!\n");

}

 

그리고 시간 측정 결과는 다음과 같습니다.

 

예외 처리한 결과 - 85723

안한 결과 -          76503

나의 예외처리 -      78671

 

아무것도 하지 않는 것보다는 약 2초 가량 더 부하가 있긴 하지만, try-catch보단 월등히 낫군요.

 

사실, 시스템 사양에 따라 이런 예외처리 부하는 매우 미미할 수 있을 것이며 80:20 법칙을 고려했을 때도 이는 전체 성능에 거의 눈에 띄지 않을 수도 있겠죠.

 

결국, 예외처리에 대한  선택의 여지는 여러분의 몫이 될 수 밖에 없습니다.

 

 

그리고 예외처리에 대한 저의 철학은 다음과 같습니다.

 

 

"피할수 있다면 하지 않는다."

 

 

try-catch 문에 대해선 위 예와 같이 피할 수 있으면 하지 않습니다. 시스템 콜 사용에 대해선 결과를 알 수 있으므로 대부분 하지 않겠죠.

또한 라이브러리 제작 측면에서는 사용자의 잘못된 사용에 대해 if-else 대신 assert (http://hermet.pe.kr/54763810 )로 사전에 방지해 줍니다. 개발 과정에서는 debug 모드로 제작을 하면서 모든 에러 및 잘못된 사용에 대해 사용자들에게 assert로 알려주는 것이지요.

 

그리고 제품 release일 경우엔 이 assert문은 자연스럽게 코드에서 빠지면서 예외처리에 대한 부하도 같이 사라지게 됩니다.

물론 개발과정에서 assert문을 통해 모든 오류를 수정한 후 일것이구요.

 

More Effective C++ 책에 의하면, try - catch 블록을 쓰기만 해도 코드 블록 및 실행 속도가 5 ~ 10 % 늘어난다고 합니다.

또한, 실제 예외가 발생(throw)하여 함수로 복귀하는데에는 1000배 만큼 느려진다고 합니다. 물론 예외는 거의 발생하지 않는다 라고 봤을 때 이런 부하는 눈감아 줄 수도 있겠죠.

 

 

결론을 말하죠.

 

쓸데없이 예외처리를 하지는 마세요. 진짜 예외적인 상황이 발생할 수 있을 때만 합니다.

성능이 문제가 된다면 위 예제 소스와  같이 프로파일링을 해보세요.

그리고 컴파일러 옵션에서 예외지정을 제외하세요.

 

 

 

(참고 - More Effective C++ (정보문화사), 132-134 )


반응형

'Programming > C/C++' 카테고리의 다른 글

__super C++ 키워드  (0) 2010.06.03
[펌] assert 문 사용하기  (0) 2010.05.13
[펌] 순수 가상 소멸자  (2) 2010.05.06
C/C++에서 assert  (0) 2010.05.03
TCHAR에 관한여...  (0) 2010.04.29
Posted by blueasa
, |

MFC 기초 강좌

Programming/MFC / 2010. 5. 10. 22:24
반응형
Posted by blueasa
, |
소스를 보다가 소멸자가 순수 가상 함수로 선언 돼 있는데 정의 부분이 있어서 이게 뭔가..싶어서 검색해보고 답을 찾아서 링크..


질문 1]

순수 어쩌고 가상함수. 이렇게 명명되는 함수들은 정의가 없습니다.
그래서 이 함수를 포함하고 있는 클래스는 인스턴스를 만들 수 없죠.

그런데 EC++ (3/e)를 읽다보니 순수 가상 함수에 정의를 하고 있는 부분이 나옵니다.
항목7 93~94페이지에 나온 AWOV 클래스인데요,

class AWOV {
public:
  virtual ~AWOV() = 0;
};

이렇게 소멸자가 '순수 가상'으로 되어있음에도 불구하고, 다음 페이지에서

AWOV::~AWOV() {} // 순수 가상 소멸자의 정의

이렇게 정의를 내리고 있습니다.

제가 컴파일을 해보니 또 컴파일도 되더군요-_-; 어떻게 이런 문법이 가능한건가요?

질문 2]
역시 또 EC++(3/e) 항목 31 225페이지에 보면 인터페이스(Java의 그것과 유사한 의미)를 선언하고 있는데요,

class Person {
public:
  virtual ~Person();

  virtual std::string name() const = 0;
  ...
};

여기서는 소멸자를 '단순 가상'함수로 선언하고 있습니다.

왜 '순수 가상'으로 만들지 않는 것인지 의문이 생깁니다.
이 클래스는 '추상 클래스'가 아닌 '인터페이스'로 쓸 것인데 말이죠...

구글링 등 검색을 해봐도 만족할 만한 답변을 얻을 수 없어서 질문 드립니다~


질문도 그렇고 답변도 좀 길 듯하여^^ 별도의 답글로 달아 봤습니다.

질문 1에 대한 답변

C++에서 순수 가상 함수의 기계적 의미는 해당 추상 클래스의 vtbl에서 그 순수 가상 함수의 포인터가 0(=null)로 들어 있다는 것입니다. 즉, AWOV 클래스가 이렇게 되어 있다면,

class AWOV { public: virtual ~AWOV()=0;  virtual foo(); };

이 클래스의 vtbl은 다음과 같이 나옵니다.

vptr -> [ 0                   ]   // 첫째 : AWOV::~AWOV()의 주소
           [ &(AWOV::foo)]   // 둘째 : AWOV::foo()의 주소

하지만, 가상 소멸자의 호출 매커니즘은 파생 클래스의 소멸자가 기본 클래스의 그것을 직접 호출하도록 (컴파일러에 의해) 만들어집니다. vtbl을 통하지 않는다는 것이죠. 따라서 AWOV::~AWOV의 본문이 정의되어 있지 않으면 링크 에러를 내게 됩니다. 이것은 "이렇게 해도 컴파일이 되네" 수준이 아니라 "꼭 이렇게 해야 합니다"라는 의무 조항입니다.

질문 2에 대한 답변

설계상의 선택사항입니다. 순수 가상 함수로 만들 다른 함수가 있으면 구태여 소멸자를 순수 가상으로 만들 필요 없이 비순수 가상으로 만들어도 됩니다.


출처 : http://www.kwak101.pe.kr/bbs/view.php?id=kwk_worksBBS&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=157
반응형

'Programming > C/C++' 카테고리의 다른 글

[펌] assert 문 사용하기  (0) 2010.05.13
[펌] try-catch 예외처리 비용?  (0) 2010.05.13
C/C++에서 assert  (0) 2010.05.03
TCHAR에 관한여...  (0) 2010.04.29
[C]#pragma - once, pack, warning, comment, link  (0) 2010.04.16
Posted by blueasa
, |
반응형

'Programming > C/C++' 카테고리의 다른 글

[펌] try-catch 예외처리 비용?  (0) 2010.05.13
[펌] 순수 가상 소멸자  (2) 2010.05.06
TCHAR에 관한여...  (0) 2010.04.29
[C]#pragma - once, pack, warning, comment, link  (0) 2010.04.16
다른방식의 싱글톤  (0) 2010.04.15
Posted by blueasa
, |
반응형
Posted by blueasa
, |
반응형
Posted by blueasa
, |
출처 : http://alpu.egloos.com/2968362/

Type       Size                                Support             end of string
-----------------------------------------------------------------------
SBCS       1byte                              win9X, NT              \0
-----------------------------------------------------------------------
MBCS       1byte(영문), 2byte(한글)   winNT                   \0
-----------------------------------------------------------------------
UNICODE    2byte                            winNT,CE              \0\0
-----------------------------------------------------------------------

Unicod와 MBCS/ANSI에 따라서 따로 구분해서 프로그램할 필요가 없도록 하기위해서
사용하는 것이 TCHAR 매크로임
즉, TCHAR 타입이 _UNICODE가 정의된 경우에는 wchar_t 타입으로 작동하고,
_MBCS가 정의된 경우에는 char 타입으로 작동한다.

(TCHAR 을 나타는 매크로가 _T 이다. (한문자 _T(' '), 문장 _T(" "))

#include <tchar.h>
#define _UNICODE   // ==> TCHAR를 wchar_t 형으로 대치

#define _MBCS       // ==> TCHAR를 char 형으로 대치 (default)



[ 타입 정의 ]
#ifdef UNICODE
       typedef wchar_t TCHAR;  // 2byte
#else
       typedef char TCHAR;       // 1byte
#endif

[ 함수 정의 ]
#ifdef UNICODE
      typedef SetWindowTextW SetWindowText;
#else
      typedef SetWindowTextA SetWindowText;
#endif



UNICODE가 정의 되면,
--------------------------------------------------------
TCHAR == wchar_t
TEXT == _TEXT == L



_UNICODE가 정의 되면,
--------------------------------------------------------
TCHAR == wchar_t
_T == __T == _TEXT == L


따라서 UNICODE, _UNICODE가 모두 정의 되어야 한다.


_MBCS가 정의 되면,
--------------------------------------------------------
TCHAR == char
_T == __TEXT == 사라짐



UNICODE, _UNICODE, _MBCS 중 어느것도 정의 되지 않으면,
--------------------------------------------------------
TCHAR == char
_T == __TEXT == 사라짐




[ 예) 상수 문자열 ]

LPTSTR  lpszStr = "My string";           // 문자열을 ANSI 문자열로 간주,
                                                    // 데이터형 불일치로 에러가 발생한다.

TCHAR   *lpszStr = T("My string");
LPTSTR  lpszStr = _T("My string");     // _UNICODE가 정의되어 있으면 _T()는 유니코드
                                                     // 문자열 상수로 변환하고, _MBCS가 정의되어 있으면
                                                     // ANSI 문자열 상수로 변환한다.

LPTSTR  lpszStr = TEXT("My string"); // 상동

LPWSTR  lpszStr = L("My string");       // 유니코트 문자열로 지정하는 매크로 함수 L()



[ 예) 문자열 버퍼 길이 계산 ]

#define _UNICODE

TCHAR szBuffer[200];                               // szBuffer의 크기는 400 bytes

DWORD dwlen;
dwlen = sizeof(szBuffer);                           // 400 bytes
dwlen = sizeof(szBuffer) / sizeof(TCHAR);  // 실제 저장 가능한 유니코드 문자 개수는 200개



[ 예) 표준 문자열 라이브러리 함수 ]

표준 C 런타임 함수 strlen()에 해당하는 유니코드 함수는 wcslen()이지만,
_tcslen()을 사용하면 _UNICODE, _MBCS 정의에 따라 컴파일시에 알아서 적절히 변환된다.
(tchar.h에 다 정의되어 있다.)

ANSI            Unicode          TCHAR type
--------------------------------------
strlen()        wcslen()         _tcslen()
strcat()        wcscat()         _tcscat()
strchr()        wcschr()         _tcschr()
strcmp()      wcscmp()       _tcscmp()
strcpy()       wcscpy()        _tcscpy()
strstr()         wcsstr()          _tcsstr()
strrev()        _wcsrev()        _tcsrev()

printf()         wprintf()           _tprintf()
sprintf()       swprintf()         _stprintf()
scanf()        wscanf()          _tscanf()



[ 예) ANSI 문자열과 Unicode 문자열 간의 변환 ]

(1) Multi-Byte String을 Wide Character String(유니코드)으로 변환
               mbstowcs(WCHAR *des, char *src, int BufferSize);

(2) Wide Character String(유니코드)을 Multi-Byte String으로 변환
               wcstombs(char *des, WCHAR *src, int BufferSize);



[ 타입 정의 ]

typedef CHAR *   LPSTR, *PSTR;
        CHAR * == LPSTR == PSTR

typedef CONST CHAR * LPCSTR, *PCSTR;
        CONST CHAR * == LPCSTR == PCSTR

LPTSTR   = TCHAR *

LPCTSTR = CONST TCHAR *

반응형

'Programming > C/C++' 카테고리의 다른 글

[펌] 순수 가상 소멸자  (2) 2010.05.06
C/C++에서 assert  (0) 2010.05.03
[C]#pragma - once, pack, warning, comment, link  (0) 2010.04.16
다른방식의 싱글톤  (0) 2010.04.15
조건문의 최적화 방법  (0) 2010.04.14
Posted by blueasa
, |
반응형

'Programming > TinyXML' 카테고리의 다른 글

TinyXml 사용법 요약  (0) 2010.12.08
TinyXML Read  (2) 2010.12.08
TinyXML Write  (0) 2010.12.08
Tiny XML 링크  (0) 2010.04.27
Posted by blueasa
, |