반응형

프로그래밍 언어/C/C++ 31

calloc vs malloc

둘 모두 메모리를 할당해준다는 점에서는 동일합니다. 하지만, 특정 상황에서는 어떤 것을 써야 할지 혼돈이 생기는 경우가 많습니다. 물론 대부분 calloc보다는 malloc을 쓰게 되는데 왜 이런 두 종류의 api가 존재하는 것일까 궁금하게 되었습니다. 또, calloc은 두개의 인자를 받도록 되어 있습니다. 왜 똑같이 메모리를 할당받는 데 calloc은 두개의 인자를 malloc은 한개의 인자를 받는 것일까요? 추: 답변글들을 꼭 읽어보세요. 이 글은 잘못된 정보를 포함할 수 있습니다. malloc() void *malloc(size_t size); malloc은 size만큼의 메모리를 할당하고 (초기화 없이) 해당 힙 영역을 반환합니다. int *ptr = malloc(10 * sizeof (int)..

[C언어] a - b < 0 vs. a < b

너무 간단한 건데, 이런걸 한번에 캐치하지 못했다. 수학시간에 배운데로 a -b < 0 은 a < b와 다를 바 없다. 하지만 프로그래밍 언어에서는? 꼭 그렇지는 않다. 위 간단한 코드를 출력해보면 무엇이 나올까? 출력 결과는 a < b [end] 가 된다. 어찌 보면 당연한건데 막상 프로젝트에서 접하면 쉽게 발견하기 어려운 버그가 된다. unsigned 인 a 와 b의 차를 계산하여 나온 결과가 음이 되므로 오버플로우에 의해서 a - b는 양이 된다. 이런 코딩을 하진 않겠지만 눈에도 익혀서 디버깅을 할 때 쉽게 찾을 수 있도록 노력해야겠다.

C로 수행시간 체크하기

간단하게 수행시간 체크하는 매크로를 만들어보았다.### c++ #ifdef _WIN32 #define ENTER { \ LARGE_INTEGER begin, end, freq; \ QueryPerformanceFrequency(&freq); \ QueryPerformanceCounter(&begin); #define LEAVE \ QueryPerformanceCounter(&end); \ double elapsed_time = (double)(end.QuadPart - begin.QuadPart) / freq.QuadPart; \ printf("%s:%d] %3.2f elapsed\n", __FUNCTION__, __LINE__, elapsed_time); \ #else #include #define E..

__builtin_expect 키워드

최근 이상한 매크로를 발견하고 추적하던 중 멋진 gcc의 키워드를 발견했다. __builtin_expect라는 키워드이다. 아래 URL에 좀 더 자세히 적혀있다. http://galaxyra.linuxstudy.pe.kr/galaxyra/tag/__builtin_expect 한마디로 말하면 실행할 가능성이 높은 애를 위해서 컴파일하도록 하는 매크로이다. 방어적 코딩을 하다보면 무수히 많은 if 문을 넣어야 하는데 아키텍처를 조금이라도 공부한 사람들은 Pipeline Hazard때문에 if문을 꺼리게 된다. if문의 해악을 없앨순 없지만 되도록 실행가능성이 높은 코드를 밑에 배치해 파이프라인 해저드를 최소화 시킬수 있도록 해주는 키워드가 바로 이 키워드이다. #define unlikely(x) __buil..

gcc 업그레이드 (4.5.0)

WebKit 작업중에 오류가 발생해서 알아보니 gcc 4.4.1에 버그가 있는 것 같다. 현재까지 우분투 9.10 의 기본 gcc 버전은 4.4.1이다. 그래서 직접 gcc 4.5를 설치해보기로 했다. gcc 4.5 릴리즈 노트 : http://gcc.gnu.org/gcc-4.5/ gcc SVN 관련 문서 : http://gcc.gnu.org/svn.html 1. gcc 4.5 다운로드 먼저 gcc 4.5를 뜻하는 브랜치를 확인해야하겠기에 아래 명령을 수행한다. svn ls svn://gcc.gnu.org/svn/gcc/branches 명령의 결과로 무수히 많은 브랜치가 올라가는데 gcc 4.5 브랜치는 gcc-4_5-branch SVN으로 받았으나 configure에서 에러가 발생했는데 메시지 공부하고..

Header안에 static 변수

C++에서 static을 다소 헷갈리게 만드는 요소가 있긴 하지만, header에서 static 변수를 선언해서는 안된다. static : 지역 변수임을 알려주는 키워드 (C++ 클래스 내부의 static과 다른 의미이다.) 헤더에서 static을 선언하면 어떤 일이 일어날까? 간단한 예제를 만들어보았다. (컴파일 없이 손코딩했음) common.h static int gvalue = 10; main.c #include #include "common.h" #include "b.h" int main () { printf("%d\n", gvalue); call_b(); printf("%d\n", gvalue); return 0; } b.h void call_b(); b.c #include "common.h" ..

디버깅하는 법 - 툴 - ltrace

디버깅이란 말 그대로 버그를 잡는다는 뜻이다. 코딩을 잘하는 사람이 대체로 디버깅도 잘하는 법이지만, 아무래도 디버깅을 유별나게 잘하는 사람들이 있다. 또, 디버깅 실력은 사람의 실력도 중요하지만 그가 사용하는 툴의 능력도 결코 무시할 수 없는 것 같다. Visual C++이나, Eclipse같은 툴을 쓸 수 있다면야 참 좋겠지만, 아무래도 임베디드 환경에서 이런 호사는 기대하기 힘들고 심지어 gdb마저도 쓰기 힘든 경우가 많다. 이럴 때 strace, ltrace를 사용해보는 것도 좋을 듯 싶다. 지금까지 gdb없으면 디버깅 못한다고 짧은 생각을 해왔는데 ltrace를 보니 때론gdb보다 뛰어나다는 생각마저 든다. ltrace 는 라이브러리상에 호출되는 symbol들의 이름을 출력해준다. 콜 스택을 보..

unresolved symbol 에 관하여

컴파일(정확히는 링크)을 할 때 아래와 같은 에러를 종종 보곤 한다. unresolved symbol이라는 에러는 말 그대로 해당 심볼명을 찾을 수 없다는 에러이다. 이런 에러가 났을 때, 우리가 해야 할 일은 [ 내가 만든 함수인 경우 ] 1. unresolved symbol이 뜬 곳에서 함수명, 인자의 타입, 개수, 반환값등을 확인한다. 2. 해당 함수를 포함한 파일이 컴파일 되는지 확인한다. 매크로등에 의해 컴파일에 포함되지 않을 수도 있기 때문이다. 쉽게 확인하는 방법의 하나는 해당 함수에 #error를 넣고 컴파일해보는 것이다. 컴파일 에러가 아니라, unresolved symbol이 또 뜬다면, 그 함수는 컴파일에 포함되지 않은것이다. 3. C함수인지 C++함수인지 확인한다. C++로 컴파일 ..

[Python]파일명 바꾸기

예섬이를 위해 간단히 짜본 파이썬 스크립트. 문제는 엠파스에서 탭이 제대로 안붙는구나 ;; [요구사항] 특정 폴더를 선택하여, 해당 폴더가 가지고 있는 파일들의 이름 앞에 특정 문자열을 붙일 수 있어야 한다. import os, time, string from Tkinter import * from tkFileDialog import askdirectory top = Tk() F = Frame(top) F.pack(expand="true") myPath = askdirectory(title="select directory", mustexist=1) if not myPath: os.exit else: print "selected", myPath #myPath = raw_input("Enter the pat..

반응형