- ベストアンサー
C言語のライブラリのリンクとメモリー上の挙動について
- C言語などでプログラムを作る際に、ライブラリをリンクさせて使うと、メモリ上ではどのような挙動をするのでしょうか?例えばprintf関数を使う場合、その命令そのものがプログラムに組み込まれてメモリに読み込まれているのかという疑問があります。
- ライブラリなどから一つだけ関数を使う場合、使わない他の関数などもメモリに読み込まれているのでしょうか?例えば自分で作った関数を一つのファイルにまとめ、それを定義したヘッダーファイルをincludeした場合も同様で、使わないほかの関数はどのように取り扱われるのか気になります。
- 過去にどこかで読んだ記憶があるのですが、標準的な関数は一箇所にあり、それをシステムが使用するというような仕組みだったような気がします。しかし、具体的な内容はあいまいであり、再度確認したいと思っています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ライブラリの種類によります。 通常、拡張子が*.libになっているライブラリは静的リンクされ、実行プログラムの一部となります。この場合は、必ず一緒に読み込まれます。(メモリスワップとかはありますが) 一方、拡張子が*.dll(Windowsの場合)になっているライブラリは、その中の関数など、どれかひとつが呼ばれた時点に読み込まれるように出来ます。また、既に他のプログラムが読み込んでいれば、それを共有して使う場合もあります。 で、これらの場合、同一ファイルに入っていれば、使わない関数なども一緒に読み込まれてしまいます。このため、ライブラリの分割整理は重要です。 近年、アプリの実行サイズが肥大化しているのは、かなりの部分はこのせいです。 静的リンクの場合、ヘッダファイルに関数を書いてインクルードしたのと結果的には一緒になりますが、ヘッダファイルだとインクルードするたびにコンパイルされるため、ビルド時間が長引き、実行ファイルサイズが肥大する原因にもなりますから、注意が必要です。
その他の回答 (2)
- BLK314
- ベストアンサー率55% (84/152)
No.2です。 補足します。 >ライブラリなどから一つだけ関数を使う場合、 >使わない他の関数などもメモリーに読み込まれていたりするのでしょうか? VC++の場合は リンカ・オプションで制御できるようです。 http://msdn.microsoft.com/ja-jp/library/bxwfs976.aspx デフォルトでは未参照のシンボルは削除されますが、 /OPT:NOREF 指定で残させることも可能です。 デバッグ版では/OPT:NOREF が採用されるようです。 つまり、デバッグ・バージョンの場合は、 余分な関数がたくさん結合されるわけです。 リリース版では、それ(余分な関数)を削除することで サイズ・ダウンを図るようです。
補足
ほぉーそうなんですね。Visual Studioを使っているので参考になりました。 ありがとうございました。とても気持ちの良い気分です。
- BLK314
- ベストアンサー率55% (84/152)
ライブラリのリンク方式には2つあります 1)ダイナミックリンク 関数の本体はメモリ上の1か所に配置されます。 この方式のライブラリを ダイナミック・リンク・ライブラリと呼び、DLLと略されます。 >いろいろなところから呼び出される標準的なものは >システムで一箇所にありそれを使う まさにDLLの特徴そのものです 2) スタティックリンク ライブラリは、利用するアプリの一部に完全に取り込まれます。 複数のアプリで利用した場合、 各々のアプリケーションのメモリ空間に配置されることになります。 >例えばprintf関数を使う場合その命令そのものが >プログラムに組み込まれてメモリーに読み込まれているのかということです スタティック・リンクならそうなります。 >あとライブラリなどから一つだけ関数を使う場合、 >使わない他の関数などもメモリーに読み込まれていたりするのでしょうか? >よく使う自分で作った関数を一つのファイルにまとめ、 >それを定義したヘッダーファイルをincludeした場合も >同様で使わないほかの関数はどうなるのでしょうか? DLLの場合、DLLのファイル単位でロードされますので、 使わない無駄な関数もロードされます。 スタティックの場合、呼ばれない関数はリンクされません。 ライブラリでない通常のアプリの場合はスタティックに準じます。 つまり、ソースに書かれていても、一切呼ばれない関数は リンクされません。
お礼
回答ありがとうございます。 とてもよく理解できました。
補足
すばやい回答ありがとうございます。 使わない関数は別にしたほうが良いのですね。はじめて知りました。 ありがとうございます。 少し確認したいのですが >>これらの場合、同一ファイルに入っていれば、使わない関数なども一緒に読み込まれてしまいます。 というのは静的リンクも動的リンクも同じで一緒に読み込まれると言うことですかね?