• 締切済み

インライン関数

postal0x02の回答

回答No.4

組み込み系プログラマ(新兵)です。 命令キャッシュの小さいCPUの話になりますが、 すべての関数に inline を付けたら速度が若干遅くなりました。 過去の業務ではあまり inline は見かけませんでした。 私の場合、実コードが1~2行ならば inline をつけていますが。 (もちろんマクロも使ってます)

20081217
質問者

お礼

遅くなっちゃうんですかー。

関連するQ&A

  • インライン展開でコンパイラが何をやっているのか知りたいです

    インライン展開すると、関数の呼び出しオーバーヘッドが小さくなることはわかるのですが、インライン展開した場合としていない場合と、なぜ関数呼び出しのオーバーヘッドがなくなるのかアセンブルレベルでの違いがよくわからないです。 関数をインライン展開した場合、コンパイラはどのようにコンパイルするのか、そしてその関数実行時の振る舞いがインライン展開なしの場合とどう違うのか、わからないので教えていただけませんか? 以上、よろしくお願いします。

  • 手続きのインライン展開 基準

    コンパイラ型言語における手続きのインライン展開についてです。 例えばC++の場合、inline指定子をつけるなどしてインライン展開を促しますが, 長い手続きの場合はインライン展開されないと記憶しています。 お尋ねしたいことは2つあります。 1つ。1箇所でしか呼び出されない手続きの場合、どんなに長くても、インライン展開したほうがより最適なプログラムになるのではないか? 2つ。1箇所でしか呼び出されない手続きの場合、最適化モードでコンパイルするなりインライン展開指定するなりすれば、インライン展開は行なわれるか? 暇な時にでも、どなたか教えていただけたら幸いです。

  • インライン関数の使い道と理屈

    #include <iostream> using namespace std; //max関数の定義 inline int max(int x, int y){if(x>y) return x; else return y;} int main(){ int num1, num2, ans; cout << "1番目の整数を入力して下さい。\n"; cin >> num1; cout <<"2番目の整数を入力して下さい。\n"; cin >> num2; ans = max(num1, num2); cout << "最大値は" << ans << "です。\n"; return 0; } インライン関数の処理は呼び出し部分に埋め込まれるので、プログラムの処理速度が 向上することがありますとあるんですが、 どのような時にインライン関数は使用するのでしょうか? 理由もしくみもご教示お願いします。

  • templateクラスの宣言と定義を、別々のファイルに分けたい

    こんばんは。 templateを利用したクラスについての質問です。 通常、テンプレートクラスのメンバ関数は、その定義部分をインライン展開するべき、とのことですが… なんとかして宣言部と定義部を別々のファイルに分ける事は出来ないでしょうか? テンプレート変数をクラス内で共有したいため、テンプレート関数ではなく、テンプレートクラスで上記の事を実現したいのです。 「コンパイラによっては、インライン関数でなければならない」という記述を見かけたので、 コンパイラによってはインライン関数でなくても構わないのでしょうか? 開発環境は WindowsXP-SP2 VisualStudio2005-SP1 C++コンソールアプリケーションです。

  • cprintf()関数で2バイト文字を表示するには

    cprintf()関数の引数に2バイト文字を含む文字列を指定してプログラムを 実行すると、表示結果の2バイト文字の部分が全て文字化けしてしまいます。 cprintf()関数で2バイト文字を表示することはできないのでしょうか? ご教示宜しくお願い致します。 下記は実際に文字化けしてしまうコードです。 ---------------------- #include <conio.h> int main(void) { cprintf("日本語 English"); return 0; } ---------------------- 【環境情報】 使用コンパイラ:VC++2008 実行環境:WinXPSP2とVistaHomePremiumSP1の2環境で確認 【質問の背景】 『独習C 第3版』という本の中に、一部のコンパイラでは、getche()の ような非標準の入出力関数とprintf()などの標準の入出力関数を併用 すると問題が発生すると記載されており、printf()関数の代わりに cprintf()関数を使用したサンプルコード(上記のコードとは異なる)も記載されています。 しかし、実際にそれをコンパイルして実行してみると、2バイト文字が 全て文字化けして表示されてしまいました。

  • ランタイム関数とは何ですか?

    プログラミングの勉強をしているわけではありませんが、そういう記述に出くわしてしまい、明確な定義が見つからなくて困っています。 ランタイムとは実行時のことだと思うのですが、実行時の関数とは一体何でしょうか?実行時でない関数なんてあるのでしょうか?普通の関数と何が違うのでしょうか? 教えてください。お願いします。

  • 無名関数を実行する場合について

    テキストでonclickで無名関数を実行させるのに ; (セミコロン)を使う場合と使わない場合があるのですが、どちらでもイベントは実行されます。 この ; (セミコロン)は普通付けるのがいいのでしょうか。 それとも付けなくてもいいのでしょうか。 また、ある質問をした際に (無名関数init()が次に書かれたソースコードの下に書かれている場合) window.onload = init(); だとこの時点で実行されてしまうので、 window.onload = init; と書くべきだとアドバイスを受けました。 私がプログラムを実行した際に、init(); でも普通に実行されたので、 何故、initに()を付けてはいけないのかが分かりません。 回答者様には貴重なお時間を割いて頂く事に誠に申し訳ありませんが、アドバイスどうぞ宜しくお願い致します。

  • C言語 main関数とsum関数の記述順について

    はじめまして。 【苦しんで覚えるC言語】(Web版)でC言語を学んでいる初学者です。 【第1部:C言語基礎編】>【関数の作り方】>【自作関数を作る】の部分(http://9cguide.appspot.com/11-01.html#S2)でつまづいています。 下記のような、1から100までの数字の合計を表示するプログラムが例題として取り上げられています。 しかし、ここが理解できないので、次の【プロトタイプ宣言】に進めずにいます。 例題1  sum関数をmain関数の後に記述した場合(プログラムが実行されない)。 #include <stdio.h> int main(void) { return 0; } int sum(void) { printf("%d\n",(1 + 100) * 100 / 2); return 0; } 例題2  sum関数をmain関数の先に記述した場合(プログラムが実行される)。 #include <stdio.h> int sum(void) { printf("%d\n",(1 + 100) * 100 / 2); return 0; } int main(void) { return 0; } 例題1の場合、【まずmain関数を作り、次にsum関数を作りました。この場合、main関数を解析している段階では、sum関数は発見されておらず、従って、main関数の中では、sum関数を使うことは出来なくなってしまいます。】との説明がありますが理解できません。 コンパイラがどのような順番でプログラムを処理しているか理解できていないので分からないのだと思います。 例題1の場合と例題2の場合の両方について、コンパイラがどのような順番でプログラムを処理しているのかを具体的に教えてください。 どうかよろしくお願い致します。

  • プログラムで関数は使わない方が速くなる?

    大きなプログラムを書く際、プログラムの見通しが良くなり、後から修正しやすくするため、 同じ計算が複数回出る際には関数を多用したものを作成してきました。 ところが、プログラムの計算速度を上げたいと思い、計算時間を比較してみたところ、 関数を使わない方が圧倒的に速くなることが分かりました。 Matlabを使って、 for j = 1:100000 for i = 1:1000 y = i*i * j *j; end end の計算を行った際の計算時間と、ループ内の計算を関数で置き換えた for j = 1:100000 for i = 1:1000 y = zikan_sokutei_function ( i, j ); end end function [ kei ] = zikan_sokutei_function ( i, j ) kei = i * i * j * j; end の計算を行った時間は、 それぞれ、0.5秒と1分7.3秒、という結果になりました。 つまり関数で置き換えたことで、計算時間が実に135倍も増大したということです。 上記と同じプログラムを使ってVBAで比較したところ、 それぞれ、8.29秒と20.70秒、という結果になりました。 つまり関数で置き換えたことで、計算時間が2.5倍も増大したということです。 また、関数を使わない場合には、Matlabが最速で、関数を使う場合にはVBAが最速であるという結果になっています。 これは関数を全く使わない方が、圧倒的に高速に計算を実行できるという結果になっていますが、 こういうものなのでしょうか? 2倍程度なら許容範囲ですが、100倍以上も遅くなるのであれば、 関数は全く使うべきではない、ということになりますが、なぜこれほどまでに時間がかかるのでしょうか? Matlabの方がVBAよりも数値計算に適しているため、VBAよりも実行速度は速くなるべきだと思いますが 関数を使った場合には、これが逆転してしまうという、かなり腑に落ちない結果となりましたが、 こういうものなのでしょうか?

  • C#の実行関数トレース

    C#プログラムのプロジェクトに途中から参画しています。 まだプログラムの全容を理解していないため、どのメニューを実行したときにどの関数が呼ばれるのか、を追うだけでいちいち時間がかかってしまい、困っています。 あるメニューを実行したときにコールされる関数名をすべて出力できるような方法やツールはありますか?