C動的メモリ割り当て

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

Cの動的メモリ割り当てを行うことを意味する手動メモリ管理をするための動的メモリ割り当てC言語の関数の基を介してC標準ライブラリ、すなわちのmallocreallocののcalloc自由[1] [2] [3]

C ++プログラミング言語は、これらの機能を含み、ただし、演​​算子newdeleteは同様の機能を提供し、その言語の作成者によって推奨されています。[4]さらに、使用しているいくつかの状況があり、このようなガベージコレクションコードまたは性能に敏感なコードの組み合わせとして、適用されないと、代わりに、より高いレベルで必要とされ得るオペレータは。 new/deletemallocplacement newnew

malloc使用される実際のメモリ割り当てメカニズムのさまざまな実装が利用可能です。それらのパフォーマンスは、実行時間と必要なメモリの両方で異なります。

理論的根拠

Cプログラミング言語は、メモリを管理し、静的に自動的に、または動的に。静的期間変数は、通常はプログラムの実行可能コードとともにメインメモリに割り当てられ、プログラムの存続期間中存続します。自動期間変数はスタックに割り当てられ、関数が呼び出されて返されるときに出入りします。 static-duration変数とautomatic-duration変数の場合、割り当てのサイズはコンパイル時定数である必要があります(可変長の自動配列[5]の場合を除く)。実行時まで必要なサイズがわからない場合 (たとえば、任意のサイズのデータ​​がユーザーまたはディスクファイルから読み取られている場合)、固定サイズのデータ​​オブジェクトを使用することは不十分です。

割り当てられたメモリの寿命も懸念を引き起こす可能性があります。静的期間メモリも自動期間メモリも、すべての状況に適しているわけではありません。自動割り当てデータは、複数の関数呼び出しにわたって保持することはできませんが、静的データは、必要かどうかに関係なく、プログラムの存続期間中保持されます。多くの場合、プログラマーは、割り当てられたメモリーの存続期間を管理する上で、より高い柔軟性を必要とします。

これらの制限は、メモリがより明示的に(ただしより柔軟に)管理される動的メモリ割り当てを使用することで回避されます。通常、この目的のために構造化されたメモリ領域であるフリーストア(非公式には「ヒープ」と呼ばれます)からメモリを割り当てます。 Cでは、ライブラリ関数mallocを使用して、ヒープにメモリのブロックを割り当てます。プログラムは戻るポインタ介してこのメ​​モリブロックにアクセスmallocます。メモリが不要になると、free他の目的に使用できるようにメモリの割り当てを解除するポインタが渡されます。

Cの元の説明は、calloccfreeが標準ライブラリにあることを示していましたが、ではありませんでしたmalloc。以下のためのストレージ・マネージャの単純なモデルを実装するためのコードのUnixは、で与えられたallocfreeユーザインタフェース機能として、および使用sbrkオペレーティングシステムからの要求のメモリへのシステムコールを。[6]第6版Unixのドキュメントが与えられるallocfree、低レベルメモリ割り当て関数として。[7]mallocfreeその現代的な形でのルーチンは完全に第7版、Unixのマニュアルに記載されています。[8] [9]

一部のプラットフォームは、ヒープではなくCスタックからの実行時の動的割り当てを可能にするライブラリまたは組み込み関数呼び出しを提供します(例:alloca()[10])。このメモリは、呼び出し元の関数が終了すると自動的に解放されます。

機能の概要

C動的メモリ割り当て関数は、stdlib.hヘッダー(cstdlibC ++ではヘッダー)で定義されます。[1]

関数 説明
malloc 指定されたバイト数を割り当てます
realloc 指定されたメモリブロックのサイズを増減し、必要に応じて移動します
calloc 指定されたバイト数を割り当て、それらをゼロに初期化します
free 指定されたメモリブロックをシステムに解放します

malloc()calloc()違い

  • malloc()単一の引数(バイト単位で割り当てるメモリの量)を取りますが、calloc()2つの引数(メモリに割り当てる変数の数と単一の変数のバイト単位のサイズ)が必要です。
  • malloc()割り当てられたメモリを初期化しませんcalloc()が、割り当てられたメモリブロックのすべてのバイトが0に初期化されていること保証します。
  • 一部のオペレーティングシステムでcalloc()は、割り当てられたメモリの仮想アドレスのすべてのページを最初にすべて0の読み取り専用ページにポイントし、仮想アドレスが書き込まれるときに読み取り/書き込み物理ページのみを割り当てることで実装できます。これは、copy-と呼ばれる方法です。オンライト

使用例

自動スコープを使用して10個の整数の配列作成するのは、Cでは簡単です。

int配列[ 10 ]; 

ただし、配列のサイズはコンパイル時に固定されます。同様の配列を動的に割り当てたい場合は、次のコードを使用できます。

int * array = int * malloc 10 * sizeof int ));     

これは、10個の整数がメモリ内で占めるバイト数を計算し、そのバイト数を要求しmallocて、という名前ポインタに結果を割り当てますarray(C構文のため、ポインタと配列は状況によっては交換可能に使用できます)。

mallocリクエストを処理できない可能性があるためnullポインタが返される可能性があります。これを確認することは、プログラミングの良い習慣です。

int * array = malloc 10 * sizeof int ));     
if array == NULL {    
  fprintf stderr "mallocが失敗しました\ n " ); 
  -1を返します。 
}

プログラムが動的配列を必要としなくなったら、最終的にはfree、プログラムが占有しているメモリを空きストアに戻すために呼び出す必要があります

無料配列);

によって確保されたメモリmalloc初期化されておらず、以前に使用および破棄されたデータの残骸であるcruftが含まれている可能性があります。で割り当てた後malloc、配列の要素は初期化されていない変数になりますこのコマンドcallocは、すでにクリアされている割り当てを返します。

int * array = calloc 10 sizeof int ));    

reallocを使用すると、ポインタが指すメモリの量のサイズを変更できます。たとえば、サイズの配列として機能するポインタがある場合 サイズの配列に変更したい 、reallocを使用できます。

int * arr = malloc 2 * sizeof int ));     
arr [ 0 ] = 1 ;  
arr [ 1 ] = 2 ;  
arr = realloc arr 3 * sizeof int ));     
arr [ 2 ] = 3 ;  

reallocは、ブロックのベースアドレスを変更したと見なす必要があることに注意してください(つまり、元のブロックのサイズを拡張できなかったため、新しい大きなブロックを別の場所に割り当て、古いコンテンツをコピーした場合)。したがって、元のブロック内のアドレスへのポインタも無効になります。

型安全性

mallocvoidポインタvoid *)を返します。これは、データ型が不明な領域へのポインタであることを示します。強い型システムのため、C ++ではキャストの使用が必要ですが、Cではそうではありません。特定の型へのこのポインターを「キャスト」(型変換を参照)できます。

int * ptr * ptr2 ;  
ptr = malloc 10 * sizeof * ptr )); / *キャストなし* /     
ptr2 = int * malloc 10 * sizeof * ptr )); / *ギプス付き* /      

このようなキャストを実行することには、長所と短所があります。

キャストのメリット

  • キャストを含めると、Cプログラムまたは関数をC ++としてコンパイルできる場合があります。
  • キャスト、元々がを返した1989年以前のバージョンを考慮に入れmallocていchar *ます。[11]
  • キャストは、特にポインターがmalloc()呼び出しから遠く離れて宣言されている場合に、宛先ポインターの型が変更された場合に、開発者が型のサイズ変更の不整合を特定するのに役立ちます(ただし、最新のコンパイラーと静的アナライザーは、キャストを必要とせずにそのような動作について警告できます[12])。

キャストのデメリット

  • C規格では、キャストは冗長です。
  • キャストを追加するヘッダ含める失敗マスクよいstdlib.hた、関数プロトタイプのためにmalloc発見されています。[11] [13]のプロトタイプがない場合malloc、C90標準では、Cコンパイラmallocint。を返すと想定する必要があります。キャストがない場合、C90は、この整数がポインターに割り当てられたときに診断を必要とします。ただし、キャストを使用すると、この診断は生成されず、バグが隠されます。特定のアーキテクチャおよびデータモデル(longおよびポインタが64ビットでint32ビットである64ビットシステムのLP64など)では、暗黙的に宣言されているように、このエラーによって実際には未定義の動作が発生する可能性があります。malloc実際に定義された関数が64ビット値を返すのに対し、32ビット値を返します。呼び出し規約とメモリレイアウトによっては、スタックが破壊される可能性がありますC99は暗黙の宣言を許可しないため、この問題が最近のコンパイラで見過ごされる可能性は低くなります。そのため、コンパイラは、int戻り値を想定している場合でも診断を生成する必要があります。
  • ポインタのタイプが宣言時に変更された場合、malloc呼び出されてキャストされるすべての行を変更する必要がある場合もあります。

一般的なエラー

動的メモリ割り当ての不適切な使用は、バグの原因となることがよくあります。これらには、セキュリティバグやプログラムのクラッシュが含まれる可能性があり、ほとんどの場合、セグメンテーション違反が原因です。

最も一般的なエラーは次のとおりです。[14]

割り当ての失敗をチェックしていません
メモリ割り当てが成功することは保証されておらず、代わりにnullポインタを返す場合があります。割り当てが成功したかどうかを確認せずに戻り値を使用すると、未定義の動作が呼び出されますこれは通常、クラッシュにつながります(nullポインターの逆参照でセグメンテーション違反が発生するため)が、クラッシュが発生する保証はないため、それに依存すると問題が発生する可能性もあります。
メモリリーク
を使用してメモリの割り当てを解除しfreeないと、再利用できないメモリが蓄積され、プログラムで使用されなくなります。これはメモリリソースを浪費し、これらのリソースが使い果たされると割り当ての失敗につながる可能性があります。
論理エラー
すべての割り当ては同じパターンに従う必要があります:をmalloc使用した割り当て、データを格納するための使用法、を使用した割り当て解除freefreeダングリングポインタ)の呼び出し後またはmallocワイルドポインタ)の呼び出し前のメモリ使用量free2回の呼び出し(「ダブルフリー」)など、このパターンに従わないと、通常、セグメンテーション違反が発生し、プログラムのクラッシュ。これらのエラーは一時的なものであり、デバッグが難しい場合があります。たとえば、解放されたメモリは通常、OSによってすぐには再利用されないため、ダングリングポインタがしばらく持続し、機能しているように見える場合があります。

さらに、ANSI C標準化に先行するインターフェイスとして、mallocおよびそれに関連する関数には、独自に定義するために実装に意図的に任された動作があります。それらの1つは、長さがゼロの割り当てです。これはrealloc、サイズをゼロに変更するのが一般的であるため、より問題になります。[15]の両方がPOSIXシングルUnixの仕様は、どちらか返すことで0サイズの配分の適切な取り扱いを必要とするNULL、または安全に解放することができる何か他のもの[16]は、すべてのプラットフォームは、これらのルールを遵守する必要がありません。それがもたらした多くのダブルフリーエラーの中で、2019 WhatsAppRCEは特に顕著でした。[17]これらの関数をラップして安全にする方法は、0サイズの割り当てをチェックし、サイズ1の割り当てに変換することです(戻るにNULLは独自の問題があります。それ以外の場合は、メモリ不足の障害を示します。realloc元のメモリが移動および解放されなかったことを示しているはずですが、サイズ0の場合はそうではなく、ダブルフリーになります。)[18]

実装

メモリ管理の実装は、オペレーティングシステムとアーキテクチャに大きく依存します。一部のオペレーティングシステムはmallocのアロケータを提供しますが、他のオペレーティングシステムはデータの特定の領域を制御する機能を提供します。同じ動的メモリアロケータはC ++mallocと演算子の両方を実装するためによく使用されます[19]new

ヒープベース

アロケータの実装は、通常、ヒープまたはデータセグメントを使用して行われますアロケータは通常、ヒープを拡張および縮小して、割り当て要求を実行します。

ヒープ方式には、完全に断片化に起因するいくつかの固有の欠陥があります。。他のメモリ割り当て方法と同様に、ヒープは断片化されます。つまり、ヒープ上の割り当てられたスペースに、使用済みメモリと未使用メモリのセクションがあります。優れたアロケータは、ヒープの拡張に頼る前に、使用するためにすでに割り当てられたメモリの未使用領域を見つけようとします。この方法の主な問題は、ヒープに2つの重要な属性しかないことです。ベースまたは仮想メモリ空​​間のヒープの始まりです。と長さ、またはそのサイズ。ヒープには、その全長を満たすのに十分なシステムメモリが必要であり、そのベースは変更できません。したがって、未使用のメモリの大きな領域が無駄になります。ヒープの最後に小さな使用済みセグメントが存在する場合、ヒープはこの位置で「スタック」する可能性があり、アドレス空間を浪費する可能性があります。怠惰なメモリ割り当てスキームでは、Linuxオペレーティングシステムでよく見られるような、大きなヒープは必ずしも同等のシステムメモリを予約するわけではありません。これは最初の書き込み時にのみ行われます(マップされていないメモリページの読み取りはゼロを返します)。これの粒度はページサイズによって異なります。

dlmallocおよびptmalloc

Doug Lea、1987年からパブリックドメインdlmalloc( "Doug Lea's Malloc")を汎用アロケータとして開発しました。GNUCライブラリ(glibc)は、dlmallocのフォークであるWolfram Glogerのptmalloc( "pthreads malloc")から派生しています。スレッド関連の改善があります。[20] [21] [22] 2019年11月の時点で、dlmallocの最新バージョンは2012年8月のバージョン2.8.6です。[23]

dlmallocは、境界タグアロケータです。ヒープ上のメモリは、「チャンク」、ヘッダーを含む8バイトに整列された データ構造、および使用可能なメモリとして割り当てられます。割り当てられたメモリには、チャンクのサイズと使用フラグの8バイトまたは16バイトのオーバーヘッドが含まれます(ドープベクトルと同様)。未割り当てチャンクは、使用可能なスペース領域に他の空きチャンクへのポインターも格納し、最小チャンクサイズを32ビットシステムでは16バイト、64ビットシステムでは24/32(アライメントに依存)バイトにします。[21] [23] :2.8.6、割り当てられた最小サイズ 

未割り当てのメモリは、同様のサイズのビン」にグループ化され、チャンクの二重リンクリストを使用して実装されます(ポインタはチャンク内の未割り当て領域に格納されます)。ビンはサイズによって3つのクラスに分類されます。[21] [23] :オーバーレイされたデータ構造 

  • 256バイト未満のリクエスト(「smallbin」リクエスト)の場合、単純な2乗の最適なアロケータが使用されます。そのビンに空きブロックがない場合、次に高いビンからのブロックが2つに分割されます。
  • 256バイト以上、mmapしきい値未満のリクエストの場合、v2.8.0以降のdlmallocは、インプレースビット単位トライアルゴリズム(「treebin」)を使用します。要求を満たすための空き領域が残っていない場合、dlmallocは通常、brkシステムコールを介してヒープのサイズを増やそうとします。この機能は、ptmallocが(v2.7.xから)作成された後に導入されたため、古い最適なアロケータを継承するglibcの一部ではありません。
  • mmapしきい値を超えるリクエスト(「largebin」リクエスト)の場合、メモリは常にmmapシステムコールを使用して割り当てられます。しきい値は通常256KBです。[24] mmapメソッドは、巨大なバッファが期限切れ後の最後に小さな割り当てをトラップする問題を回避しますが、多くのアーキテクチャではサイズが4096バイトであるメモリのページ全体を常に割り当てます。[25]

ゲーム開発者のAdrianStoneはdlmalloc、境界タグアロケータとして、仮想メモリはあるがデマンドページングがないコンソールシステムには不向きであると主張していますこれは、プールの縮小と拡大のコールバック(sysmalloc / systrim)を使用して、仮想メモリの個々のページを割り当ててコミットできないためです。デマンドページングがない場合、断片化がより大きな懸念事項になります。[26]

FreeBSDとNetBSDのjemalloc

以来FreeBSDの7.0とNetBSDの5.0、古いmalloc実装(phkmallocが)に置き換えられましたjemallocジェイソン・エヴァンスによって書かれました、。これの主な理由は、マルチスレッドに関するphkmallocのスケーラビリティの欠如でした。ロックの競合を回避するために、jemallocはCPUごとに個別の「アリーナ」を使用しますマルチスレッドアプリケーションで1秒あたりの割り当て数を測定した実験では、これによりスレッド数に比例してスケーリングされることが示されましたが、phkmallocとdlmallocの両方のパフォーマンスはスレッド数に反比例していました。[27]

OpenBSDのmalloc

OpenBSDmalloc関数の実装は、mmapを利用しています。 1ページを超えるサイズのリクエストの場合、割り当て全体がmmap;を使用して取得されます。より小さなサイズはmalloc、多数の「バケットページ」内で維持されるメモリプールから割り当てられ、これもmmap。で割り当てられます。[28] [より良いソースが必要]への呼び出しでfree、メモリが解放され、を使用してプロセスアドレス空間からマップ解除されますmunmap。このシステムは、OpenBSDのシステムコールの一部として実装されアドレス空間配置のランダム化とギャップページ機能を利用することにより、セキュリティを向上させるように設計されていmmap ます。、および解放後使用のバグを検出するために、解放後に大きなメモリ割り当てが完全にマップ解除されるため、さらに使用すると、セグメンテーション違反が発生し、プログラムが終了します。

Hoard malloc

Hoardは、スケーラブルなメモリ割り当てパフォーマンスを目標とするアロケータです。OpenBSDのアロケータと同様に、Hoardはmmap排他的に使用しますが、スーパーブロックと呼ばれる64キロバイトのチャンクでメモリを管理します。Hoardのヒープは、論理的に1つのグローバルヒープと多数のプロセッサごとのヒープに分割されます。さらに、限られた数のスーパーブロックを保持できるスレッドローカルキャッシュがあります。ローカルのスレッドごとまたはプロセッサごとのヒープ上のスーパーブロックからのみ割り当て、ほとんど空のスーパーブロックをグローバルヒープに移動して、他のプロセッサで再利用できるようにすることで、Hoardは断片化を低く抑えながら、スレッド数でほぼ線形のスケーラビリティを実現します。 。[29]

mimalloc

オープンソースのコンパクトな汎用メモリアロケータからマイクロソフトリサーチのパフォーマンスに焦点を当てました。[30]ライブラリは約11,000行のコードです。

スレッドキャッシングmalloc(tcmalloc)

すべてのスレッドには、小さな割り当て用のスレッドローカルストレージがあります大規模な割り当ての場合、mmapまたはsbrkを使用できます。Googleによって開発されmallocであるTCMalloc [31]には、デッドスレッドをローカルに保存するためのガベージコレクションがあります。TCMallocは、マルチスレッドプログラム用のglibcのptmallocの2倍以上高速であると見なされます。[32] [33]

DFWMalloc

ロックフリー機能を採用した高度に構成可能なmallocライブラリであるDFWMallocは、エンタープライズ環境向けに設計されており、断片化に対して堅牢であり、割り当てスペースの実行時検査を可能にします。

カーネル内

オペレーティングシステムのカーネルは、アプリケーションプログラムと同じようにメモリを割り当てる必要があります。実装mallocカーネル内では、多くの場合、ただし、Cライブラリで使用される実装とは大きく異なります。たとえば、メモリバッファは、DMAによって課せられる特別な制限に準拠する必要がある場合や、メモリ割り当て関数が割り込みコンテキストから呼び出される場合があります。[34]これには、オペレーティングシステムカーネルの仮想メモリサブシステムmallocと緊密に統合され実装が必要です。

mallocのオーバーライド

ので malloc、その親戚は、プログラムのパフォーマンスに大きな影響を持つことができ、アプリケーションの割り当てパターン用に最適化されているカスタム実装することにより、特定のアプリケーションの機能をオーバーライドすることは珍しいことではありません。C標準はこれを行う方法を提供していませんが、オペレーティングシステムは、動的リンクを利用することによってこれを行うさまざまな方法を見つけました。1つの方法は、単に別のライブラリにリンクしてシンボルを上書きすることです。Unix System V.3で採用されているもう1つの方法は、アプリケーションがカスタム関数にリセットできるポインターを作成mallocしてfree関数化することです。[35]

割り当てサイズの制限

malloc割り当て可能な最大のメモリブロックは、ホストシステム、特に物理メモリのサイズとオペレーティングシステムの実装によって異なります。

理論的には、最大数は、size_t型に保持できる最大値である必要があります。これは、メモリ領域のサイズを表す実装に依存する符号なし整数です。C99の標準と後で、それはとして利用可能であるSIZE_MAXから定数<stdint.h>ISO Cによって保証されていませんが、通常はです。 2^(CHAR_BIT * sizeof(size_t)) - 1

glibcシステムでは、malloc割り当て可能な最大のメモリブロックは、このサイズの半分、つまりです。[36]2^(CHAR_BIT * sizeof(ptrdiff_t) - 1) - 1

拡張機能と代替手段

さまざまなオペレーティングシステムおよびコンパイラに同梱されているCライブラリの実装には、標準mallocインターフェイスの代替および拡張機能が付属している場合があります。これらの中で注目すべきは:

  • alloca呼び出しスタックに要求されたバイト数を割り当てます。通常、呼び出し元の関数が戻るとすぐにメモリの割り当てが解除されるため、対応する割り当て解除関数は存在しません。alloca早くも32 / V(1978)のUnixシステムに存在していましたが、その使用は一部の(たとえば、組み込み)コンテキストでは問題になる可能性があります。[37]多くのコンパイラでサポートされていますが、ANSI-C規格の一部ではないため、常に移植可能であるとは限りません。また、パフォーマンスに小さな問題が発生する可能性があります。可変サイズのスタックフレームが発生するため、スタックポインタとフレームポインタの両方を管理する必要があります(固定サイズのスタックフレームでは、これらの1つが冗長です)。[38]割り当てが大きくなると、スタックオーバーフローが原因で未定義の動作が発生するリスクも高まります[39] C99は、代替のスタック割り当てメカニズムとして可変長配列提供しましたが、この機能は、後のC11標準ではオプションに追いやられました
  • POSIXは、posix_memalign呼び出し元が指定した配置でメモリを割り当てる関数定義しますその割り当てはfree[40]で割り当て解除されるため、実装は通常、mallocライブラリの一部である必要があります。

も参照してください

参考文献

  1. ^ a b ISO / IEC 9899:1999仕様 (PDF)NS。313、§7.20.3「メモリ管理機能」。
  2. ^ ゴドセ、アトゥルP。; ゴドセ、ディーパリA.(2008)。高度なCプログラミングNS。6-28:技術刊行物。NS。400. ISBN 978-81-8431-496-0CS1 maint: location (link)
  3. ^ サミット、スティーブ。「第11章:メモリ割り当て」Cプログラミングノート2020711日取得
  4. ^ Stroustrup、Bjarne(2008)。プログラミング:C ++を使用した原則と実践1009、§27.4無料ストア:アディソンウェスリー。NS。1236. ISBN 978-0-321-54372-1CS1 maint: location (link)
  5. ^ 「gccマニュアル」gnu.org 2008年12月14日取得
  6. ^ Brian W. Kernighan、Dennis M. Ritchie、 The C Programming Language、Prentice-Hall、1978; 7.9節(156ページ)が説明callocしてcfreeあり、8.7節(ページ173)のための実装について説明allocしてfree
  7. ^ alloc(3)  – バージョン6Unixプログラマーマニュアル
  8. ^ malloc(3)  – バージョン7Unixプログラマーマニュアル
  9. ^ 匿名、 Unixプログラマーズマニュアル、Vol。1、Holt Reinhart and Winston、1983(Bell Telephone Laboratoriesが著作権を保有、1983、1979); man用のページmallocなどは、275ページに記載してあります。
  10. ^ alloca(3)  -  FreeBSDのライブラリ関数マニュアル
  11. ^ a b "Castingmalloc"Cprogramming.com 20073月9日取得
  12. ^ "clang:lib / StaticAnalyzer / Checkers /MallocSizeofChecker.cppソースファイル"clang.llvm.org 20184月1取得
  13. ^ 「comp.lang.cFAQリスト・質問7.7b」C-FAQ 20073月9日取得
  14. ^ Reek、Kenneth(1997-08-04)。Cのポインター(1版)。ピアソン。ISBN 9780673999863
  15. ^ 「MEM04-C。長さゼロの割り当てに注意してください-SEICERTCコーディング標準-Confluence」wiki.sei.cmu.edu
  16. ^ 「POSIX.1-2017:malloc」pubs.opengroup.org 20191129日取得
  17. ^ 目覚めた。「WhatsAppのダブルフリーバグがRCEにどのように変わるか」20191129日取得
  18. ^ フェルカー、リッチ(2019-10-03)。「うわー。WhatsAppRCEはrealloc(p、0)の間違った動作だったので、多くの実装が主張しています。https://twitter.com/ottom6k/status/1179623539726524417…」Twitter 20191129日取得 |title=ヘルプ)の外部リンク
  19. ^ アレキサンドレス、アンドレイ(2001)。最新のC ++デザイン:ジェネリックプログラミングとデザインパターンの適用アディソン-ウェスリー。NS。78。
  20. ^ 「WolframGlogerのmallocホームページ」malloc.de 20184月1取得
  21. ^ a b c Kaempf、Michel(2001)。「Vudomallocトリック」Phrack(57):8.2009-01-22のオリジナルからアーカイブ2009年429日取得
  22. ^ 「Glibc:Malloc内部」sourceware.orgTrac 201912月1取得
  23. ^ a b c リー、ダグ。「メモリアロケータ」201912月1取得 ソースコードのHTTP
  24. ^ 「Malloc調整可能パラメータ」GNU 2009年5月2日取得
  25. ^ サンダーソン、ブルース(2004-12-12)。「RAM、仮想メモリ、ページファイル、その他すべて」Microsoftのヘルプとサポート。
  26. ^ ストーン、エイドリアン。「dlmallocが埋めることができない穴」ゲームの不安201912月1取得
  27. ^ Evans、Jason(2006-04-16)。「FreeBSDのためのスケーラブルな並行malloc(3)実装」(PDF)2012年3月18日取得
  28. ^ "libc / stdlib /malloc.c"BSD相互参照、OpenBSD src / lib /
  29. ^ バーガー、ED; マッキンリー、KS ; Blumofe、RD; ウィルソン、PR(2000年11月)。Hoard:マルチスレッドアプリケーション用のスケーラブルなメモリアロケータ(PDF)ASPLOS- IX。プログラミング言語とオペレーティングシステムのアーキテクチャサポートに関する第9回国際会議の議事録pp。117–128。CiteSeerX 10.1.1.1.4174土井10.1145 /378993.379232ISBN   1-58113-317-0
  30. ^ Microsoftが最適化されたmalloc()をオープンソースとしてリリース-Slashdot
  31. ^ TCMallocホームページ
  32. ^ ゲマワット、サンジャイ; メナージュ、ポール; TCMalloc:スレッドキャッシングMalloc
  33. ^ キャラハン、マーク(2009-01-18)。「高可用性MySQL:TCMallocによる2倍のsysbenchスループット」Mysqlha.blogspot.com 20119月18日取得
  34. ^ "kmalloc()/ kfree()include / linux /slab.h"People.netfilter.org 20119月18日取得
  35. ^ Levine、John R.(2000)[1999年10月]。「第9章:共有ライブラリ」リンカーとローダーソフトウェア工学とプログラミングのモーガンカウフマンシリーズ(1版)。米国サンフランシスコ:モーガンカウフマンISBN 1-55860-496-0OCLC  42413382ISBN 978-1-55860-496-42012年12月5日にオリジナルからアーカイブされました2020年1月12日取得 コード:[1] [2]エラッタ:[3]
  36. ^ "malloc:PTRDIFF_MAXより大きいリクエストでmallocを失敗させる"SourcewareBugzilla2019-04-18 2020730日取得
  37. ^ 「alloca()の使用が良い習慣と見なされないのはなぜですか?」stackoverflow.com 取得した2016年1月5日を
  38. ^ アマラシンゲ、サマン; レイザーソン、チャールズ(2010)。「6.172ソフトウェアシステムのパフォーマンスエンジニアリング、講義10」MITOpenCourseWareマサチューセッツ工科大学。アーカイブされたオリジナルの2015年6月22日に2015年1月27日取得
  39. ^ 「alloca(3)-Linuxのマニュアルページ」man7.org 取得した2016年1月5日を
  40. ^ posix_memalign  –システムインターフェイスリファレンス、 Single UNIX Specification The OpenGroupのIssue7

外部リンク