gcc v4.8.1 の使用
私が行った場合:
//func.hpp
#ifndef FUNC_HPP
#define FUNC_HPP
int func(int);
#endif
//func.cpp
#include "func.hpp"
int func(int x){
return 5*x+7;
}
//main.cpp
#include <iostream>
#include "func.hpp"
using std::cout;
using std::endl;
int main(){
cout<<func(5)<<endl;
return 0;
}
単純な関数でさえfunc
インライン化されません。inline
、extern
、static
、およびプロトタイプおよび/または定義の組み合わせはこれを変更しません__attribute__((always_inline))
(明らかに、これらの指定子のいくつかの組み合わせにより、コンパイルおよび/または警告が生成されず、それらについては話されません)。アセンブリ出力にg++ *.cpp -O3 -o run
andを使用しています。g++ *.cpp -O3 -S
アセンブリの出力を見ると、まだcall func
. 関数を適切にインライン化する唯一の方法は、ヘッダー ファイルにプロトタイプ (おそらく必要ない) と関数の定義を含めることです。ヘッダーがプログラム全体の 1 つのファイルにのみ含まれている場合 (main.cpp
例としてのみ含まれている場合)、それはコンパイルされ、関数は必要なくても適切にインライン展開されます。inline
指定子。ヘッダーが複数のファイルに含まれる場合、inline
指定子は複数の定義エラーを解決するために必要なようであり、それが唯一の目的のようです。関数はもちろん適切にインライン化されています。
だから私の質問は:私は何か間違ったことをしていますか?何か不足していますか?何が起こったとしても:
「コンパイラはあなたよりも賢いです。関数をインライン化する必要がある場合をあなたよりもよく知っています。そして、C 配列を決して使用しないでください。常に std::vector を使用してください!」
- 他のすべての StackOverflow ユーザー
本当に?func(5) を呼び出して結果を表示するほうが、単に 32 を出力するよりも速いのでしょうか? 私は盲目的に崖の端からあなたをフォローします。
記録のために、上記のコードは単なる例です。私はレイ トレーサーを作成しています。数学およびその他のユーティリティ クラスのすべてのコードをヘッダー ファイルに移動し、inline
指定子を使用すると、パフォーマンスが大幅に向上しました。一部のシーンでは、文字通り 10 倍高速です。