Ⅰ. 캐논(Canon)

⑴ EF(Electric Focus)
전기적인 방식으로 초점을 맞춘다는 의미로 캐논의 AF 렌즈 앞에 붙는 이름이다. 참고로 EOS는 Electric Optical System의 약자이다. '에오스' 라고 발음되는 EOS는 그리스 신화에서 빛의 여신을 뜻한다고 한다.
EF 100mm F2 USM

⑵ USM(Ultra Sonic Motor)
초음파 모터, 렌즈를 구동시키는 모터로 대구경렌즈나 초망원렌즈에 적합한 링 USM과 렌즈의 소형화를 가능케 한 마이크로 USM 2종류를 사용했다. 초음파 모터를 이용하면 렌즈를 구동시키는 기어를 줄이거나 없앨 수 있고, 소음도 평균 43dB 정도로 최소화 할 수 있다. 또한 포커싱 속도도 무척 빠르다.
EF 200mm F1.8L USM

⑶ L(Luxury)
호화, 사치품이라는 뜻으로 이름 그대로 대단히 사치스러운 렌즈다. 각종 특수재료와 기법(예를 들면 비구면 렌즈라든가 초저분산 유리, 특수코팅, 초음파 모터 등)의 기술을 동원해 만든 고급렌즈다. 대단히 우수한 성능으로 전문가들의 절대적인 찬사를 받고 있다. (L 렌즈에는 광각과 광각계 줌렌즈에는 비구면을, 망원과 망원 줌에는 초저분산 유리(UD: Ultra-low Dispersion)를 쓰고 있다. 물론 초음파 모터도 함께 쓰인다.
EF 20mm F2.8L USM

⑷ IS(Image Stabilizer)
렌즈의 흔들림으로부터 안정된 이미지를 얻기 위하여 렌즈의 흔들림이 발생할 때 정교한 흔들림을 추적, 자이로스코프 센서가 작동하여 불안정성을 중화시키는 작용을 하는 렌즈를 말한다.
EF 75-300mm F4-5.6 IS USM

⑸ TS-E(Tilt & Shift for EOS)
대형 카메라의 틸트, 시프트 효과를 이용할 수 있는 특수렌즈다. EOS용 렌즈이긴 하지만 AF는 되지 않으며 광학적으로도 매우 우수한 렌즈로 현재 3가지가 발매되고 있다. ? TS-E 45mm F2.8

Ⅱ. 니콘(Nikon)
⑴ Ai(Automatic Indexing)
니콘 렌즈에 표기되어 있는 것으로 촬영 전까지 렌즈 조리개가 개방 상태를 유지하다가 촬영 순간 자동적으로 해당 조리개 수치만큼 자동적으로 움직이는 현상을 말하는 것으로 AF 카메라 출시 이후 나온 수동렌즈를 비롯한 모든 AF 렌즈에 이 이름이 따라다닌다.
Ai AF Nikkor 85mm F1.4D (IF)

⑵ Nikkor
니콜, 니콘에서 만든 렌즈에 따라붙는 이름으로 단순히 니콘에서 제작한 렌즈라는 의미의 상표라고 한다.

⑶ ED(Extra-low Dispersion)
초저분산의 의미로 망원렌즈에서 발생하는 색수차를 줄이기 위해서 수차가 매우 적은 특성을 가진 특수 유리를 가공하여 만든 렌즈를 말한다. 여기에 쓰이는 형석이라는 광물질이 이상적인 초저분산 특성을 가지고 있으나, 이것은 천연광물로 구하기도 쉽지 않고 견고하지 못해서 가공에 어려움이 많다. 때문에 현재는 형석의 광학적 특성을 모방한 인공형석으로 ED 렌즈를 제조하며 보통 망원렌즈 중 1∼4매 정도를 삽입하여 제조한다. 비슷한 용어로 AD(Anomalous Dispersion, 미놀타), UD(Ultra-low Dispersion, 캐논), LD(Low Dispersion, 탐론), SD(Super-low Dispersion, 토키나), ULD(Ultra Low Dispersion, 미미야) 등으로 제각기 다르게 부르는데 그 특성도 아주 조금씩 틀리다고 한다.
Ai AF Nikkor ED 180mm F2.8D (IF)

⑷ D(Dimension 차원)
니콘의 새로운 3차원 8분할 측광을 지원하는 렌즈의 명칭으로 니콘의 F5, F90기종에서 이 D렌즈를 사용할 경우 노출측정에 있어 거리정보를 읽어 노출값을 결정해주는 기능이 있다. 이전 렌즈는 비록 명칭하지 않기도 하지만 S 렌즈라고 말한다. 이것은 Segment의 약자로 기존 5분할 측광을 지원한다는 뜻이다.
Ai AF Nikkor 85mm F1.4D (IF)

⑸ AF-I(Auto Focus-Internal motor)
모터내장형 렌즈를 말하며, 캐논의 렌즈처럼 초점을 구동시키는 모터가 렌즈 내에 내장된 형태의 렌즈이다. 최근 니콘은 대구경 망원렌즈의 초점속도를 향상시키기 위해 모터를 내장한 렌즈를 선보이고 있다.
Ai AF-I Nikkor ED 400mm F2.8D (IF)

⑹ AF-S(Auto Focus-Silent motor)
저소음 모터내장형 렌즈로 역시 캐논의 렌즈처럼 소음이 극히 적은 모터(USM)를 내장한 렌즈이다. 기존의 AF-I형 렌즈에 소음이 극히 적은 초음파 모터로 대체시켰다. 현재까지 4종의 대구경 망원렌즈가 AF-S 형태의 렌즈로 개조되었으며, 앞으로 계속해서 늘어날 전망이다. 최신형 F5 와 100% 호환이 가능하다.
Ai AF-S Nikkor ED 400mm F2.8D (IF)

⑺ DC(Defocus Image Control)
일부 구성 렌즈의 이동으로 초점면을 제외한 전후 흐림을 조절할 수 있는 렌즈로 보통 렌즈에서 피사계 심도는 조리개를 통해서 그 범위를 조절하나 DC 렌즈는 범위뿐만 아니라 피사계 심도의 적용위치, 피사체 앞과 뒷 배경의 피사계 심도까지 지정해서 조절 할 수 있다.

Ⅲ. 펜탁스(Pentax)
⑴ SMC(Super Multi Coating)
다층막 코팅, 렌즈의 각종 수차와 왜곡, 난반사를 방지하고자 렌즈 표면에 7겹의 특수 코팅을 한 렌즈로 팬탁스의 거의 모든 렌즈들은 SMC 렌즈들이다.
SMC A 50mm F1.2

⑵ M(Manual)
전형적인 수동렌즈를 말하며 메뉴얼 노출과 조리개 우선 자동노출을 지원한다.
SMC M 50mm F1.4

⑶ A(Automatic)
메뉴얼과 조리개 우선은 물론 셔터 우선 자동노출과 프로그램 자동노출을 지원한다. 80년대 초반부터 A 시리즈 렌즈가 출시되었는데 Aperture 의 약자라고도 한다.
SMC A 50mm F1.4

⑷ FA
펜탁스의 신형 AF 렌즈 명칭이다. 이전 버전의 AF로 F형 렌즈가 있었다.
FA 50mm F1.4

⑸ *
* 표시는 펜탁스 렌즈 중에서도 고급형 렌즈에 붙는 표시다.
FA* 85mm F1.4 (IF)

⑹ AL(Aspherical Lens)
비구면 렌즈로 광각에서의 구면수차를 줄이기 위해 렌즈의 곡면을 비구면(구면이 아닌)으로 깍아서 만든 렌즈다. 다른 메이커에서는 AS(ASpheric)렌즈라고도 하며, 니콘은 별다른 명칭없이 사용하고 캐논은 L 렌즈에 속해있다.
FA* 28-70mm F2.8 AL

Ⅳ. 미놀타(Minolta)
⑴ xi zoom
미놀타의 xi 기종(7xi, 9xi)을 위한 자동렌즈로 모터에 의한 자동 줌과 자동 초점이 가능한 렌즈로 xi 시리즈 출시 당시 5종의 렌즈가 발표되었다.
AF Zoom xi 28-80mm F4-5.6

⑵ High Speed AF
말 그대로 고속 AF를 가능하도록 설계된 렌즈다. 보통 대구경 망원과 망원 줌 렌즈에 적용되고 있다.
High Speed AF 200mm F2.8G APO

⑶ G
어디에도 정확하게 G를 설명한 부분은 없으나 Gallant 혹은 Glorious로 말하는 사람들이 있으며, 렌즈의 금테 띠를 보고 Gold라고 추측하기도 한다. 아무튼 캐논의 L 렌즈와 마찬가지로 고급 렌즈를 통칭하는 말이다.
AF 85mm F1.4G

⑷ APO(Apochromatic)
색수차를 유발하는 주요색인 3색(빨강, 파랑, 녹색)의 색수차를 보정한 렌즈를 말한다. 비슷한 용어로 2색 보정 렌즈인 Achromatic이 있는데 하셀블라드용 칼 자이스 렌즈에 쓰이고 있다.
AF 200mm F2.8G APO

DC : Defocus Control 연초점 조절 기능이 있는 렌즈

Boost Libraries

Boost 설치빌더

어느 라이브러리가 어느 컴파일러에서 동작하는가를 이해 하는 것에는Compiler Status의 페이지를 봐라.
어느 헤더가 다른 어느 boost 의 헤더를 포함 하고 있는 가를 이해 할려면Header Dependencies의 페이지를 봐라.
라이브러리의 다운로드와 인스톨에 대해서 이해 할려면Download and Installation의 페이지를 봐라.
필요 하다면라이브러리의 오브젝트 파일을 빌드 하는 방법을 이해 할려면Building Boost Libraries 의 페이지를 봐라.

개인가의Boost 라이브러리의 도큐먼트는아래의 형식으로 이용 가능하다.:

* 한글로번역된부분은번역이되었으며, 아직일본어로적혀있는것은번역을하지못한것입니다.


알파벳 순 라이브러리 리스트

  • any 다른형의하나의값을보관가능하며, 안전하므로범용적인보관물(C#박싱/언박싱과비슷함). Kevlin Henney .  예제
  • addressof buile-in 변수사용자정의변수의메모리주소를간단하게얻어있다.
  • array STL에 준거한 정수 사이즈의 배열의 랩퍼 컨테이너. Nicolai Josuttis 만듬.    예제
  • bind and mem_fn - 関数、オブジェクト、ポインタ、メンバ関数のための汎用的なバインダ。 Peter Dimov
  • call_traits 함수의인수, 반환값을위해적절한(type)정의한다. John Maddock, Howard Hinnant, et al 만듬
  • compatibility - 標準に準拠しないプラットフォームでのライブラリの利用に役立つ。Ralf Grosse-Kunstleve and Jens Maurer
  • compose - STL の為の関数合成アダプタ Nicolai Josuttis
  • compressed_pair - 空メンバを最適化する std::pair の拡張。John Maddock, Howard Hinnant, et al
  • concept check - ジェネリックプログラミングのためのツール群。 Jeremy Siek
  • config - boost ライブラリの開発者がコンパイラの特質に適応するのを助ける。 ライブラリのユーザのためのものではない。
  • conversion - 数学的、多相的、辞書的キャスト Dave Abrahams and Kevlin Henney
  • crc - CRC(巡回冗長コード) Daryle Walker
  • date_time - 日付/時間ライブラリ Jeff Garland
  • dynamic_bitset - std::bitsetの動的サイズ版。 Jeremy Siek and Chuck Allison
  • filesystem - 移植性のあるパス、 ディレクトリに対する繰り返し操作、その他の役立つファイルシステム操作。 Beman Dawes
  • format - 型安全な printf 風の書式化操作。Samuel Krempp
  • function 지연 호출 급 콜백을 위한 함수 오브젝트 랩퍼.Doug Gregor
  • functional - 機能強化されたファンクションオブジェクトアダプタ。 Mark Rodgers
  • graph - 汎用グラフコンポーネント及びアルゴリズム。 Jeremy Siek and a University of Notre Dame team
  • integer - 汎整数型を簡単に扱うためのヘッダ。
  • interval - 数字の範囲に対する通常の数学関数の拡張。Guillaume Melquiond, Hervé Brönnimann, Sylvain Pion
  • io state savers - 入出力の状態を保存して、データが化けるのを防ぐ。 Daryle Walker
  • iterator adaptors - 標準に準拠したイテレータの定義を手助けしたり、拡張したりする。 Dave Abrahams, Jeremy Siek, and John Potter
  • lambda - 実際の呼び出し時の、小さな無名関数オブジェクトの定義。, from Jaakko Jävi and Gary Powell.
  • math - 数学の領域での多くの貢献。様々な作者による。
  • math/common_factor - 最大公約数と最小公倍数。 Daryle Walker
  • math/octonion - 八元数。 Hubert Holin
  • math/quaterion - 四元数。 Hubert Holin
  • math/special_functions - 特殊な数学関数。atanh, sinc, sinhc など。 Hubert Holin
  • mpl - テンプレートメタプログラミングのフレームワーク。 コンパイル時アルゴリズム、シーケンス、メタ関数クラス。 Aleksey Gurtovoy
  • multi_array 메모리상에서배열을위한차원컨테이너와어댑터. Ron Garcia 만듬.   예제
  • operators - 算術クラスやイテレータに適切な演算子を簡単に定義できる要にするテンプレート。 Dave Abrahams and Jeremy Siek
  • optional - 追加の値のための、識別された union のラッパ。 Fernando Cacciola
  • pool 메모리 Pool 관리. Steve Cleary
  • preprocessor - 繰り返しと再帰を含むプリプロセッサメタプログラミングツール群。 Vesa Karvonen
  • property map - キーオブジェクトを値オブジェクトにマップする、コンセプトにより定義されたインタフェース。 Jeremy Siek
  • python - C++ クラスと関数を Python に反映する。Dave Abrahams
  • random 난수생성. Jens Maurer .                예제
  • rational - 有理数クラス。 Paul Moore
  • ref - 参照を汎用関数に渡すためのユーティリティライブラリ。 Jaako Järvi, Peter Dimov, Doug Gregor, and Dave Abrahams
  • regex - 正規表現ライブラリ。 John Maddock
  • signals - 管理されたシグナルとスロットのコールバックでの実装。 Doug Gregor
  • smart_ptr - 5つのスマートポインタクラステンプレート Greg Colvin, Beman Dawes, Peter Dimov, and Darin Adler
  • static_assert - 静的アサート(コンパイル時アサート) John Maddock
  • spirit - LL 構文解析器のフレームワーク。 インラインの C++ EBNF の文法を直接解析する。 Joel de Guzman and team
  • test - 単純なプログラムテスト、完全なユニットテスト、プログラム実行のモニタのサポート。 Gennadiy Rozental
  • thread - 移植性のある C++ マルチスレッド。 William Kempf
  • timer - イベントタイマ、プログラムタイマ、 進行表示クラス。 Beman Dawes
  • tokenizer - 文字列や他の文字シーケンスを、一連のトークンに分割。 John Bandela
  • tuple - 複数の値を返す関数の簡単な定義など。 Jaakko Jävi
  • type_traits - 型の基本的な特徴のためのテンプレート。 John Maddock, Steve Cleary, et al
  • uBLAS - 密行列、疎行列、圧縮された行列のための基本的な線形代数。 Joerg Walter and Mathias Koch
  • utility - クラス noncopyablechecked_delete(), checked_array_delete(), next(),, prior() 関数テンプレートと、成句: base-from-memberDave Abrahams and others

  • Japanese Translation Copyright (C) 2003 Kohske Takahashi

    라이브러리에링크된예제는 http://www.kmonos.net/pub/BoostBook/ 여기에소개하는책에있는예제입니다.

    한글번역 : 흥배 2003 jacking@korea.com(msn : jacking75@msn.com)

    출처 : http://ngpiki.ngps.net/index.php?display=프로그래밍%20조각지식

    프로그래밍 조각지식

    malloc & calloc

    일반적으로 C++이 도입되면서 malloc 과 free라는 함수의 사용빈도는 많이 줄어들고 있지만 클래스 기반이 아닌 오리지널 C나 C/C++의 중간 개념적인 소스의 경우 여전히 malloc와 free에 의해 메모리 할당, 해제를 하게 됩니다.(개인적으로는 malloc가 더 편하다는 -_-;;)

    malloc라는 함수의 존재를 알고 있으면서도 calloc라는 함수에 대해선 모르고 지나치는 사람들이 많이 있는데 malloc와 calloc는 같은 맥락의 함수이지만 약간의 차이점을 가지고 있습니다.

    malloc는 지정된 크기만큼의 메모리를 할당하지만 그 메모리 자체가 초기화 되어지지 않은체로 그저 공간만이 할당되는 역할을 하는 반면 calloc는 malloc과 마찮가지로 지정된 크기만큼의 메모리를 할당하면서 할당된 메모리를 모두 0으로 체워서 반환합니다. 간단하게 말하면 malloc 와 memset 을 (또는 bzero ) 한번에 사용 해 놓은 것이죠.

    단, malloc 보다는 calloc 가 조금 더 느리다고 합니다.

    TODO 메크로

    헤더에 다음과 같은 메크로를 추가해 놓습니다.

    #define LINE1(x) #x  
    #define LINE(x) LINE1(x)
    #define TODO(msg)   message ( __FILE__"(" LINE(__LINE__)  "): [TODO] " #msg ) 
    #define NOTE(msg)   message ( __FILE__"(" LINE(__LINE__)  "): [NOTE] " #msg ) 

    소스 파일에서 메크로 사용은 다음과 같습니다.

    #pragma TODO( "여기에 적어 놓을 말을 적습니다." 

    그리고 소스 파일에 다음에 해야할 일이나 특이사항들을 적어 두면 컴파일시 output 창에 나타납니다. 그리고 output창에 나온 메시지를 더블클릭하면 해당 라인으로 이동합니다. 급하게 메모해야할 일이 있으면 유용한 메크로가 되지 않을까 합니다.

  • 관련링크VS.NET의 TODO 주석 기능을 이용하자. - http://jacking75.cafe24.com/Tip/VS_NET-TODO.htm
  • 파일읽기 버퍼 오버플로우 방지 팁

    fscanf()등 파일에서 읽기 작업을 할때 보통 이런식으로 많이 사용합니다.

    FILE * fp = fopen( "test.dat", "r" ); if( fp == NULL )         return; fscanf( fp, "%s", szBuf ); 

    이때 버퍼를 넘어서 입력값이 들어올 수 있습니다. 이는 입력수를 제한하여 오버플로우를 방지할 수 있습니다.버퍼의 크기가 256이라고 한다면,

    fscanf( fp, "%255s", szBuf ); 

    이런식으로 크기를 제한하여 사용하면 간단히 막을 수 있습니다.그러나 버퍼의 크기가 바뀐다면 하드코딩된 부분 또한 바꾸어야 합니다. 이를 좀더 편하게 하기 위해서 다음과 같이 합니다.

    char szFormat[128]; 
    sprintf( szFormat, "%%%ds", sizeof( szFormat )-1 );
    fscanf( fp, szFormat, szBuf );

    "%%%ds"를 간단히 설灼玖? 맨앞의 %%는 %로 만들기 위해 넣는 부분이고 다음의 %d는 사이즈 수를 받기 위한 부분입니다. 그리고 마지막 s를 넣어 format을 완성하는 것이죠. 위와 같이 하면 szFormat에는 "%255s"와 같은 값이 들어갑니다.이렇게 하여 보다 유연하고 안전한 파일읽기가 가능합니다.

    VC++ 프로젝트에서 Visual Source Safe 삭제 방법

    시작하기에 앞서 파일들이 읽기전용이면 이를 풀어줍니다.

    VC++ 6.0 프로젝트에서 Visual Source Safe 삭제 방법

    1) 프로젝트 폴더에 있는(하위폴더 포함) *.scc 파일을 모두 삭제 합니다.

    보통 프로젝트 메인 폴더에 mssccprj.scc 파일이 있고, 각 폴더마다 vssver.scc 파일이 있습니다. 하위 폴더까지 이 파일이 있으니 검색을 통해서 모두 삭제하세요.

    2) *.dsw 파일을 열어 Source Safe 정보를 삭제합니다.

    *.dsw 파일을 메모장으로 열어보면 아래와 같은 부분이 있습니다.

    begin source code control ....(중략) end source code control 

    이부분을 삭제합니다.

    3) 모든 *.dsp 파일을 열어 Source Safe 정보를 삭제합니다.

    *.dsp 파일을 메모장으로 열어보면 아래와 같은 부분이 있습니다.

    # PROP Scc_ProjName "(어쩌고저쩌고)" # PROP Scc_LocalPath "." 

    이 부분을 삭제합니다.

    VC++ .NET 2003 프로젝트에서 Visual Source Safe 삭제 방법

    1) 프로젝트 폴더에 있는(하위폴더 포함) *.scc 파일을 모두 삭제 합니다.

    VC++ 6.0과 동일합니다.

    2) *.sln 파일을 열어 Source Safe 정보를 삭제한다.

    *.sln 파일을 메모장으로 열어보면 아래와 같은 부분이 있습니다.

    GlobalSection(SourceCodeControl) = preSolution ...(중략) EndGlobalSection 

    이부분을 정확하게 찾아서 삭제합니다.

    3) 모든 *.vcproj 파일을 열어 Source Safe 정보를 삭제한다.

    *.vcproj 파일을 메모장으로 열어보면 아래와 같은 부분이 있습니다.

    SccProjectName="(어쩌고저쩌고)" SccLocalPath="." 

    이부분을 삭제합니다. 보통 뒤에 '>' 이게 있는데 이건 지우면 안됩니다. 정확하게 해당 부분만 지우세요.

    스트링의 해시 값 구하기

    배열크기(NHASH)와 해시 값에 곱해지는 값(MULTIPLIER)과 가능하면 데이터 값들이 서로 공통된 약수를 가지지 않도록 하여 균등하게 분산시킬 수 있게 한다. 그러므로 곱해지는 값을 소수로 잡는다. ASCII 스트링의 경우 31과 37이 좋다.

    enum { MULTIPLIER = 31 }; // or 37 
    unsigned int hash( char * str )
    {    
    unsigned int h = 0;    
    // 해시 값이 양수가 되게 하기위해 unsigned char로 변환    
    unsigned char * p = NULL;    
    for( p = ( unsigned char * ) str; *p != '\0'; p++ )        
    h = MULTIPLIER * h + *p;    
    return (h % NHASH); }

  • 관련링크http://www.gpgstudy.com/forum/viewtopic.php?t=795
    http://www.flipcode.com/cgi-bin/msg.cgi?showThread=Tip-HashString&forum=totd&id=-1
  • 2차원 배열 동적 할당

    이 내용은 게임 개발자를 위한 C++ (민프레스, 서진택 저)에서 가져온 것입니다.

    • 첫번째 방법

    int (*pArray1)[3]; pArray1 = new int[2][3]; 
    // ok delete [] pArray1; int (*pArray2)[3][4];
    pArray2 = new int[2][3][4];
    // ok delete [] pArray2;

    이렇게 할당하면 맨끝 인덱스가 고정되어야 하는 단점이 있다.

    참고

    int (* pointer)3 => 크기가 3인 정수 배열의 배열의 시작주소 :
    pointer + 1 == pointer1 int * pointer3 => int * 를 요소로 가지는 일차원 배열

    • 두번째 방법

    double ** pData =  NULL;
    pData = new double*[nSize1];
    for( int i = 0; i < nSize1; i++ )     pData[i] = new double[nSize2];
    // ... for( int j = 0; j < nSize1; j++ )     delete [] pData[j];
    delete [] pData;

    가장 일반적인 방법이다. 이 방법이 가장 이해하기 쉽다.

    • 세번째 방법

    하나의 일차원 배열을 렙퍼하는 형식의 클래스를 만들고 그 클래스를 또 일차원 배열로 만들면 관리하기 편하고 조금 더 직관적인 코드를 만들 수 있다.

    class CInt { public:     
    CInt( int nSize = 10
    { m_pArray = new int[nSize]; m_nSize = nSize; }    
    ~CInt() { delete [] m_pArray; }    
    int & operator[]( int nIndex ) 
    { return m_pArray[nIndex]; }
    private:     int * m_pArray;     int m_nSize; };
    // main CInt * pInt; pInt = new CInt[3];
    // ... pInt[i][j] 로 사용. delete [] pInt;

    참고기본 new 연산자를 이용하여 디폴트 생성자가 없는 클래스를 동적 배열 할당으로 만들 수 없다.

    크리티컬세션을 사용할때 기억해야할 한마디

    크리티컬세션을 사용할때 이말을 상기하자.

    "크리티컬세션은 코드에 거는 것이 아니라 리소스에 거는 것이다."

    "이중 크리티컬 세션은 되도록 사용하지 말라. 데드락의 위험이 있다. 혹시 사용하게 된다면 모든 곳에서 각 크리티컬 세션을 똑같은 순서로 Lock하고 UnLock하게 하라."

    예)
    csResource1.Lock();
    csResource2.Lock();
    ...
    csResource2.UnLock();
    csResource1.UnLock();

    ...

    /************
    csResource2.Lock();
    csResource1.Lock(); // 데드락 위험!!
    **************/
    csResource1.Lock();
    csResource2.Lock();
    ...
    csResource2.UnLock();
    csResource1.UnLock();

    typename 키워드

    typename 키워드는 다음에 나오는 식별자가 타입이라는 것을 명시하기 위해 사용된다. 예를 보면,

    template< class T >
    class MyClass {    
    typename T::SubType * ptr;
       // ... };

    여기서 typename은 SubType이 class T의 서브 타입이라는 사실을 명확하게 한다. 그래서 ptr 변수는 T::SubType 타입의 포인터가 된다. 물론 타입 T 안에 SubType가 정의 되어야 한다. typename 키워드를 빼버린다면, SubType는 static 변수로 간주된다. 그래서 붙이지 않을 경우

    T::SubType * ptr; 

    은 타입 T의 SubType static 변수와 ptr과 곱한 결과로 인식한다.

    말이 안되는 것 같지만 컴파일러는 typename이 없다면 값으로 판단하기 때문에 반드시 필요하다. VC 6.0에서는 크게 문제가 없었지만, VC.NET 2003에서는 반드시 typename을 적어주어야한다.

    C와 C++의 비용 모델

    The Practice of Programming 라는 책에 보면 각 C와 C++의 연산이나 함수의 비용을 수만번 실행해서 평균값을 적어 놓은 것이 있습니다. 테스트를 250MHz MIPS R10000이라는 컴퓨터 사양으로 했다고 합니다. 컴퓨터가 일반적으로 사용하는 Intel x86이 아니라서 아쉽지만, 일단 참고삼아 볼 수 있고 궁금하면 테스트를 해보면 되니 여기에 적어 봅니다. (단위는 nanoseconds 입니다.)

    Int operations

    i1++;8
    i1 = i2 + i3;12
    i1 = i2 - i3;12
    i1 = i2 * i3;12
    i1 = i2 / i3;114
    i1 = i2 % i3;114

    Float Operations

    f1 = f2;8
    f1 = f2 + f3;12
    f1 = f2 - f3;12
    f1 = f2 * f3;11
    f1 = f2 / f3;28

    Double Operations

    d1 = d2;8
    d1 = d2 + d3;12
    d1 = d2 - d3;12
    d1 = d2 * d3;11
    d1 = d2 / d3;58

    Numeric Conversions

    i1 = f1;8
    f1 = i1;8

    Integer Vector Operations

    v[i] = i;49
    v[v[i]] = i;81
    v[v[v[i]]] = i;100

    Control Structures

    if( i == 5 ) i1++;4
    if( i != 5 ) i1++;12
    while( i < 0 ) i1++;3
    i1 = sum1( i2 );57
    i1 = sum2( i2, i3 );58
    i1 = sum3( i2, i3, i4 );54

    Input/Output

    fput( s, fp );270
    fgets( s, 9, fp );222
    fprintf( fp, "%d\n", i );1820
    fscanf( fp, "%d", &i1 );2070

    Malloc

    free( malloc( 8 ) );342

    String Functions

    strcpy( s, "0123456789" );157
    i1 = strcmp( s, s );176
    i1 = strcmp( s, "a123456789" );64

    String/Number Conversions

    i1 = atoi( "12345" );402
    sscanf( "12345", "%d", &i1 );2376
    sprintf( s, "%d", i );1492
    f1 = atof( "123.45" );4098
    sscanf( "123.45", "%f", &f1 );6438
    sprintf( s. "%6.2f", 123.45 );3902

    Math Functions

    i1 = rand();135
    f1 = log( f2 );418
    f1 = exp( f2 );462
    f1 = sin( f2 );514
    f1 = sqrt( f2 );112

    MS VC++에서 __int64 값 출력하기

    만약 MS VC++에서 __int64를 printf() 등으로, 값을 출력하고자 할때 %d 로 출력을 하면 4바이트만 출력된다. 더욱 %d 뒤에 또 다시 %d 가 나왔을때 뒤 부분의 값은 올바르게 출력되지 않는다. 아마, %d 가 4바이트를 기준으로 끊어버리기 때문인 듯하다.

    그럼 __int64 를(unsigned __int64 도 마찬가지 이다.) 출력하고자 한다면 64비트라는 것을 알려줘야 한다. 이것을 해주는 것이 MS VC++에서는 %I64d 이다 I64 가 64비트라는 것을 알려준다.

    __int64 n64SumVal;
    ...
    printf( "Val: %I64d", n64SumVal );

    + Recent posts