사진을 많이 찍으면 찍을 수록 걱정되는 것이 바로, 사진의 보관이다. 하드 디스크에 보관하고, 외장 하드디스크에 백업도 하지만, 불안한건 사실이다. 그래서, 웹상에 보관하는 방법을 찾던 차에 Flick Pro를 발견하였다. 물론, 100%안전한 방법은 아니지만, Yahoo!에서 하는 서비스인 만큼 상당히 믿을만 하다는게 나의 생각. 거기다가 $24.95에 무제한 이용이 가능하다 (한달 upload는 2G로 제한). 이 정도면 앞으로 꾸준히 이용할 만한 서비스 일 것으로 생각된다.
결국 사고 말았다...^^;;
January 22, 2008
__stdcall & __cdecl
WINDEF.H
이렇게 calling convetion을 둘로 나눈 이유는 함수 호출 후, stack pointer (sp)를 누가 원래데로 돌려놓을지 (정리할지)를 분간하기 위함이다. 결론 부터 애기하자면, __stdcall을 이요하면, callee측에서 sp를 정리하고, __cdecl을 이용하면, caller측에서 sp를 정리한다.
예를 들어보자.
반면 __stdcall의 경우는 대락 다음과 같이 구성된다.
Assembly code를 보면 알 수 있듯이, __cdecl은 함수가 return된 이후에, caller가 직접 sp를 정리하고, __stdcall은 callee측에서 정리를 해주기 때문에, caller 쪽에서는 함수가 return된 이후에 sp 정리 작업을 하지 않는다.
sp의 정리를 어느 쪽에서 하든, 차이가 없어보이지만 두가지 정도 차이가 생길 수 있다.
먼저, 속도와 관련된 문제이다. 8086 계열의 assembly 명령어 중,이라는 명령어가 있다. 이 명령어는 함수가 종료된 후, sp를 얼마만큼 add할지를 하나의 명령어로 만든것이다. __stdcall에서는 바로 이 명령어를 이용하여, 의 operation time만큼을 절약할 수 있으며, 그만큼 프로그램 사이즈도 줄일 수 있다 (물론, 한 단위로 보면 그 효과가 미비하지만, 그 수가 많아질 경우 어느정도 차이가 생길 수 있다).
다음으로, 가변 arguments의 지원 여부이다. __cdecl을 이용하면, caller측에서 sp를 정리하기 때문에, 가변 arguments를 지원할 수 있다.
사실, 몇가지 차이점이 더 있는 듯 하지만, 지금까지 파악된 부분은 이 두가지이다.
CALLBACK = WINAPI = PASCAL = __stdcall위에서 알 수 있듯이, MS Windows의 calling convetion은 __stdcall과 __cdecl로 나뉜다.
WINAPIV = __cdecl
이렇게 calling convetion을 둘로 나눈 이유는 함수 호출 후, stack pointer (sp)를 누가 원래데로 돌려놓을지 (정리할지)를 분간하기 위함이다. 결론 부터 애기하자면, __stdcall을 이요하면, callee측에서 sp를 정리하고, __cdecl을 이용하면, caller측에서 sp를 정리한다.
예를 들어보자.
SimpleFunction(TYPE arg1, TYPE arg2, TYPE arg3) { … }__cdecl의 경우, assembly code는 대략 다음과 같이 구성된다.
SimpleFunction(…);
push arg3
push arg2
push arg1
call SimpleFunction
Add sp, 12
반면 __stdcall의 경우는 대락 다음과 같이 구성된다.
push arg3
push arg2
push arg1
call SimpleFunction
Assembly code를 보면 알 수 있듯이, __cdecl은 함수가 return된 이후에, caller가 직접 sp를 정리하고, __stdcall은 callee측에서 정리를 해주기 때문에, caller 쪽에서는 함수가 return된 이후에 sp 정리 작업을 하지 않는다.
sp의 정리를 어느 쪽에서 하든, 차이가 없어보이지만 두가지 정도 차이가 생길 수 있다.
먼저, 속도와 관련된 문제이다. 8086 계열의 assembly 명령어 중,
다음으로, 가변 arguments의 지원 여부이다. __cdecl을 이용하면, caller측에서 sp를 정리하기 때문에, 가변 arguments를 지원할 수 있다.
사실, 몇가지 차이점이 더 있는 듯 하지만, 지금까지 파악된 부분은 이 두가지이다.
void *
c language의 powerful함을 잘 보여준다. void *는 모든 개체를 가리킬 수 있기 때문에 상속 관계에서 이 후에 어떤 데이터를 다룰지 예상할 수 없는 경우 유용하다. 상속받은 class에서는 void *에 할당된 개체가 무었인지를 알기 때문에 그에 맞게 적절히 casting하여 사용하면 된다.
Glyph
Text Editor와 관련된 코딩 중에 Glyph라는 term을 보았다. 대충 무슨 뜻인지 유추가 가능하였지만, 좀 더 자세한 뜻을 알기 위해서 검색을 해 보았다.
다음은 네이버 백과사전에 나온 Glyph (글리프)의 정의이다.
다음은 네이버 백과사전에 나온 Glyph (글리프)의 정의이다.
정보 기술에서 문자의 모양이나 형태를 나타내는 그래픽 기호. 부호화한 문자를 그림으로 나타낸 영문자나 숫자의 폰트 또는 기타 기호를 말한다. 문자는 뜻이나 소리가 있으나 글리프는 본래의 뜻이 없고 형태로 식별한다. 글리프를 사용하여 문자를 표시할 수 있다.
Subscribe to:
Posts (Atom)