![]() ![]() ![]()
|
BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework UNIVERSE 5.0 |


SFXHeap クラスと SFXClusterHeap クラス
SFXClusterHeap クラスと SFXHeap クラスは、動的なヒープ管理を提供するクラスです。
SFXClusterHeap クラスはブロックアロケーションを行いますが、SFXHeap クラスはブロックアロケーションを行いません。
ヒープサイズを少量ずつ繰り返し変更するような場合、SFXClusterHeap クラスを使う方が処理速度が向上します。
Attach 関数 と Detach 関数
SFXClusterHeap::Attach 関数は、指定した型のデータの動作と管理権限を SFXClusterHeap クラスのインスタンスにデリゲート(委譲) します。 SFXClusterHeap::Detach 関数はその逆の操作を行います。
デリゲートとは : オブジェクト指向プログラミングにおいて、あるオブジェクトの振る舞いを別のオブジェクトに肩代わりして振る舞ってもらうことです。 日本語では、「委譲」と訳されます。
| コンストラクタ/デストラクタ |
|---|
|
SFXClusterHeap( Void ) SFXClusterHeap( UInt16 threshold , UInt16 cluster ) SFXClusterHeap クラスのコンストラクタです。
|
[ public, explicit ] SFXClusterHeap(Void);
[ public, explicit ]
SFXClusterHeap(
UInt16 threshold //ヒープサイズの下限(バイト単位)
UInt16 cluster //ヒープサイズの増減単位(バイト単位)
);
引数をとるものについて、引数 threshold にはヒープを割り当てる際のサイズの下限をバイト単位で指定します。
また、引数 cluster にはヒープサイズを変更する際、 新しいサイズのうち threshold で指定したサイズを超える分に関して、 何バイト単位でサイズを変更するかを指定します。
引数をとらないものについては、threshold = 0、cluster = 1 を指定したのと同じになります。
コンストラクタでは実際のヒープの割り当ては行われません。 ヒープを使う前に必ず Attach 関数または Resize 関数を呼び出してください。
引数をとるコンストラクタの例です。
SFXClusterHeap myheap(100, 10);
この例では、ヒープの最小サイズが 100 バイトに設定され、 100 バイトを超える分については 110 バイト、120 バイト、 130 バイト…になります。
SFXClusterHeap<SInt16> heap; VoidPtr swap; // メモリを割り当てる swap = MemoryAllocate(10240); ... // Void 型データ swap の動作と管理権限を SFXClusterHeap クラスのインスタンス heap にデリゲートする heap.Attach(swap, 10240); // 以降、Void 型データ swap を SFXClusterHeap クラスのインスタンス heap として操作できる ・・・ // 使用後、割り当てたメモリは自動的に解放される
[ public, const ] Bool Contains( VoidConstPtr heap // 比較するヒープへのポインタ UInt32 size // 比較するヒープのサイズ(バイト単位) );
SFXClusterHeap heap1(100, 10); heap1.Resize(100); // heap1 のサイズを 100 バイトに設定する SFXClusterHeap heap2; // heap2 は heap1 の両端を 10 バイトずつ削ったもの heap2.Attach(static_cast<BytePtr>(heap1.GetHeap()) + 10, heap1.GetSize() - 20); if (heap2.Contains(heap1.GetHeap(), heap1.GetSize())) { // 共通部分があるので、ここが実行される ... } else { // ここは実行されない ... }
SFXClusterHeap クラスが持っているヒープへのポインタを返します。
SFXClusterHeap クラスのインスタンスが持つヒープはコピーされません。
size パラメータには SFXClusterHeap クラスのインスタンスが持っていたヒープサイズが返されます。
SFXClusterHeap heap; VoidPtr swap; UInt32 length; ... // SFXClusterHeap クラスのインスタンス heap の動作と管理権限を Void 型データ swap にデリゲートする swap = heap.Detach(&length); // 以降、SFXClusterHeap クラスのインスタンス を Void 型データ swap として操作する ... // 使用後、Void 型データ swap のメモリを解放する必要がある MemoryFree(swap);
[ public, static ] SFXClusterHeap< T > const & EmptyInstance(Void);
空のヒープを表すインスタンスを取得します。
[ public ] Void Free(Void);
SFXClusterHeap<SInt16> heap;
...
heap.Free(); // 明示的にヒープを解放する
[ public, const ] UInt16 GetCluster(Void);
ヒープサイズの増減単位(バイト単位)を返します。
SFXClusterHeap<SInt16> heap; // ヒープ確保時のブロック サイズを 10 に設定する heap.SetCluster(10); TRACE("cluster = %d", heap.GetCluster()); // cluster = 10
[ public ] VoidPtr GetHeap(Void);
[ public, const ] VoidConstPtr GetHeap(Void);
SFXClusterHeap クラスのインスタンスが管理しているヒープへのポインタを返します。
SFXClusterHeap<SInt16> heap; //ヒープサイズ設定する if (heap.Resize(sizeof(SInt16) * 128) == SFERR_NO_ERROR) { TRACE("addr = 0x%08X", heap.GetHeap()); // addr = 0x0686FF80 }
[ public, const ] UInt32 GetSize(Void);
ヒープサイズを返します。
SFXClusterHeap<SInt16> heap; //ヒープサイズを設定する if (heap.Resize(sizeof(SInt16) * 128) == SFERR_NO_ERROR) { TRACE("size = %d", heap.GetSize()); // size = 256 }
[ public, const ] UInt16 GetThreshold(Void);
ヒープサイズの下限(バイト単位)を返します。
SFXClusterHeap<SInt16> heap; // ヒープ確保時のブロック サイズを 100 に設定 heap.SetThreshold(100); TRACE("threshold = %d", heap.GetThreshold()); // threshold = 100
[ public, const ] VoidConstPtr Protect( VoidConstPtr heap // 保護するヒープへのポインタ UInt32 size // 保護するヒープのサイズ );
ヒープへのポインタを返します。
SFXClusterHeap オブジェクトのヒープと指定したヒープ領域との間に共通部分がある場合、 新たなヒープを確保し指定したヒープの内容を移動します。共通部分がない場合は、指定したヒープをそのまま割り当てます。
保護を解除する場合は、Unprotect 関数を使います。
SFXClusterHeap<SInt16> heap1; SFXClusterHeap<SInt16> heap2; VoidConstPtr protect; heap1.Resize(sizeof(UInt32) * 128); // ヒープのサイズを 512 バイトに設定する heap2.Resize(sizeof(UInt32) * 128); // ヒープのサイズを 512 バイトに設定する // 自分自身と演算するときに競合しないように値を保存する VoidConstPtr sa(heap2.GetHeap()); UInt32 ss(heap2.GetSize()); UInt32 ds(heap1.GetSize()); TRACE("addr = 0x%08X", heap1.GetHeap()); // addr = 0x06871C84 // 別のヒープを割り当てる if ((protect = heap1.Protect(sa, ss)) != null) { TRACE("addr = 0x%08X", protect); // addr = 0x06871EB8 // ヒープを解放する heap1.Unprotect(protect, sa); }
ヒープサイズは、閾値とクラスタ サイズによって決まります。 閾値はコンストラクタの threshold か SetThreshold 関数で、クラスタ サイズはコンストラクタの cluster か SetCluster 関数で指定します。
size の値が閾値よりも小さい場合、実際に割り当てられるサイズは閾値になります。
閾値よりも大きい場合は、閾値を超える部分についてクラスタ サイズ単位で割り当てられます。
SFXClusterHeap<SInt16> heap;
heap.Resize(sizeof(UInt32) * 128); // ヒープのサイズを 512 バイトに設定する
SFXClusterHeap<SInt16> heap; // ヒープ確保時のブロック サイズを 10 に設定する heap.SetCluster(10); TRACE("cluster = %d", heap.GetCluster()); // cluster = 10
SFXClusterHeap<SInt16> heap; // 最低ヒープ量を 100 に設定する heap.SetThreshold(100); TRACE("threshold = %d", heap.GetThreshold()); // threshold = 100
[ public, const ] Void Unprotect( VoidConstPtr protect // が返したポインタ VoidConstPtr heap // の割り当てたヒープへのポインタ );
SFXClusterHeap::Protect 関数で設定したヒープを解放します。
SFXClusterHeap<SInt16> heap1; SFXClusterHeap<SInt16> heap2; VoidConstPtr protect; heap1.Resize(sizeof(UInt32) * 128); // ヒープのサイズを 512 バイトに設定する heap2.Resize(sizeof(UInt32) * 128); // ヒープのサイズを 512 バイトに設定する // 自分自身と演算するときに競合しないように値を保存する VoidConstPtr sa(heap2.GetHeap()); UInt32 ss(heap2.GetSize()); UInt32 ds(heap1.GetSize()); TRACE("addr = 0x%08X", heap1.GetHeap()); // addr = 0x06871C84 // 安全に別のヒープを割り当てる if ((protect = heap1.Protect(sa, ss)) != null) { TRACE("addr = 0x%08X", protect); // addr = 0x06871EB8 // ヒープを解放する heap1.Unprotect(protect, sa);// Unprotect の第 2 引数は Protect の第 1 引数と同じ値にする }
[ public, const ] operator T *(Void);
ヒープが割り当てられている場合はそのヒープへのポインタを返します。 割り当てられていない場合は空ポインタを返します。
[ public, friend ] Bool operator==( SFXClusterHeap< T > const & left // 比較する SFXClusterHeap 型オブジェクト SFXClusterHeap< M > const & right // 比較する SFXClusterHeap 型オブジェクト );
[ public, friend ] Bool operator==( SFXClusterHeap< T > const & left // 比較する SFXClusterHeap 型オブジェクト VoidConstPtr right // 比較するヒープへのポインタ );
[ public, friend ] Bool operator==( VoidConstPtr left // 比較するヒープへのポインタ SFXClusterHeap< T > const & right // 比較する SFXClusterHeap 型オブジェクト );
[ public, friend ] Bool operator>=( SFXClusterHeap< T > const & left // 比較する SFXClusterHeap 型オブジェクト SFXClusterHeap< M > const & right // 比較する SFXClusterHeap 型オブジェクト );
[ public, friend ] Bool operator>=( SFXClusterHeap< T > const & left // 比較する SFXClusterHeap 型オブジェクト VoidConstPtr right // 比較するヒープへのポインタ );
[ public, friend ] Bool operator>=( VoidConstPtr left // 比較するヒープへのポインタ SFXClusterHeap< T > const & right // 比較する SFXClusterHeap 型オブジェクト );
ヒープの先頭アドレスを比較します。
[ public, friend ] Bool operator>( SFXClusterHeap< T > const & left // 比較する SFXClusterHeap 型のオブジェクト SFXClusterHeap< M > const & right // 比較する SFXClusterHeap 型のオブジェクト );
[ public, friend ] Bool operator>( SFXClusterHeap< T > const & left // 比較する SFXClusterHeap 型のオブジェクト VoidConstPtr right // 比較するヒープへのポインタ );
[ public, friend ] Bool operator>( VoidConstPtr left // 比較するヒープへのポインタ SFXClusterHeap< T > const & right // 比較する SFXClusterHeap 型のオブジェクト );
ヒープの先頭アドレスを比較します。
[ public, friend ] Bool operator<=( SFXClusterHeap< T > const & left // 比較する SFXClusterHeap 型オブジェクト SFXClusterHeap< M > const & right // 比較する SFXClusterHeap 型オブジェクト );
[ public, friend ] Bool operator<=( SFXClusterHeap< T > const & left // 比較する SFXClusterHeap 型オブジェクト VoidConstPtr right // 比較するヒープへのポインタ );
[ public, friend ] Bool operator<=( VoidConstPtr left // 比較する SFXClusterHeap 型オブジェクト SFXClusterHeap< T > const & right // 比較するヒープへのポインタ );
ヒープの先頭アドレスを比較します。
[ public, friend ] Bool operator<( SFXClusterHeap< T > const & left // 比較する SFXClusterHeap 型オブジェクト SFXClusterHeap< M > const & right // 比較する SFXClusterHeap 型オブジェクト );
[ public, friend ] Bool operator<( SFXClusterHeap< T > const & left // 比較する SFXClusterHeap 型オブジェクト VoidConstPtr right // 比較するヒープへのポインタ );
[ public, friend ] Bool operator<( VoidConstPtr left // 比較するヒープへのポインタ SFXClusterHeap< T > const & right // 比較する SFXClusterHeap 型オブジェクト );
ヒープの先頭アドレスを比較します。
[ public, friend ] Bool operator!=( SFXClusterHeap< T > const & left // 比較する SFXClusterHeap 型オブジェクト SFXClusterHeap< M > const & right // 比較する SFXClusterHeap 型オブジェクト );
[ public, friend ] Bool operator!=( SFXClusterHeap< T > const & left // 比較する SFXClusterHeap 型オブジェクト VoidConstPtr right // 比較するヒープへのポインタ );
[ public, friend ] Bool operator!=( VoidConstPtr left // 比較するヒープへのポインタ SFXClusterHeap< T > const & right // 比較する SFXClusterHeap 型オブジェクト );
|
Copyright (C) 2002 - 2008 Sophia Cradle Incorporated All Rights Reserved. |
![]() ![]() ![]()
|