• ベストアンサー

APIを多用した場合のメモリー消費について

標準モジュール内でAPIを使用した関数を多数定義した場合、このプログラムを実行中はメモリーに常駐し、メモリーを消費(浪費)してしまうのでしょうか? それとも、その関数を呼び出した時のみロードされるのでしょうか? DLLという名前からして後者だと思うのですが。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • gungnir7
  • ベストアンサー率43% (1124/2579)
回答No.3

>APIを多用し過ぎて、リソース不足でアプリが動かないなんてこと・・・ APIはメモリにロードしているのですから、有り得ない話ではないですが、 それを心配するのは現実的ではありません。 そんな状態を招くには、何百、何千というDLLを動かす必要があるでしょう。 むしろオブジェクトやmallocなどで取得した領域の開放忘れによる リソース漏れの方がよほど深刻で現実的な問題です。 VBですと画像を扱う場合にコンパチブルなデバイスコンテキストを 作成する機会は多いかと思います。 こういう場面でリソース漏れ(GDIシステムリソース)が発生する 危険性は非常に高いといえます。 私はかつてあるクライアントの依頼でビューワを作成したことがあります。 1Gのメモリを積んでもらったので、設計上はDIBで5万枚の画像まで メモリに読み込めるはずでした。 参考書をみようみまねで表示する部分を作成したのですが、 200枚を過ぎた頃から激しく不安定になったのです。 それで色々調べたところ参考書に穴があって リソース漏れが発生したことが判明いたしました。 参考書は画像1枚だけを処理するものだったので露見しなかったのです。 しかし、この件は参考書は責められないと思いました。 露見しなければ気付かないなと私も思いましたから。 かようにWindowsにはリソース漏れの罠があちこちにあるのです。

MusaGoro
質問者

お礼

詳しい解説、ありがとうございます。 私が使用しているのAPIは精々10個程度ですので、心配なさそうです。 それよりオブジェクトお開放について、見直します。

その他の回答 (3)

  • ArukuMail
  • ベストアンサー率22% (115/510)
回答No.4

>>私の意図は正にその通りなのですが、VBで出来ないのですか。。。 >>APIを多用し過ぎて、リソース不足でアプリが動かないなんてことは起こり得るんでしょうか? これは使う、APIによります。 MSDNのマニュアルには、APIを使った後、後処理をしないと いけないと書いてあるものもあります それのとおりに行わないと、アプリケーション内でメモリーリークが発生します。 基本的に、マニュアルどおりにすればロースぺックのPCでも簡単に動作します。 ただし、VBに対応したAPIに限ります VBに対応しないAPIを使用すると突然意図しない終了をおこします。

MusaGoro
質問者

お礼

趣味で個人で使うアプリを作っているだけなので、APIは解説書の内容を見よう見真似で使っており、MSDNのマニュアルなど、ほとんど読んだことがありません。 きちんと勉強します。 ありがとうございました。

  • gungnir7
  • ベストアンサー率43% (1124/2579)
回答No.2

両方の意味が可能なのですが、 質問をVBのカテゴリにしてきたことを考慮して それに的を絞って回答すると前者ということになります。 後者の意図していることは、 おそらく不必要になったらメモリから解放するということだと思いますが、 こういう芸当は明示的リンクといってVBではできないと聞いています。 Cで明示的リンクはLoadLibrary関数で呼び出し、ポインタで参照します。 世の中に多く出ているプラグインと呼ばれる類のDLLは こういう仕組みがないと活用できません。 前者はメモリに常駐し続けますが、 既に他のアプリ(例えばワード)とかも同じDLLを使っていると、 そちらのDLLを拝借しにいくようになっています。 だから同じAPI(DLL)が複数のアプリで使われている場合は、 メモリの節約になるわけです。

MusaGoro
質問者

お礼

回答ありがとうございます。 > おそらく不必要になったらメモリから解放するということだと思いますが、 > こういう芸当は明示的リンクといってVBではできないと聞いています。 私の意図は正にその通りなのですが、VBで出来ないのですか。。。 APIを多用し過ぎて、リソース不足でアプリが動かないなんてことは起こり得るんでしょうか?

  • ArukuMail
  • ベストアンサー率22% (115/510)
回答No.1

>>このプログラムを実行中はメモリーに常駐し、 >>メモリーを消費(浪費)してしまうのでしょうか? 基本的に、ブログラムはステップ毎の処理になるので 該当のAPIが実行されてはじめて実際のメモリー消費がなされます しかし、定義自体先に全部すんでいるわけですから 予約されているメモリーは多くなります。 (この辺は、動的にDLLをリンクしないCと同じです。) つまり見た目、メモリー消費は多いです

MusaGoro
質問者

お礼

早々にご回答、ありがとうございます。 「見た目」の意味がいま一つ理解できませんが、とにかくAPIは使った分だけ、消費量は増えるということですね。

関連するQ&A

  • API関数とDLL関数

    API関数とDLL関数って同じものですか? ネットで調べると・・・ API関数=Win API→ひとつひとつの関数(単独で機能するプログラムコード の塊)。     API関数はdllファイルの中にある関数をさす。 とのようなことが書いてあります。つまり、DLL関数(私の認識であると、.dllファイルの中にある関数)であり、この関数はAPI関数と同定義と認識しています。 まだまだ初心者で、この認識があっているか確信がもてません。 どうか教えていただけないでしょうか?? お願いいたします。

  • Windowsでのfork方法

    Windowsプログラムで、UNIXライクなマルチプロセス処理を書きたいのですが、 fork()が使えないようで、代替の方法がわかりません。 CreateProcess()というAPIはありますが、これは単に実行モジュールの呼び出し を行う関数で、UNIXのようなfork()でプロセスを分けるものでは ないようです。 子プロセス内部で、構築済みのDLLを複数ロードしたいのですが、 そのDLLはマルチスレッド対応になっていないため、 マルチスレッド処理はできません。 具体的にやりたいと思っていることをプログラム的に書くと、 およそ以下のような処理です。(UNIXでよくやる手法です) ----- 実行処理のメイン() {  int p_pid[128];  for(int i=0; i<10; i++) {   switch(pid[i]=fork()){    case 0: // 子プロセスとしての処理     子プロセスが呼び出す関数();     exit(0);    case -1:     break;    default:     break;   }  } } void 子プロセスが呼び出す関数() {  LoadLiblary() と GetProcAddress() で、DLLを動的にロードし、  DLL内のAPIを呼び出す。  DLLがマルチスレッド対応でなくても、この関数は各々が別プロセスとして  複数同時実行されるので、問題なく処理できるはず。 } ----- この処理は、Windowsでは無理なのでしょうか? もしできるなら、Windowsで用意されているランタイムライブラリかAPIを 教えていただけないでしょうか? よろしくお願いします。

  • プロセス内のAPI関数名を知りたい

    プロセスに読み込まれているAPIモジュールの名称一覧は、CreateToolhelp32SnapshotでTH32CS_SNAPMODULEとプロセス番号を指定すれば得られます 同じようにプロセスに読み込まれているAPI関数名の一覧表を簡単に得る方法はありますか? ---------------------------------------- 上述のごとくCreateToolhelp32Snapshotで得たモジュール一覧表がありますのでプログラムではなく、モジュール内の関数名を手操作・手調べでも結構ですから簡単に知る方法をご教授ください 【理想を言えばプログラム的に知る方法です お願いします】

  • VB2010でのAPIの使い方を教えてください。

    お世話になります。VB初心者です。ごくごく基本的なことを教えてください。 VB2010にて、PCとUSBを介して繋がっている機器からデータのやり取りを行おうとしています。 そのためのAPIが、機器メーカから***.dllという形で提供されています。同様に、これを使ったサンプルソフトもついているのですが、VB6で作ったものなので、VB2010ではそのまま使えません。 このAPIには、USBポートのOpen/CloseやRead/Writeなどの関数があるので、これを使いたいのですが、具体的にプログラム上で、どういうふうに定義(?)すればいいのでしょうか? APIの仕様書には、「API 使用時には ***.h をインクルードして使用してください→#include “***.h”」、「リンク時には、***.lib もリンクしてください」などと書かれています。 まだ、VB2010を勉強し始めたばかりなので、こういう基本的な部分がわかっていません。 お教えいただけると助かります。よろしくお願いします。

  • 独自アプリのAPI公開方法について

    Visutal C++ 2008(MFC)を用いてソフトウェアを開発しています。 現在開発しているソフトウェアは、ネットワーク通信系のものであり、 EXE側で通信機能を実装し、DLLをプラグインという形でロードしています。 そこで、DLL側でもEXE側に実装した通信系の関数(SendやRecvなど)を 呼び出したい(EXEからAPIを公開?)と考えているのですが、 どう実装したらいいのか分かりません。 今のところは、API公開用のDLLを用意し、EXEとDLLから両方ともにロード をさせようかと思っていますが、他に良い方法は無いでしょうか? 宜しくお願いします。

  • Windowsアプリケーションをメモリーで実行する

    EXEファイルをchar*bufと言う変数メモリーにロードして実行する場合の入り口(call又はjmp)アドレスはどこになるでしょうか? winmain()関数のアドレスがわかりません。 通常は実行ファイルをクリックするとOSがDLL等をマシン語に展開して実行しますが、メモリー上での実行はどの様にすればいいでしょうか?

  • メモリービューという機能について

    メモリービューという機能について質問させてください。 非実行型(?、dllなどのことです)のファイルを実行することができる実行プログラムに、よくメモリービューという機能がついているのですがどういったものなのでしょうか?(あまりいい例えになりませんが、各種エミュレーターなど) メモリーという単語を調べても、PC用語ではメモリーRAMについてしか出てこないのですが、そのメモリーを開示する機能ということなのでしょうか? また、 >非実行型(?、dllなどのことです)のファイルを実行することができる実行プログラム この文章、自分でも下手な表現だなと思うのですが、 ・何か他のファイルを自身を介して実行できる実行ファイル ・上のように実行されるファイル はそれぞれ専門用語でなんというのでしょうか?

  • VB2005で作成したDLLの呼び出し方

    はじめまして、VB2005(.NET)初心者です。 現在、各プログラムを実行するためのメニュー プログラムを作成しています。 .net以前では、各プログラムをEXEで作成し API関数を利用し、メニューより実行させて いましたが、今回、各プログラムをEXEではなく dllで作成し実行する方法で作ることになりました。 各プログラムのdllを実行する方法がわかりません。 参考書等みてみましたが、見当たりません。 どのようにしていらっしゃるか教えて下さい。 宜しくお願いいたします。

  • クラスの関数へユーザー定義型の引数を渡す(VB6.0)

    お世話になります。 クラスモジュール内へ宣言した関数へユーザー定義型(標準モジュール内でPublicで宣言)の引数を渡すとコンパイルエラーとなってしまいます。 ユーザー定義型を宣言した以外の標準モジュールでは同じ関数は動きますが、Formモジュールでは動きません。 標準モジュールにしかユーザー定義型の引数を渡すことは出来ないのでしょうか??

  • ライブラリのリンクについて。

    ふと、疑問に思ったので質問させてもらいます。 C言語などでプログラムを作る時、ライブラリをリンクさせて使うと思いますが、その場合プログラムを実行させた場合メモリー上ではどうなるのか教えた貰いたいです。 例えばprintf関数を使う場合その命令そのものがプログラムに組み込まれてメモリーに読み込まれているのかということです。 前にどこかで読んだ記憶があるのですが、いろいろなところから呼び出される標準的なものはシステムで一箇所にありそれを使うなどということがあったような無かったような記憶があやふやですが見た覚えがあるので気になってしまいました。 あとライブラリなどから一つだけ関数を使う場合、使わない他の関数などもメモリーに読み込まれていたりするのでしょうか? よく使う自分で作った関数を一つのファイルにまとめ、それを定義したヘッダーファイルをincludeした場合も同様で使わないほかの関数はどうなるのでしょうか?

専門家に質問してみよう