痔になりやすい生活習慣とは?

インライン展開すると、関数の呼び出しオーバーヘッドが小さくなることはわかるのですが、インライン展開した場合としていない場合と、なぜ関数呼び出しのオーバーヘッドがなくなるのかアセンブルレベルでの違いがよくわからないです。

関数をインライン展開した場合、コンパイラはどのようにコンパイルするのか、そしてその関数実行時の振る舞いがインライン展開なしの場合とどう違うのか、わからないので教えていただけませんか?

以上、よろしくお願いします。

A 回答 (4件)

簡単に言うと


1.引数のコピー処理
2.CALL命令
3.戻り値のセット処理
4.RET命令
の分が多くなります。

変な例えですが、冷蔵庫を家の外に置いておくと、上着を着て履物を履いて出て行き、戻ると履物を脱いで、上着を脱ぐといったようなものです。

上の1の引数のコピー処理はCall by value(値渡し)の場合におこります。
    • good
    • 0

#2: loopのun-rollとinlineは別物じゃないですか?

    • good
    • 0

引数や返却値のコピーとサブルーチンの往復に関しては既に別の方が回答されていますが、それ以外にも違いが現れます。



インライン関数を呼び出す部分をコンパイルする際、コンパイラは呼び出そうとする関数の中身のことまで全て分かることになります。これによって関数の枠組みを超えた最適化が可能になります。
関数の枠組みを超えた最適化は、引数に定数式を渡した場合等に最も顕著になり、場合によっては関数の呼び出しが単なる定数として展開される可能性もあります。
他に、例外処理に関しても大きな影響が現れます。例外指定によって明示的に例外が発生しないことを宣言しない限り、通常の関数であればあらゆる例外が発生するものとして、それに対応するために処理を展開する必要がありますが、インライン関数であれば、関数の中身が分かっていますから、可能であれば例外が発生しないものとして扱うことが可能になります。これによって(多くの場合)速度もサイズも大幅な改善が可能になります。
    • good
    • 0

単純な例でいいますと、こうなります。


for(i=0;i<10;i++) { func(); }

funcの中身;funcの中身;funcの中身;funcの中身;funcの中身;funcの中身;funcの中身;funcの中身;funcの中身;funcの中身;
のようになります。
上記の例ですと、i変数を使ってループしていますが、i変数を加算したり評価したりする部分、
そして、関数のcall、引数のセット等、ret がなくなり、その分だけ速度が向上します。

しかし、funcの中身が大きかったりループ数が多ければ
命令がL1キャッシュに入りきらず、かえって速度が低下することがあるので
コンパイラはそのあたりも自動的に判断します。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q実行ファイルのパスを取得したい

C言語で自分自身がどのディレクトリに存在しているか
知りたいのです。

簡単に例を挙げて説明します。

UNIX C言語で cmd1 という実行ファイルを作成しました。
環境変数は以下のように定義されていたとします。
PATH=/bin:/usr/bin

/binにcmd1を配置してカレントディレクトリ/homeにおいて
cmd1を実行、cmd1プログラム内で"/bin/cmd1" を取得したいのです。
続けて、/bin/cmd1を/usr/bin/cmd1移動して、cmd1を実行すれば、
プログラム内で"/usr/bin/cmd1"を取得できるコーディングをしたいのです。

typeコマンドのような事をC言語で行いたいのですが。

お分かりの方いらっしゃいましたら教えてください。

よろしくお願いします。

Aベストアンサー

>C:\WINDOWS\COMMAND\CMD1.EXE
>と表示されます。
>この違いはなんだろう?

C:\windows\commandってフォルダに突っ込んでる時点でOSがぜんぜん違いますよね。
Win9xとNT系じゃ。

9x系はフルパスが、NT系は起動時の実行コマンドargv[0]には格納されています。

UNIXでは実行モジュールのフルパスを取得する一般的な方法は無いみたいです。

Windowsでは#4の方の書かれているとおり、GetModuleFileName()です。

Qmakeコマンドのエラーについて(

UNIX(Linux)系のOSやC言語には不慣れなのですが、よろしくお願いします。

普段はWindows7(Home Ed.)を利用しているのですが、
いくつかのlinux系のソフトを利用する際にcygwinも利用しています。


==========================================================
cygwinにソフトウェアをインストールしようとする際に、
ときどき遭遇するエラーなのですが

仮にsoftware.tar.gzというソースファイルからインストールしようとして、

> gunzip -c software.tar.gz | tar xvf -
> cd software
> ./configure
> make
.....
make: *** [all-recursive] error

というエラーが生じて、makeが通らない時があります。
=========================================================


これまで何度か、どういうエラーなのか調べようとする度に挫折し、
何回かやり直している内に、たまたまmakeがすんなり通って
インストールできてしまったりしていたので、
なんとなくうやむやにしていました。

そもそも、この"all-recursive"に全くピンとこないのですが、
これはどういった場合に生じるエラーを示しているのでしょうか?
recursive(再帰的な)だから、関数かなにかの呼び出しに失敗している、
とかそういうことなのでしょうか?


エラーの内容はケースバイケースだし、
漠然とした質問になって申し訳ないのですが、
ちょっとしたアドバイスでもいいので、ご回答をお願いします。

UNIX(Linux)系のOSやC言語には不慣れなのですが、よろしくお願いします。

普段はWindows7(Home Ed.)を利用しているのですが、
いくつかのlinux系のソフトを利用する際にcygwinも利用しています。


==========================================================
cygwinにソフトウェアをインストールしようとする際に、
ときどき遭遇するエラーなのですが

仮にsoftware.tar.gzというソースファイルからインストールしようとして、

> gunzip -c software.tar.gz | tar xvf -
> cd software
> ./configure
> make
...続きを読む

Aベストアンサー

お腹痛いのに、一生懸命違うところを診察しているようなものですかね。

make[2]: *** [tvsetf.o] Error 1
この行より上全部じゃないですか?
WARNINGとかも出てますしね。

仰るとおりケースバイケースではありますが、例えば自分で作ったプログラムでの話ならばプログラムのミスが考えられますが、どこかの出来合いのフリーウェアをmakeしてエラーで落ちる場合は、環境が整っていない場合があります。(○○がインストールされていないとか…)

その辺は全てconfigureやmake時に出てくるメッセージをちゃんと見ることです。

なぜ最後に出てくるall-recursiveだけに注目してるのか知りませんが、見なくてもいいものをずっと見ていても問題は解決しません。

Qバッファとは何ですか

C言語を使用してるとバッファという言葉がよく出てきますがバッファとは何ですか
メモリとは違うものですか
訳をみても緩衝材とか一時的に蓄える場所という意味でよく分かりません
一時的でない使い方も多い気がしますが実際はどういうものですか

Aベストアンサー

#1です

寝ぼけて適当に書いたので修正。

すぐ見つけることができたもので正確なものは英語版ですがこちらくらいかも。
Data buffer - Wikipedia (en.)
http://en.wikipedia.org/wiki/Data_buffer

一応簡単なものはこちらです。
バッファとは - e-Wrods
http://e-words.jp/w/E38390E38383E38395E382A1.html

「複数の機器やソフトウェアの間でデータをやり取りするときに、処理速度や転送速度の差を補うためにデータを一時的に保存しておく記憶装置や記憶領域のこと。」
が現在の基本定義です。処理速度・転送速度の差のための緩衝材的な意味です。

昔はソフトウェアとハードウェア間に使うデータでソフトウェア側がデータを受け取るか、整形して送信するときに使うメモリ領域が基本的にバッファでした。
マルチプロセッサ・マルチタスクの時代になってくると、ソフトウェア間の処理速度の違いを吸収するために使うメモリ領域にもバッファという言葉が使われるようになりました。ソフトウェア間で逐次(FIFO)処理されるデータのためのメモリ領域がこちらの使われ方の主戦場といったところでしょうか。

ソフトウェア間でただ一括転送されるデータならバッファという言葉は誤用ということになるのですが、よく誤用されます。

#1です

寝ぼけて適当に書いたので修正。

すぐ見つけることができたもので正確なものは英語版ですがこちらくらいかも。
Data buffer - Wikipedia (en.)
http://en.wikipedia.org/wiki/Data_buffer

一応簡単なものはこちらです。
バッファとは - e-Wrods
http://e-words.jp/w/E38390E38383E38395E382A1.html

「複数の機器やソフトウェアの間でデータをやり取りするときに、処理速度や転送速度の差を補うためにデータを一時的に保存しておく記憶装置や記憶領域のこと。」
が現在の基本定義です。処理速度・転送速...続きを読む


人気Q&Aランキング