複数の関数間での呼び出しは通常、システムスタックに高位アドレスから低位アドレスに向かって、積まれるそうだ。(例のpush-pop)。この作業に時間がかかり、場合によってはオーバーヘッドの一因になるそうな。(オーバーヘッド?)
上記の場合を避けるために、簡単な処理であればマクロを使ってインライン関数化するのがいいそうだ。
では、どうするか。
組み込み型データのコピーはビットコピーするだけだから、単純な操作であろう。しかし、オブジェクトのコピーはそうはいかないようだ。
Cでは、こんな感じ。
int summation(int a,int b){
int sum=a+b;
return sum;
}
こいつを
#define summation(int a,int b) {(a)+(b)} としてやる。
関数定義の前にインライン関数を定義する方法。
#include<iostream>
using namespace std;
//インライン関数を定義
inline int add(int i,int j){return i+j;}
int main()
{
int result;
result=add(5,3);//add関数を呼び出す
cout<<result<<endl;
return 0;
}
すごいのはインラインが自動的に行われることだ。短かく定義されたメンバ関数をコンパイラによって、自動的にインライン化される。
#include<iostream>
using namespace std;
class tester{
int i,j;
public:
sample(int a,int b);
//クラス定義内で定義されたインライン関数
int add(){return i+j;}
};
sample::sample(int a,int b)
{
i=a;j=b;
}
と簡単に述べてみたが、インライン関数の本当の意味は現時点の筆者のレベルからすると理解しがたい点が多いため、更なる勉強が必要だ。
No comments:
Post a Comment