ダイナミックオブジェクト作成(一)


C++プログラムの設計と作成について、メモリの申請と解放はプログラムの性能と安定性に直接印象を与え、ここで自分が最近C++ダイナミックオブジェクトの作成に対する理解をまとめた.
1.メモリの割り当て方法:
動的オブジェクトの作成は、その動作メカニズムを理解するには、オペレーティングシステムのメモリ割り当て方法を理解する必要があります.オペレーティングシステムでは、メモリの割り当て方法には主に以下の3つの方法があります.
a.静的記憶領域の割り当て:メモリはコンパイル時またはオペレーティングシステムの初期化時に割り当てられ、このメモリのライフサイクルはプログラムの全実行期間にあり、サイズは変わらず、メモリの割り当ては再行われない.たとえば、グローバル変数、静的変数staticのメモリ割り当て
b.スタック上のメモリ割り当て:
スタックはシステムのデータ構造であり、その分配方式はシステムがメンテナンスを行い、開発者が管理する必要はない.
例えば、局所変数は、その作用領域の範囲内でシステムによって制御局所変数のスタック上の作成と破棄である.
c.スタック上のメモリの割り当て:
すなわち,本稿で論じる動的オブジェクトの作成であり,スタックメモリ上の割り当てはプログラム実行中に開発者が作成を制御し,使用の良し悪しがプログラムの性能と安定性を直接決定する.
たとえば、Malloc()/free()C言語標準ライブラリ関数は、C言語で動的メモリの割り当てを担当し、new/delete C++で動的にオブジェクトを作成するために使用されます(動的メモリの割り当てと削除)
2.動的メモリ割り当てと仮想メモリ
動的メモリ割り当ては異なるオペレーティングシステムで実現方式が異なり、仮想メモリをサポートするオペレーティングシステムでは、動的メモリ割り当てと削除が仮想メモリで行われる.一部の組み込みオペレーティングシステムでは、仮想メモリはサポートされていません.このように、動的メモリの割り当ては物理メモリ上で直接行われます.仮想メモリの割り当てには、主に次のものが含まれます(一部のブログでは、詳細は自分で確認できます)
a.プロセスが使用するメモリアドレスは仮想的であり(各プロセスは自分がすべてのメモリリソースを持っていると感じている)、最終的にシステムの実際の物理アドレスを指すにはページテーブルのマッピングが必要である.b.メインメモリとディスクはページ交換でプロセスと関連データをロードし、データがいつメインメモリにロードされ、いつディスクにキャッシュされるかはOSスケジューリングであり、アプリケーションには透過的である.c.仮想メモリはユーザプログラムにページベースのメモリサイズを提供し、32ビットシステムでは、ユーザはページサイズ単位で最大4 G(カーネルは1 Gや2 Gなどのメモリアドレスを使用する)バイトの仮想メモリに割り当てることができる.
d.仮想メモリの割り当てについて、オペレーティングシステムは一般的にアプリケーションが要求するサイズの仮想メモリを割り当て、アプリケーションが実際に使用する場合にのみ、対応するオペレーティングシステムインタフェースを呼び出し、このアプリケーションにページ単位の実際の物理メモリを割り当てる.
e.すべてのコンピュータシステムに仮想メモリメカニズムがあるわけではありません.一般的にMMUハードウェアがサポートされているシステムでこそ、仮想メモリの実現があります.多くの組み込みオペレーティングシステムでは仮想メモリメカニズムがなく、プログラムの動的割り当ては実際には物理メモリに対して直接動作します.Vxworks、Uc/OSなどの多くの典型的なリアルタイム埋め込みシステムがそうである.
3.ダイナミックオブジェクトの作成
ダイナミックオブジェクト作成の基本インプリメンテーション:
メモリサイズの決定---メモリを初期化---メモリアドレスを返します
頻繁に動的メモリの割り当てを行うと、メモリの破片が発生し、システムの性能と安定に影響するため、異なるシステムでは、動的メモリ管理に対して、異なる実現アルゴリズムがある.(参考資料:Glibのソースコード、メモリ管理書籍)異なるオペレーティングシステムには異なる実装方式があり、プログラムの移植性のために一般的な開発言語は統一的なインタフェースを提供しており、C言語では標準CライブラリとGlibではmalloc/freeをインタフェースとする動的メモリ割り当て機能を実現している.だからmalloc/freeは異なるオペレーティングシステムに対して異なる実現方式を持っている.
一般的にCライブラリのmalloc/free関数はアプリケーションレベルのメモリ管理アルゴリズムを実現し、システムが本当にメモリを必要とする場合、オペレーティングシステムのAPI(システム呼び出し)を通じて実際の物理メモリを取得します.もちろん、サードパーティのメモリマネージャを使用したり、malloc/free関数を自分で書き換えたりすることでアプリケーションレベルのメモリ管理を実現することもできます.
malloc()/free()の基本形式:
 void* malloc( size_t  size );
 void* calloc(size_t nmemb, size_t size);          
 void  free(void *ptr);       
 void* realloc(void *ptr, size_t size);

malloc()/free()の実現方式はオペレーティングシステムにおいて異なるが、ここではあまり説明しない.しばらくは使えるようにすればいい.