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

카테고리

분류 전체보기 (2797)
Unity3D (853)
Programming (479)
Python (8)
TinyXML (5)
STL (13)
D3D (3)
MFC (1)
C/C++ (54)
C++/CLI (45)
C# (251)
WinForm (6)
WPF (5)
Math (10)
A.I. (1)
Win32API (11)
Algorithm (3)
Design Pattern (7)
UML (1)
MaxScript (1)
FMOD (4)
FX Studio (1)
Lua (2)
Terrain (1)
Shader (3)
boost (2)
Xml (2)
JSON (4)
Etc (11)
Monad (1)
Html5 (4)
Qt (1)
Houdini (0)
Regex (14)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (61)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

찾아보니 stdbool.h 라는 헤더가 있어서 포스팅 해놓음..


01#include <stdio.h>
02#include <stdbool.h>
03 
04int main(void)
05{
06    bool a;
07 
08    a = true;
09    if (a) {
10        printf("true\n");
11    else {
12        printf("false\n");
13    }
14    a = false;
15    if (a) {
16        printf("true\n");
17    else {
18        printf("false\n");
19    }
20    return 0;
21}
22</stdbool.h></stdio.h>

C에서는 0 또는 1의 값만을 가지는 _Bool 타입이 C99에서 표준으로 채택되었으나 GCC에서는 이미 3.x 버전에서도 지원하고 있었다. stdbool.h를 include하면 bool이라는 이름의 타입과 true/false의 값을 사용할 수 있다.

C++에서는 별다른 헤더의 지정없이 동일하게 사용할 수 있다.

Boolean 타입의 단점은, 명시적으로 true/false가 나눠지는 값을 대입하지 않고 built-in 타입으로부터 값을 그대로 전달받을 때 의미와 실제 값이 뒤바뀔 수 있다는 점에 있다.(예. 함수의 return 값을 조건문에서 검사할 때, 이 함수가 boolean 타입의 값을 반환하는가 아니면 int 타입의 값을 반환하는가에 따라 의미적 오류가 발생할 수 있다.)

반면에, 이 타입의 가장 큰 미덕은 가독성을 높여준다는 데 있다.

다만, 위에서 언급한 것과 같이 함수의 return 값을 boolean 타입으로 지정하여 사용하는 것은 바람직하지 않다. return 값은 단순히 함수 실행의 성공/실패 여부만을 가리키는 것이 아니라 에러 코드를 포함할 수도 있고 결과의 크기 등의 정보를 표현할 수도 있는 것이기 때문이다.

출처 : http://terzeron.net/wp/?p=760

반응형
Posted by blueasa
, |

머드 패치하면서 bool 값이 필요해서 bool을 넣었더니 에러가 난다..

C는 bool이 없던가..? 있지 않나? 하고 찾아봤더니..

없다..;;

아..기초가 부족한 인생.. 공부가 부족하구나..

C와 C++의 차이점도 좀 봐놔야겠다..


---------------------------------------------------------------------------------------------------------

C++가 아닌, 전통적인 C언어에는 bool (Boolean; 불린, 불리언) 타입이 없습니다. 그래서 사용자가 만들어 주어야 합니다.

typedef 를 사용하여 bool 이라는 자료형을 하나 만들었습니다.

false (거짓) = 0
true  (참)   = 1

에 해당합니다.


C에서, 불린(Boolean) 자료형 정의 예제


소스 파일명: 0.c
#include <stdio.h>

typedef enum {false, true} bool;


int main(void) {

  bool myTest = true;
  if (myTest) puts("논리값이 true 라면 이 줄이 출력됩니다.");


  myTest = false;


  if (myTest) puts("논리값이 false 라면 이 줄이 출력되지 않습니다.");
  if (!myTest) puts("느낌표로 값을 뒤집어주면 이 줄이 출력됩니다.");

  return 0;
}


단, C소스의 확장자가 .cpp 면, C++의 불린형과 충돌하기에 다음과 같은 엉뚱한 에러가 납니다:

0.cpp(3) : error C2143: syntax error : missing '}' before 'constant'
0.cpp(3) : error C2143: syntax error : missing ';' before '}'
0.cpp(3) : error C2059: syntax error : '}'



.cpp 확장자를 가진 소스라면,
typedef enum {false, true} bool;
이 줄을 지워야 정상적으로 작동합니다.




반응형
Posted by blueasa
, |

mbstowcs(), wcstombs() 예제

#include <stdio.h>
#include <string.h>
#include <locale.h>
#include <stdlib.h>

/* MBCS(Multi Byte Character System)
*  WBCS(Wide Byte Character System)
*  MBCS문자열은 문자열 중에 영문은 1바이트, 한글등은 2바이트로 저장함
*  WBCS문자열은 모든 문자를 2바이트(Unicode)로 저장함
*  MBCS, WBCS상호 변환가능
*  mbstowcs(wchar_t *dest, const char *src, size_t maxCount)
*  wcstombs(char *dest, const wchar_t *src, size_t maxCount)
*/

int main(void) {

 char *mbs = "한글과 Elglish 혼용";
 wchar_t wcsarr[36];
 char chr[36];

 setlocale(LC_ALL, "korean");

 printf("mblen(mbs,strlen(mbs))=%d \n", mblen(mbs,strlen(mbs)));

 /* mbcs(multi byte character system) 문자열을 wbcs(wide byte character system)으로 변환 */
 if(mblen(mbs, strlen(mbs))==2) { // 문자열 중에 2바이트 문자(한글)가 있다면 2를 리턴함
  mbstowcs(wcsarr, mbs, strlen(mbs)); // mbcs문자열을 지정한 바이트 수만큼 wbcs문자열로 변환
  wprintf(L"%s \n", wcsarr); // wbcs문자열 출력
 }

 // wbcs문자열을 지정한 바이트 수만큼 mbcs 문자열로 변환
 wcstombs(chr,wcsarr, sizeof(wcsarr));
 printf("%s \n", chr);
 
}



출처 : http://micropilot.tistory.com/entry/mbstowcs-wcstombs

반응형
Posted by blueasa
, |

프로그램에 실행 될 때마다 필요한 메모리 공간(지역 변수, 전역변수 공간)의 할당을 위해 메인 메모리(RAM)에 할당된다. 이렇게 할당되는 메모리 공간은 데이터, 힙, 스택의 세 영역으로 나뉜다.


[그림 1] C 언어의 메모리 관리 구조


■ 데이터 영역(Data Area)

데이터 영역은 전역 변수와 static 변수가 할당되는 영역이다. 이 영역에 할당되는 변수들은 일반적으로 프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야만 메모리에서 소멸된다. 즉, 데이터 영역에 할당된 변수는 프로그램이 종료될 때까지 계속 존재한다는 특징을 지닌다. 전역 변수와 static 변수의 특징과 일치하는 부분이다.

■ 스택 영역(Stack Area)

스택 영역은 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역이다. 이 영역에 할당된 변수는 함수 호출이 완료되면 사라진다는 특징을 지닌다. 이는 다른 메모리 영역과 확실히 비교되는 특징이다. 늦게 할당된 변수의 메모리가 먼저 해제되므로 스택의 특징과 일치한다.

■ 힙 영역(Heap Area)

힙 영역은 프로그래머가 관리하는 메모리 영역이다. 즉 프로그래머의 필요에 의해서 메모리 공간이 할당 및 소멸되는 영역이다. 동적 할당으로 생성되는 메모리 영역이다.

※ 정적 할당되는 변수의 메모리는 변수의 특성에 따라 데이터 또는 스택 영역에 생성된다. 정적 할당은 컴파일 단계(Compile-time)에서 모두 이루어진다. 하지만 컴파일 단계에서는 메모리의 크기만 생성 할 뿐 변수의 값은 저장 되지 않는다. 이 때문에 배열의 크기는 상수로만 지정해야 하는 것이다. 변수 값의 저장은 런타임(Run-time)에서 이루어지며, 런타임 단계에서 메모리를 생성하고자 할때 사용하는 것이 동적 할당이다.


출처 : http://blog.naver.com/sulzi83/100065485863

반응형
Posted by blueasa
, |

DSP 프로그래밍에서 중요한 개념인 빅 엔디안 (Big Endian)과 리틀 엔디안 (Little Endian)에 대해 정리해보려고 한다.

원래 빅 엔디안과 리틀 엔디안은 걸리버 여행기에 나오는 소인국의 일화에서 처음 등장했다. 
소인국에서는 달걀의 껍질을 까서 먹을때 뭉툭한 곳(Big End)을 깨서 먹어야 하는지, 뽀죡한곳 (Little End)를 깨서 먹어야 하는지에
대한 논쟁이 일어났는데, 그때 뭉툭한곳을 주장하는 사람들을 Big Endian이라고 하고, 뾰족한 곳을 주장하는 사람들을 Little Endian이라고 불렀다. 이 소설에서의 용어를 가져와서 사용하게 되었다.

위키백과에 들어가보면 Endianess를 컴퓨터의 메모리같은 1차원 공간에 여러개의 연속된 대상을 배열하는 방법을 뜻한다고 한다. 이 대상에는 Word가 될수도 있고, Byte가 될수도 있고 bit가 될수도 있다. 

빅 엔디안과 리틀 엔디안 둘중 어느것이 우월하다고 말하기는 어려우며, 상황에 따라 다르다고 할수 있다. 



다음의 예는 영문 위키백과에서 따옴을 밝힌다.
1) 빅 엔디안
예를 들어 레지스터에 0A0B0C0D의 8비트 정보들이 있고, 메모리 주소는 1바이트씩 증가한다고 하면,
메모리 주소가 a, a+1, a+2, a+3으로 증가한다고 했을때 다음과 같이 mapping 된다.


a: 0A
a+1: 0B
a+2: 0C
a+3: 0D

즉, MSB에서 부터 주소가 증가하는 방향으로 데이터가 메모리에 저장되게 된다.

2) 리틀 엔디안
위와 같이 똑같은 가정을 했을때 리틀엔디안에서는 다음과 같이 mapping된다.

a: 0D
a+1: 0C
a+2: 0B
a+3: 0A

즉, 빅 엔디언과 반대방향으로 메모리에 데이터가 저장되게 된다.

<빅 엔디언과 리틀 엔디언의 장단점>

빅 엔디언의 장점 : 사람이 읽고 쓰는 방법과 같은 순서로 데이터가 저장되기 때문에, 디버깅이 편하다.
빅 엔디언의 단점 : 연산에 따라 수가 커지면 왼편에 자리수를 추가하기 위해서 기존에 저장된 모든 데이터를 오른쪽으로 옮겨야 하는 경우가 발생한다.

리틀 엔디언의 장점 : 수가 커질때 새로운 자리수가 단순히 오른편에 추가만 하면 된다. 즉 연산이 빨라진다.
리틀 앤디언의 단점 : 디버깅할때 사람의 읽는 방향과 반대이므로 편의성이 떨어진다.



보통 인텔 프로세서 계열은 리틀 앤디언을, 모토롤라 프로세서 계열은 빅 앤디언을 쓴다고 한다.



출처 : http://pelleas.tistory.com/entry/%EB%B9%85-%EC%97%94%EB%94%94%EC%95%88Big-Endian-%EA%B3%BC-%EB%A6%AC%ED%8B%80-%EC%97%94%EB%94%94%EC%95%88Little-Endian

반응형
Posted by blueasa
, |

<레지스터, 스택, 힙, 데이터 영역> 

1) 레지스터 (Register) 
레지스터는 CPU나 프로그램이 접근할수 있는 메모리 영역중 가장 빨리 접근 할 수 있는 곳이라고 할 수 있다.
보통은 CPU의 경우 내부 메모리로 설정되어있으며 RAM 같은 외부 메모리와는 다르다.쉽게 생각해서 CPU안에 숨어있는 메모리라고 보면 되겠다. (우리가 흔히 보는 4GB DRAM 같은 것은 외부 메모리이다.)
보통의 CPU는 "로드스토어 구조"라는 레지스터 접근 방식을 택하는데, 이는 지금 당장 연산이 이루어지는 메인 메모리의 데이터를 레지스터로 가져온후 연산을 하고 이후 다시 메인메모리로 저장하는 구조이다. 보통 레지스터는 메모리 계층의 최상위에 위치한다고 한다.
C/C++언어를 작성할 때, 특히 for문 같은 문법을 사용할때는 for문의 인자를 레지스터 변수로 선언하면 연산속도를 증가시킬 수 있다.
예) register int i;
for(i=0;i 
하지만 요즘의 컴파일러들은 위와같은 register 변수 선언을 굳이 하지 않아도 코드 최적화를 통해 위와같은 변수들은 레지스터로 보내는 경향이 있다.

2) 스택 (Stack) 
스택은 LIFO (Last Input First Output)의 경향을 가지는 메모리 영역으로 영어 단어 그대로 차곡차곡 "쌓는"메모리영역이다.
데이터를 쌓기 때문에 처음 쌓인 데이터가 가장 늦게 출력된다. 
C/C++ 프로그래밍에서는 지역변수(local variable)이 저장되는 영역이고, 대부분의 함수 내에서의 변수 선언은 모두 스택에 저장된다고 보면 된다. 또한 함수 호출이 완료되면 데이터도 사라진다. 따라서, 스택에서 선언되는 변수는 메모리 관리에 대해 신경쓸 필요가 없다. 호출이 완료되면 저절로 사라지기 때문에 메모리에 남아있지 않는다.

3) 힙(Heap) 
힙은 전적으로 프로그래머가 관리하는 메모리 영역이다. 이 영역의 의미는 다음과 같이 생각할수 있다.
스택의 경우, 앞서 지역변수가 저장되는 영역이라고 했다. 따라서, 함수가 호출되는 경우 컴파일러는 함수 안에 선언되어있는 지역변수들의 자료형을 훑어본 후, 이 함수가 실행되기 위해 필요한 스택의 메모리 양을 찾아낸다. 이때 중요한 것이 컴파일러는 스택 메모리 양을 계산할때 선언된 지역변수의 초기값에는 관심이 없다 . 즉, 초기값과는 상관없이 몇 바이트의 자료형이 선언되어있는지만 확인한다. 그래야 스택 메모리 양을 계산할 수 있기떄문이다. 그렇다면, 스택 메모리를 쓸때 한가지 불편한 점이 있다.

사용자가 때에 따라 유동적으로 메모리를 할당해주고 싶을때 스택 영역을 사용하기 쉽지 않다. 

즉, 메모리 할당을 변수를 사용하여 프로그래머가 유동적으로 하고 싶을때는 스택 영역의 메모리를 사용하기 어렵다. 이를 어려운 말로는 "컴파일-타임"이 아니라 "런-타임"에 메모리 할당을 한다고 한다. 즉, 프로그램이 실제로 실행할때 유동적으로 메모리 할당이 이루어진다는 뜻이다. 이때 바로 힙이 사용된다. 그리고, 힙에 메모리를 할당하는 것을 동적할당이라고 한다.
동적할당을 할때는 C의 경우는 malloc, calloc 명령어가, C++인 경우는 new 명령어가 사용된다. 또한 동적할당시 중요한 점이 할당된 메모리는 반드시 해제되어야 한다는 점이다. 이때 C에서는 free, C++에서는 delete 명령어가 사용된다.

4) 데이터 영역 
데이터 영역은 전역변수(Global variable)나 static 변수가 저장되는 메모리 영역이다. 이 영역에 할당된 메모리는 프로그램 자체가 완전히 종료되어야 삭제된다. 따라서, 프로그램 실행 내내 접근되거나 update 되어야 하는 변수들은 데이터 영역에 할당하면 된다.


출처 : http://pelleas.tistory.com/entry/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B3%B5%EA%B0%84%EC%9D%98-%EC%9D%B4%ED%95%B4

반응형
Posted by blueasa
, |

static const int a;

const static int b;


a와 b가 다른가? 하고 찾아봤는데..


결론은 포인터(*)가 붙지 않는 한 같다. 라는 블로그 포스팅을 발견..


뭔가 내부적으로 다를까.. 했는데..


같구나..


아래는 본문..

---------------------------------------------------------------------------------------

출처 : http://lsrsp.egloos.com/1562353


1. 아래는 모두 같다..
static const int ...
static int const ...
const static int ...
const int static ...
int const static ...
int static const ... 
 
2. 그러나 미테 2개는 다르다..
static const int * foo; // non-constant pointer to a constant variable.
static int * const foo; // constant pointer to a non-constant variable.

반응형
Posted by blueasa
, |

Purpose-built post

이 포스트는 "Modern C++ Design Chapter 4. 작은 객체에 대한 메모리 할당"을 읽고 내가 이해하기 위해 정리를 하며, 포스트로 남긴 것이다. - 익필

Content

1. 무엇을 메모리 풀 memory pool 이라고 하는가?

메모리 풀을 역활로 정의를 하면, 메모리 할당/해제/용량 최적화 등을 효율적으로 처리해 주는 웅덩이/수영장/도구/장치/관리자 이다. 단어 자체로 정의를 하면, 메모리 저수지 정도로 이해하면 되겠다.

pool 이라는 것을 예를 들면, 농업을 들 수 있다. 농작물을 제배하기 위해선, 물이 필요한데, 기후가 변덕을 부리어, 비가 오지 않을 때, 미리 저수지에 모아 두었던 물을 양수기로 퍼올려 농작물에 물을 공급함으로써, 효율적으로 농작물을 기를 수 있게 된다.

2. 왜 메모리 풀이 필요한가?

첫번째 이유

C/C++ 에선 메모리를 할당 하기 위해서 시스템 콜(OS 내부 함수를 요청)을 해야만 한다. 이 시스템 콜 생각보다 부하를 많이 잡아 먹는다. 이처럼 성능이 스택에 메모리를 생성 하는 것 만큼 빠르지 않으므로, 잦은 할당/해제는 많은 오버헤드를 불러 일으킨다.

두번째 이유

메모리 할당으로 4Byte 를 요구 했을 때, 실제로 4Byte 말고도, 몇 바이트를 할당 했는지, 할당한 메모리에 추가적으로 4Byte ~ 32Byte 를 추가하여 할당을 한다. 왜냐하면, 얼마 만큼 메모리를 할당했는지 기록을 해야 나중에 해제 할 수 있기 때문이다.

이는 메모리를 더 많이 사용하므로, 메모리 고갈을 불러 일으킬 수 있다. 또한 메모리 할당을 더 많이 하므로써, OS의 페이징/프레임 기법에 영향을 미칠 수도 있다. 이는 오버헤드를 불러 일으킨다.

세번째 이유

할당 해제가 잦을 수록 메모리 단편화가 일어 날 수 있다. 단편화가 일어날 경우, 메모리가 여러 곳에 흩어져 있기 때문에, 메모리를 블럭 단위로 끌고 와 처리하는 작업이 더 많이 지게 된다.

하지만... 
몇년전인지는 모르겠지만, 메모리 단편화는 신경쓸 필요가 없어졌다. 프로그래밍으로 메모리 할당을 요청한다는 것은 OS에 요청하는 것인데, OS가 메모리 단편화가 일어나지 않게 프레임 기법/페이징 기법을 처리해 주기 때문이다. 만약 임베비드 환경에서, 이러한 기능이 없는 OS가 쓰인다면, 메모리 풀이 필요 할 수도 있다. : )

참조 링크

3. 다른 라이브러리가 있는데 왜 메모리 풀을 만들어야 하는가?

공부하기 위해서다. 알고 쓰는것과 모르고 쓰는건 나중에 버그가 생길 때, 그 버그를 고치는 능력 차이를 만들기 때문이다.

Digression
  • 실제로 new/delete가 성능에 많은 영향을 미치고 있으나, 퍼포먼스 테스트를 하기 전까지 메모리 풀을 만들지 않는게 좋다고 나는 생각한다. 왜냐하면, 실제로 어디에 병목현상이 발생 하는지 모르므로, 괜한 최적화로 쓸때없는 코드리뷰를 하게 만들 수 있기  때문이다.

  • 유명하고 많이 쓰이는 메모리 풀로는 apr_pool, boost::pool 등이 있다. 그렇다고 이러한 풀들을 너무 믿는 것도 힘들다. 왜냐하면, 실제로 해당 메모리 풀을 쓰기 전까지 내가 만든 프로그램에 적합한지 모르기 때문이다.

  • 내가 만든 메모리 풀을 사용하기 보다, 라이브러리에서 제공하는 메모리 풀을 사용하길 권한다. 여러가지 이유가 있지만, 다른 사람에게 설명할 때, 아예 설명할 필요가 없거나, 버그도 없고 성능도 어지간해선 내가 만든것 보다 좋기 때문이다. : )

  • 멀티 쓰레드 환경에서 메모리 풀은 lock free 구조가 제일 좋다. 또한 메모리 풀에 lock 이 있어, 오히려 new/delete가 더 빠를 때도 있다. 역시 이른 최적화는 독이 될 수 있으므로, 퍼포먼스 테스터를 하기 전까진 너무 최적화 하지 마라.

  • 2부에선 메모리 풀을 만들기 위해, "어떻게 메모리를 할당해야 관리 할 수 있을까?" 를 정리한다.



반응형
Posted by blueasa
, |
1
2
3
4
5
6
7
8
9
10
11
#include<string>
#include<iostream>

int main()
{
const char* charString= "Eggs on toast.";
 std::string someString(charString);

 std::cout << someString;
 return 0;
}

1
2
char *cStr = "C++";
std::string Str = std::string(cStr);


출처 :  http://www.cplusplus.com/forum/general/41912/
반응형
Posted by blueasa
, |

access()은 파일의 존재 여부와 읽고 쓸 수 있는지에 대해 조사한다.

 

< 기본형 >

access( const char* filename, int amode )


 -amode 옵션 
00 파일이 존재
01 실행한다
02 쓸 수 있는지 검사
04 읽을 수 있는지 검사
06 읽고 쓸 수 있는지 검사

요청 -> 참 : 0, 거짓 : 1, 에러 : -1

errno -> ENOENT : 파일이나 디렉토리를 찾을수 없다
         -> EACCESS : 액세스 불가능

 

 

< 사용법 >

#include <io.h>   // 해더 파일을 불러준다

int velue= access("abc.txt",0);      // abc.txt 파일이 있는지 확인한다

 

파일이 있으면 0,

파일이 없으면 -1,

리턴한다


 
[출처] [C/C++]파일 존재 유무 및 속성 조사 access()|작성자 쥐돌

반응형
Posted by blueasa
, |