| 日本−日本語 |
|
|
|
![]() |
HP-UX リファレンス: セクション 3 : ライブラリ (A~M) > mmalloc(3C)HP-UX 11i Version 2: September 2004 |
|
名称malloc(), free(), realloc(), calloc(), valloc(), mallopt(), mallinfo(), memorymap(), alloca() ― メインメモリー割り当て 構文#include <stdlib.h> void *malloc(size_t size); void *calloc(size_t nelem, size_t elsize); void *realloc(void *ptr, size_t size); void *valloc(size_t size); void free(void *ptr); void memorymap(int show_stats); (廃止) SYSTEM V 構文#include <malloc.h> char *malloc(unsigned size); void free(char *ptr); char *realloc(char *ptr, unsigned size); char *calloc(unsigned nelem, unsigned elsize); int mallopt(int cmd, int value); struct mallinfo mallinfo(void); 特記事項古い malloc(3X) パッケージの機能は malloc(3C) に統合されました。 ライブラリ -lmalloc リンカーオプションに対応する (/usr/lib/libmalloc.a) ライブラリには何も含まれていません。 このライブラリを参照する makefile は、そのまま実行できます。 説明このマニュアルで説明されるのは、簡単で汎用のメモリーアロケーション パッケージです。
それぞれの割り当てルーチンは、(適当なポインター強制の後) 任意のタイプのオブジェクトの記憶領域として適切にスペースを境界付けするためのポインターを返します。
戻り値正常終了すると、 malloc()、 realloc()、 calloc() および valloc() は、(適当なポインター強制の後) 任意のタイプのオブジェクトの記憶領域として適切にスペースを境界付けするためのポインターを返します。 失敗した場合は NULL ポインターを返します。 realloc() が NULL ポインターを返した場合、元のポインターが指定していたメモリーはそのまま残っています。 mallopt() は正常終了すると 0 を返し、失敗すると 0 以外の値を返します。 診断malloc()、 realloc()、 calloc() および、 valloc() は、使用可能メモリーがないか、 malloc() が管理しているメモリーの内容の破壊が発見された場合、 NULL ポインターを返します。 ブロックの境界を超えてデータが保存された場合や、(malloc()、 realloc()、 calloc() および valloc() が生成したものでない) 無効なポインターが引き数として free() や realloc() に渡された場合は、メモリーの内容は破壊されます。 mallopt() が、スモールブロックの割り当ての後に呼び出され、 cmd が M_BLOCK や M_UBLOCK 設定されてないか、 cmd もしくは value が無効の場合、0 でない値が返されます。 それ以外の場合、0 が返されます。 エラー
外部環境の影響malloc() ファミリーの性能は、2 つの環境変数 _M_ARENA_OPTS と _M_SBA_OPTS および 3 つの新しいグローバル変数 __hp_malloc_maxfast、 __hp_malloc_num_smallblocks と __hp_malloc_grain で調整できます。 スレッド化アプリケーションの場合、 malloc() は複数のアリーナを使用します。 異なるスレッドからのメモリー要求は、異なるアリーナで処理されます。 _M_ARENA_OPTS を使用すると、アリーナの数や、アリーナを何ページ (ページサイズは 4096 バイト) ずつ拡張するか (拡張係数) を調整できます。 一般的には、性能を良くするために、アプリケーション内のスレッドが多いほどアリーナをたくさん使用する必要があります。 スレッド化アプリケーションのアリーナ数は、1〜64 です。 非スレッド化アプリケーションの場合は、使用されるアリーナは 1 つだけです。 環境変数が設定されていないか、アリーナ数に範囲外の値が設定されている場合は、デフォルト値の 8 が使用されます。 拡張係数は 1〜4096 で、デフォルト値は 32 です。 この係数が範囲外の場合も、デフォルト値が使用されます。 次に _M_ARENA_OPTS の使用方法の例を示します。 $ export _M_ARENA_OPTS = 16:8 この例では、アリーナ数が 16 で、拡張サイズは 8×4096 バイトです。 一般的に、アリーナ数が多いほど拡張係数を小さくし、アリーナ数が少ないほど拡張係数を大きくする必要があります。 _M_SBA_OPTS はスモールブロック アロケータをオンにするために使用し、 maxfast、 grain、 および numlblks という、スモールブロック アロケータ用のパラメータをセットアップします。 スモールブロック アロケータがオンのアプリケーションは、オフのアプリケーションよりも一般的に速く動作します。 スモールブロック アロケータは、 mallopt() でオンにできます。 ただしこの方法は、C++ や Java のアプリケーションでは遅すぎます。 環境変数を使用すると、アプリケーションの開始前にアロケータをオンにできます。 環境変数を使用しても、 mallopt() 呼び出しを同様に使用できます。 環境変数が設定されていて、スモールブロック アロケータが使用されていない場合は、 _M_SBA_OPTS に設定されている値にかかわらず、 以降の mallopt() 呼び出しで変更できます。 環境変数が設定されていて、スモールブロック アロケータがすでに使用されている場合は、 mallopt() を呼び出しても効果はありません。 この環境変数を使用するには、次のようにします。 $ export _M_SBA_OPTS = 512:100:16 この場合、 maxfast サイズが 512、スモールブロック数が 100、最低サイズが 16 です。 3 つの値すべてを、この順で指定する必要があります。 正しく指定しないと、デフォルト値が代わりに使用されます。 非スレッド化アプリケーションでは、 _M_SBA_OPTS は効果がありますが、 _M_ARENA_OPTS は効果がありません。 3 つの新しいグローバル変数 __hp_malloc_maxfast、 __hp_malloc_num_smallblocks および __hp_malloc_grain は、 _M_SBA_OPTS 環境変数の設定値より優先される値を指定するために導入されました。 アプリケーション内でこの 3 つの変数を初期化すると、 _M_SBA_OPTS は無効になります。 この方法によって、最適な状態に調整したアプリケーションが、さまざまなユーザー環境で同じ性能を発揮するようにすることができます。 ただし、 _M_ARENA_OPTS と同様に、メモリーブロックが割り当てられる前に mallopt() を呼び出すことによって、 malloc() の動作が変わります。 デフォルトでは、これらの 3 つの変数は、開始時に 0 に初期化されます。 これは、次のように変数を設定したのと同じになります。 extern int __hp_malloc_maxfast=512; デフォルトでは、SBA (スモールブロックアロケーション) はオンです。 これにより、アプリケーション性能向上の効果があることがあります。 SBA をオフにするには、次のように設定します。 extern int __hp_malloc_maxfast=-1; 他のすべての設定値については、 mallopt() を参照してください。 注記: これらの変数を変更すると、バッファーオーバーランなどのユーザーメモリーの欠陥が顕在化する可能性が高くなります。 警告malloc() 関数は、 プロセスのアドレス空間を増やすため brk() および sbrk() (brk(2) 参照) を使用します。 そのため、 brk() または sbrk() を使用するアプリケーションプログラムは、それらをアドレス空間を減らすために使用してはなりません。 使用すると malloc() の機能を混乱させることになります。 free() および realloc() は、ポインター引き数およびその有効性をチェックしません。 以下のアクションは不適切なプログラミング手法と見なされているため、実行しないようにしてください。その結果は予測不能であり、望ましくない可能性があるため、サポートされません。望ましくない結果の例として、データの損失、メモリー障害、バスエラー、無限ループなどがあります。
特に以下のアクションは実行しないようにしてください。これらは、 malloc() の将来のバージョンではサポートされない可能性があります。
ドキュメントに示されてない、以前のメモリー割り当て関数の機能は実現されていません。 アプリケーションに上記の不適切なプログラミング手法、または推奨されない手法のいずれかが使用されている場合、将来のリリースで引き続き動作可能である保証はありません。 互換性旧版の malloc(3X) と新版 の malloc(3C) の外部からわかる違いは、旧版は 0 バイトの要求に対して NULL ポインターを返す場合があるということです。 malloc(3C) は、有効なメモリーアドレス返します。 多くのアプリケーションでは、この差異による影響はないでしょう。 SBA (スモールブロックアロケーション) のデフォルトの状態は、Itanium(R) ベース システムではオンで、 PA-RISC システムではオフです。 性能を考慮して、このようになっています。詳細はこのマンページの「外部環境の影響」の項を参照してください。 標準準拠malloc(): AES, SVID2, SVID3, XPG2, XPG3, XPG4, FIPS 151-2, POSIX.1, ANSI C calloc(): AES, SVID2, SVID3, XPG2, XPG3, XPG4, FIPS 151-2, POSIX.1, ANSI C free(): AES, SVID2, SVID3, XPG2, XPG3, XPG4, FIPS 151-2, POSIX.1, ANSI C mallinfo(): SVID2, XPG2 mallopt(): SVID2, SVID3, XPG2 realloc(): AES, SVID2, SVID3, XPG2, XPG3, XPG4, FIPS 151-2, POSIX.1, ANSI C |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||