Public 131

utf8를 유니코드(uni)로 변환 (euc-kr <-> utf-8) |

utf8로 된 코드를 UCS-2로 변환하는 과정 입력 어절이 '가'(utf-8)일 경우 코드값은 0xEA 0xB0 0x80 이다. 첫번째 바이트의 첫번째 비트가 0xE0 이기 때문에 3byte로 표현된 캐릭터임을 알수 있다. 첫번째 바이트 처리 0xEA & 0xE0 == 0xE0 11101010 0xA 두번째 바이트 처리 10110000 00111100 & -------- 00110000 >> 2 --------- 00001100 => 0xC 세번째 바이트 처리 100000000 000111111 & --------- 000000000 => 0x0 UCS-2의 첫번째 바이트 0xA => 10100000 0xC => 00001100 --------------- 0xAC UCS-2의 두번째 바이트 0x0 =..

Public/tip & tech 2009.05.12

valgrind (callgrind)

일반적으로 리눅스에서 작업중 튜닝이 필요할때 프로파일링 작업을 한다. 가장 일반적인 방법이 컴파일 옵션에 -pg를 주고 pgrof로 프로파일링된 내용을 보는것인데 이것과는 조금 다른 프로파일링 기법이 있어서 소개한다. 이미 많은 개발자들이 사용하고 있는 valgrind의 서브 모듈인 callgrind가 바로 그것인데 아래에 간단한 사용법을 정리하였다 실행 방법 > valgrind --tool=callgrind ./test /dev/null 실행된 내용은 가지고 출력 파일을 생성한다 >callgrind_annotate callgrind.out.7838 > callgrind.out.7838.txt 사용법 보기 > callgrind_annotate --help 함수별 결과보기 > ca..

Public/tip & tech 2009.05.12

변수 초기화(memset)

학교에서 공부할때에 선배들로부터 많이 듣던 이야기중에 하나가 변수 선언시 초기화를 잘해줘야 한다는 이야기이다. 그때부터 버릇이 들어서인지 변수 선인시에 가급적 초기화를 할려고 노력을 하는 편인데 그 버릇중에 하나가 시스템 퍼포먼스를 낮춘다는걸 최근에야 알게 되었다. 몇일전에 소개한 callgrind를 사용해서 알수 있는 내용이었는데 char 배열이나 inter 배열이나 선언시에 {0.} 와 같이 배열을 초기화 하였다. 그런데 이 표현은 다른 의미로 memset를 호출하겠다는 의미인것이다. 다시 말하면 속도를 위해서 프로그램상에서 명시적으로 memset을 한번도 쓰지 않았지만 10개의 변수에 대해서 위와 같은 최기화를 10번 사용하였다면 10번의 memset함수를 호출함 셈이된다. c프로그램 아직 너무 어..

Public/tip & tech 2009.05.12

const

변수를 상수로 만들고자 할때 즐겨 사용하는 키워드가 const 이다. const char *MSG = "ERROR"; 이와 같은 형태로 사용하는데 제대로된 순서로 적을려면 char const *MSG = "ERROR"; 이다. 물론 처음 적은 것이 틀렸다는 의미는 아니고 const 연산자의 특성을 이해하기 위해서는 두번째 방법으로 적는것이 이해하는데 통일성이 있어서 유리하다는 의미이다. const 연산자는 좌측 즉 왼쪽에 오는 것들에 영향을 미친다. char const *p 는 상수문자열를 가르키는 일반 포인터이고 char *const p는 일반문자열을 가르치는 상수 포인터이다 상수 문자열은 수정이 불가능한 문자열을 의미하고 일반 문자열은 수정이 가능한 문자열이다. 그리고 일반 포인터란 가르키는 대상이 ..

Public/tip & tech 2009.05.12

[c언어] volatile

volatile 지금까지 프로그램을 하면서 한번도 사용해 본적이 없는 키워드이다. 그럼 언제 사용하는가 ? c프로그램은 컴파일 언어이기 때문에 c코드를 컴파일하게 된다. 이때 컴파일을 담당하는 컴파일러가 코드 수행의 성능 향상을 위해서 최적화를 하는데 이런 최적화를 못하도록 컴파일러에게 명시적으로 알려주는 키워드가 volatile이다. 어떤 변수가 있고 이 변수가 루프를 끝낼지 말지를 결정하는 변수일때 컴파일러가 이 변수는 메인메모리에서 읽어오지 않고 처음 로딩후 로컬 레지스터에 저장한후 다음부터는 이 로컬레지스터에서 읽어오게 되면 메인메모리에 변경된 값이 적용되지 않는 경우가 발생하여 프로그래머가 예상했던 동작과 다르게 동작할 수 있다. 보통(single 프로세스)의 프로그램환경에서는 발생하는 일이 없..

Public/tip & tech 2009.05.12