2011-06-23 1 views
0

「Cのインライン関数は内部データ構造を公開しています」というのは、これが何度も聞こえる理由の1つです。インライン関数はどのように内部データ構造を公開しますか?

誰かが説明することができますか?

ありがとうございます。

私はプログラムcode.cと関数func()を持っていると言います。私は1)func()をインライン化することができます。これは、コード内のデータ構造に何があっても公開します。2)func()をライブラリに入れ、共有ライブラリとして提供できます。推測??:p)----これは正しい分析ですか?

+3

この質問は私には意味がありません。私はそのような言葉を聞いたことがない。おそらく、非常に具体的なコンテキスト/使用法の例が含まれていますか? (質問はおそらく[インライン関数](http://www.greenend.org.uk/rjk/2003/03/inline.html)であるので、効率は、時間の約97%を言う... " - Donald Knuth ;-) –

答えて

1

これは、ライブラリやオブジェクトモジュールにコンパイルされたものと比べて、はるかに透過的です。これは、ソースコードを見ることができるため、必要な方法でデータ構造を操作するコードを記述することができるからです。

しかし、ソースがある行以外の関数の場合、どのように保護される可能性がありますか?

ソフトウェアのソースコードを守り、リンクするオブジェクトモジュール、共有ライブラリ、(恐ろしい!).DLLだけをリリースするソフトウェア企業があります。

+0

あなたの答えに感謝します。私はプログラムcode.cと関数func()を持っていると言うことができます。私は1)func()をインライン化することができます。これは、コード内のデータ構造に何があっても公開します。2)func()をライブラリに入れ、共有ライブラリとして提供できます。推測??:p)----これは正しい分析ですか?可能であれば – hari

+0

、私の理解を確認できますか?ありがとう。 :) – hari

+0

@hari:はい、それは私が言ったことから続く正しいステートメントです。 – wallyk

2

インライン関数定義をヘッダファイル(1つのcppファイルで使用されている場合を除きます)に入れるため、消費者がインクルードする必要があるので、コードの内部動作を公開していると思います。

しかし、代替は通常マクロであるため、私はそれがマクロに対する正当な理由であるとは思わない。

+0

...そして、実際にインライン化するためには、関数そのものが小さくなければならないので、実際にはそれほど多くは公開されていません。 – Andrei

+0

**多くのことを**公開していると考えています。あなたは不透明な型の定義をpublicにしなければなりません。そして、(ライブラリの場合)不透明な型の定義は、ライブラリのABIのロックインされた部分になります。 。 –

+0

@R。私は独占的な技術を公開するという意味でそれをもっと意味していました。現在、パブリックヘッダで公開されているほとんどのものは、コンシューマに再コンパイルを要求せずに変更することはできません。インライン関数には同じ要件が適用されます。 – Andrei

1

インラインメソッドは、すべてのメソッド呼び出しを展開します。したがって、foo()をJMPまたはCALL命令にする代わりに、呼び出されたfoo()の実際の命令をコピーするだけです。これに重要なデータが含まれている場合は、インライン関数は短い1行から2行のメソッドまたはより大きい式で通常使用されますが、それは公開されます。

関連する問題