C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: C言語のinline関数に関して


(過去ログ 122 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■73055 / inTopicNo.1)  C言語のinline関数に関して
  
□投稿者/ 出口 (3回)-(2014/08/14(Thu) 09:39:40)

分類:[C/C++] 

これまでC言語のinline関数に関して、マクロと同じイメージだったんですけれども、
気になるところとして、例えば
void foo(int x)
{
int y= x*x*x;

}

call
int w = .....;
foo(ax[w]*ax[w] );

これで下記のようなコードが生成されるのでしょうか。

int y = ax[w]*ax[w]*ax[w]*ax[w]*ax[w]*ax[w];

実行速度の視点からすれば、とても非能率ですね。

ご教授いただければ幸いです。

引用返信 編集キー/
■73056 / inTopicNo.2)  Re[1]: C言語のinline関数に関して
□投稿者/ tinq (14回)-(2014/08/14(Thu) 10:06:45)
No73055 (出口 さん) に返信
インライン展開するかも含めてコードの生成はコンパイラ任せです
最近のコンパイラでは仕様に矛盾しない範囲ですごい最適化が行われることがあるので、実際のコードは逆アセンブルを読んでみないとわからないかと思います
http://d.hatena.ne.jp/embedded/20130622/p1

また、浮動小数点だったりするとまた違いが出てくる可能性もあるみたいです。
http://cpplover.blogspot.jp/2014/03/gccaaaaaa-aaaaaa.html
引用返信 編集キー/
■73070 / inTopicNo.3)  Re[2]: C言語のinline関数に関して
□投稿者/ tocs (42回)-(2014/08/15(Fri) 17:55:41)
tocs さんの Web サイト
No73056 (tinq さん) に返信

# 非効率というのがポインタ介したメモリアクセス回数の多さと
# 乗算が繰り返されていることを指していることと推測しました。

マクロはプリプロセサ、inlineはコンパイラで処理される全くの別物です。
展開如何についてはマクロには記載内容が当てはまりますが、inlineの場合そうと限りません。
コンパイラ依存の一言に尽きます。
また例え上のように展開されても、最適化オプションが設定されていればマクロであれinlineであれ、
一般的なコンパイラでは上記展開コードをSIMDを使う等して最適化掛かります。

inlineは関数呼び出しオーバーヘッドが掛からないことがメリットなのであって、
最終結果が最適化された状態にするにはコンパイラによっては一旦自動変数で受ける等も必要です。
本当にパフォーマンスを気にするところであれば通常トライandエラーで最適化状況を確認すると
思いますので記載内容の通りになったとしてもそれが問題になることはありません。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -