読者です 読者をやめる 読者になる 読者になる

底辺過ぎてちょっとビビる

26歳からIT業界にいるエンジニアが、まったく成長できてないことを確認するブログ。備忘録的に使いたいとも考えています。

__fastcallとはなにか

今の現場では「C++Builder」で開発しているのだけど、独特のルールが結構ある。
Cで開発してばかりいると、なんだろこれ?といった感じで作業が止まる。

 



.cppファイルを見ていると、__fastcallという見慣れない宣言が関数名の前についている。

  • __fastcallってなんじゃらほい

C++Builderの.cppファイルの関数定義に「__fastcall」なる宣言が書いてある。

例)
void __fastcall ClassA::HogeHoge(int number)
{
    // 関数の処理
}

※調べたこと
・__fastcallとは「呼び出し規約」というもの


呼び出し規約には、
    cdecl(C規約)
    thiscall(C++メンバ関数規約)
    stdcall(Windows標準関数規約)
    fastcal(高速関数規約)l
    clrcall(.NET Framework専用規約)
がある。(他にもある)


・呼び出し規約を守ることで、C++で作成したDLLをVBで呼び出せるらしい


・なぜなら呼び出し規約は「関数の引数の引き渡し方、引数利用後の処理の仕方を制御する」から
 例:関数の呼び出し元では第1引数はレジスタに記憶する、第2引数はスタックに積むというような約束事を作ります。
関数の呼び出し先では、第1引数はレジスタ、第2引数はスタックというように約束事を守るように引数を取得します。
 このような「ルール」を作れば、違う言語に於ける引数の引渡しが可能になる。


・DLL関数が呼び出せない、という場合は関数の呼び出し元と呼び出し先で違う「ルール」を使っている為


・CやC++では「呼び出し規約」を意識せずに関数を作ると「cdecl」か「thiscall」になる。


・「fastcall」は主にPASCAL言語で利用される規約で、BorlandVCL(?)はfastcall。引数を優先してレジスタに積むため一般的に高速になる。
らしい。

※参考ホームページ
http://blogs.konuma.org/blog/2006/01/post_1fd3/

つまり、C++Builderで関数を作る場合、実装部分には「__fastcall」をつけないといけないということなんだろう。


VCLとは
VisualComponentLibraryの略称。

Borlandが、TurboPascalからDelphiへとコンパイラを進化させた際に作成されたWindows用クラスライブラリ。MicrosoftMFCと比較されることが多いが、

    Visualと言う名前の通り、作成画面で見たままのものがそのまま画面になる
    WindowsAPIの隠蔽度が高く、洗練されたクラスライブラリである
点で人気を博した。

現在では、Windowsのみならず、Linuxをもサポートする、CLXという次世代のクラスライブラリが登場している。

 

 

C++Builder 6コンポーネント活用ガイド&実践プログラミング (Vol.1)

C++Builder 6コンポーネント活用ガイド&実践プログラミング (Vol.1)

 
C++Builder6 コンポーネント活用ガイド&実践プログラミング〈Vol.2〉実践テクニック編

C++Builder6 コンポーネント活用ガイド&実践プログラミング〈Vol.2〉実践テクニック編