SophiaFramework UNIVERSE 5.3 |
SFXHeap クラスと SFXClusterHeap クラス
SFXClusterHeap クラスと SFXHeap クラスは、動的なヒープ管理を提供するクラスです。
SFXClusterHeap クラスはブロックアロケーションを行いますが、SFXHeap クラスはブロックアロケーションを行いません。
ヒープサイズを少量ずつ繰り返し変更するような場合、 SFXClusterHeap クラスを使う方が処理速度が向上します。
Attach 関数 と Detach 関数
SFXClusterHeap::Attach 関数は、 指定された領域を SFXClusterHeap オブジェクトに結び付けます。 SFXClusterHeap::Detach 関数はその逆の操作を行います。
コンストラクタ/デストラクタ |
---|
SFXClusterHeap( Void ) SFXClusterHeap クラスのコンストラクタです。
|
SFXClusterHeap(
UInt16 threshold
, UInt16 cluster
) SFXClusterHeap クラスのコンストラクタです。
|
パブリック関数 | |
---|---|
SFCError |
Attach(
VoidPtr heap
, UInt32 size
) 指定された領域をこのヒープオブジェクトが管理するヒープ領域として結び付けます。
|
Bool |
Contains(
VoidConstPtr heap
, UInt32 size
) このヒープオブジェクトが管理するヒープ領域と指定された領域に共通部分があるか判定します。
|
VoidPtr |
Detach(
UInt32Ptr size = null
) このヒープオブジェクトが管理しているヒープ領域を切り離します。
|
static SFXClusterHeap< T > const & |
EmptyInstance( Void ) 空のヒープオブジェクトを取得します。
|
Void |
Free( Void ) このヒープオブジェクトが管理するヒープ領域を解放します。
|
UInt16 |
GetCluster( Void ) このヒープオブジェクトが管理するヒープ領域のサイズの増減単位を取得します。[単位: バイト]
|
VoidPtr |
GetHeap( Void ) このヒープオブジェクトが管理しているヒープ領域のポインタを取得します。
|
VoidConstPtr |
GetHeap( Void ) このヒープオブジェクトが管理しているヒープ領域のポインタを取得します。
|
UInt32 |
GetSize( Void ) このヒープオブジェクトが管理するヒープ領域のサイズを取得します。
|
UInt16 |
GetThreshold( Void ) このヒープオブジェクトが管理するヒープ領域のサイズの最小値を取得します。[単位: バイト]
|
VoidConstPtr |
Protect(
VoidConstPtr heap
, UInt32 size
) 指定された範囲の領域を保護します。
|
SFCError |
Resize(
UInt32 size
) このヒープオブジェクトが管理するヒープ領域のサイズを変更します。[単位: バイト]
|
Void |
SetCluster(
UInt16 cluster
) このヒープオブジェクトが管理するヒープ領域のサイズの増減単位を設定します。[単位: バイト]
|
Void |
SetThreshold(
UInt16 param
) このヒープオブジェクトが管理するヒープ領域のサイズの最小値を設定します。[単位: バイト]
|
Void |
Unprotect(
VoidConstPtr protect
, VoidConstPtr heap
) 保護した領域を解除します。
|
operator T *( Void ) このヒープを T * 型に変換してそのポインタを返します。
|
|
Bool |
operator==(
SFXClusterHeap< T > const & left
, SFXClusterHeap< M > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものと等しいか判定します。
|
Bool |
operator==(
SFXClusterHeap< T > const & left
, VoidConstPtr right
) 左側のヒープの先頭アドレスが右側のヒープのものと等しいか判定します。
|
Bool |
operator==(
VoidConstPtr left
, SFXClusterHeap< T > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものと等しいか判定します。
|
Bool |
operator>=(
SFXClusterHeap< T > const & left
, SFXClusterHeap< M > const & right
) 左側のヒープの先頭アドレスが右側のヒープのもの以上であるか判定します。
|
Bool |
operator>=(
SFXClusterHeap< T > const & left
, VoidConstPtr right
) 左側のヒープの先頭アドレスが右側のヒープのもの以上であるか判定します。
|
Bool |
operator>=(
VoidConstPtr left
, SFXClusterHeap< T > const & right
) 左側のヒープの先頭アドレスが右側のヒープのもの以上であるか判定します。
|
Bool |
operator>(
SFXClusterHeap< T > const & left
, SFXClusterHeap< M > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものよりも大きいか判定します。
|
Bool |
operator>(
SFXClusterHeap< T > const & left
, VoidConstPtr right
) 左側のヒープの先頭アドレスが右側のヒープのものよりも大きいか判定します。
|
Bool |
operator>(
VoidConstPtr left
, SFXClusterHeap< T > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものよりも大きいか判定します。
|
Bool |
operator<=(
SFXClusterHeap< T > const & left
, SFXClusterHeap< M > const & right
) 左側のヒープの先頭アドレスが右側のヒープのもの以下であるか判定します。
|
Bool |
operator<=(
SFXClusterHeap< T > const & left
, VoidConstPtr right
) 左側のヒープの先頭アドレスが右側のヒープのもの以下であるか判定します。
|
Bool |
operator<=(
VoidConstPtr left
, SFXClusterHeap< T > const & right
) 左側のヒープの先頭アドレスが右側のヒープのもの以下であるか判定します。
|
Bool |
operator<(
SFXClusterHeap< T > const & left
, SFXClusterHeap< M > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものよりも小さいか判定します。
|
Bool |
operator<(
SFXClusterHeap< T > const & left
, VoidConstPtr right
) 左側のヒープの先頭アドレスが右側のヒープのものよりも小さいか判定します。
|
Bool |
operator<(
VoidConstPtr left
, SFXClusterHeap< T > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものよりも小さいか判定します。
|
Bool |
operator!=(
SFXClusterHeap< T > const & left
, SFXClusterHeap< M > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものと異なるか判定します。
|
Bool |
operator!=(
SFXClusterHeap< T > const & left
, VoidConstPtr right
) 左側のヒープの先頭アドレスが右側のヒープのものと異なるか判定します。
|
Bool |
operator!=(
VoidConstPtr left
, SFXClusterHeap< T > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものと異なるか判定します。
|
[ public, explicit ] SFXClusterHeap(Void);
[ public, explicit ] SFXClusterHeap( UInt16 threshold //ヒープサイズの最小値[単位: バイト] UInt16 cluster //ヒープサイズの増減単位[単位: バイト] );
引数 threshold にはヒープを割り当てる際のサイズの最小値を指定します[単位: バイト]。 また、引数 cluster にはヒープサイズを変更する際、 新しいサイズのうち threshold で指定されたサイズを超える分に関して、 サイズを変更する単位を指定します[単位: バイト]。
引数を指定しない場合、threshold = 0、cluster = 1 を指定されたことになります。
引数をとるコンストラクタの例です。
SFXClusterHeap myheap(100, 10);
この例では、ヒープの最小サイズが 100 バイトに設定され、 100 バイトを超える分については 110 バイト、120 バイト、 130 バイト…になります。
SFXClusterHeap::SetThreshold | SFXClusterHeap::SetCluster | SFXClusterHeap::Attach | SFXClusterHeap::Resize
この関数は、指定された領域をこのヒープオブジェクトが管理するヒープ領域として結び付けます。 この関数を実行した後、指定された領域はこのヒープオブジェクトが管理するヒープ領域(SFXClusterHeap オブジェクト)として操作できます。
注意 | |
---|---|
引数に指定された領域に割り当てられていたメモリは、 このヒープオブジェクトが解放されるときに自動的に解放されます。 |
SFXClusterHeap<Byte> heap; VoidPtr swap; // swap に 10240 バイトのメモリを割り当てる swap = MemoryAllocate(10240); ... // swap に割り当てた領域を heap オブジェクトに結びつける heap.Attach(swap, 10240); // 以降、swap に割り当てた領域は heap オブジェクトとして操作できる ・・・ // 使用後、swap に割り当てた領域は自動的に解放される
[ public, const ] Bool Contains( VoidConstPtr heap // 比較する領域の先頭へのポインタ UInt32 size // 比較する領域のサイズ[単位: バイト] );
この関数は、このヒープオブジェクトが管理するヒープ領域と指定された領域に共通部分があるか判定します。
SFXClusterHeap<Byte> heap(100, 10); heap.Resize(100); // heap オブジェクトのサイズを 100 バイトに設定する // area1 は heap オブジェクトに含まれる VoidConstPtr area1 = static_cast<BytePtr>(heap.GetHeap()) + 10; // area2 は heap オブジェクトに含まれない VoidConstPtr area2 = static_cast<BytePtr>(heap.GetHeap()) + 100; if (heap.Contains(area1, 200)) { // heap オブジェクトは area1 以降の領域と共通部分があるので、ここが実行される TRACE("The heap object contains area1."); } if (!heap.Contains(area2, 200)) { // heap オブジェクトは area2 以降の領域と共通部分がないので、ここが実行される TRACE("The heap object does not contain area2."); }
このヒープオブジェクトが管理していたヒープ領域へのポインタ。
この関数は、 このヒープオブジェクトが管理しているヒープ領域を切り離し、その領域のポインタを返します。
size 引数には、ヒープ領域のサイズが返されます。
注意 | |
---|---|
このヒープオブジェクトが持っていたヒープ領域はコピーされません。 |
SFXClusterHeap<Byte> heap; VoidPtr swap; UInt32 length; ... // heap オブジェクトが管理するヒープ領域を切り離し、その領域のポインタを swap に設定する // 領域のサイズは length に格納される swap = heap.Detach(&length); // 以降、heap オブジェクトのヒープ領域は swap に割り当てられた領域として操作する ... // 使用後、swap に割り当てられた領域は解放する必要がある MemoryFree(swap);
[ public, static ] SFXClusterHeap< T > const & EmptyInstance(Void);
空のヒープオブジェクト
空のヒープオブジェクトを取得します。
[ public ] Void Free(Void);
この関数は、このヒープオブジェクトが管理するヒープ領域を解放します。
SFXClusterHeap<Byte> heap;
...
heap.Free(); // heap オブジェクトが管理するヒープ領域を解放する
[ public, const ] UInt16 GetCluster(Void);
このヒープオブジェクトが管理するヒープ領域のサイズの増減単位 [単位: バイト]
この関数は、このヒープオブジェクトが管理するヒープ領域のサイズの増減単位を取得します。[単位: バイト]
SFXClusterHeap<SInt16> heap; // ヒープ確保時のクラスタサイズを 10 バイトに設定する heap.SetCluster(10); TRACE("cluster size = %d", heap.GetCluster()); // cluster size = 10
[ public ] VoidPtr GetHeap(Void);
[ public, const ] VoidConstPtr GetHeap(Void);
このヒープオブジェクトが管理しているヒープ領域のポインタ
この関数は、このヒープオブジェクトが管理しているヒープ領域のポインタを取得します。
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<Byte> heap; // ヒープサイズを設定する if (heap.Resize(0x200) == SFERR_NO_ERROR) { // ヒープサイズを取得する TRACE("size = 0x%x", heap.GetSize()); // size = 0x200 }
[ public, const ] UInt16 GetThreshold(Void);
このヒープオブジェクトが管理するヒープ領域のサイズの最小値 [単位: バイト]
この関数は、このヒープオブジェクトが管理するヒープ領域のサイズの最小値を取得します。[単位: バイト]
SFXClusterHeap<SInt16> heap; // ヒープサイズの最小値を 100 バイトに設定する heap.SetThreshold(100); TRACE("minimum heap size = %d", heap.GetThreshold()); // minimum heap size = 100
[ public, const ] VoidConstPtr Protect( VoidConstPtr heap // 保護する領域へのポインタ UInt32 size // 保護する領域のサイズ );
保護された領域へのポインタ。
この関数は、指定された範囲の領域を保護します。
このヒープオブジェクトが管理するヒープ領域と指定された範囲の領域との間に共通部分がある場合、 このヒープオブジェクトが管理するヒープ領域と共通部分を持たない別の領域を確保し、 指定された範囲の領域の内容をそこにコピーし、そのアドレスを返します。 共通部分がない場合は、引数に指定された領域のアドレスを返す処理だけを行います。
SFXClusterHeap::Protect 関数で保護した領域についての処理を終えた後は、 SFXClusterHeap::Unprotect 関数を呼び出す必要があります。
注意 | |
---|---|
SFXClusterHeap::Unprotect 関数は、 SFXClusterHeap::Protect 関数が確保した別の領域を解放します。 SFXClusterHeap::Protect 関数が別の領域を確保しなかった場合は何も行いません。 |
SFXClusterHeap<Byte> heap; VoidConstPtr protect; heap.Resize(0x200); // ヒープのサイズを 0x200 バイトに設定する // _area1 = _heap + 0x100 // _area2 = _heap + 0x200 VoidConstPtr _heap(heap.GetHeap()); VoidConstPtr _area1(static_cast<BytePtr>(heap.GetHeap()) + 0x100); VoidConstPtr _area2(static_cast<BytePtr>(heap.GetHeap()) + 0x200); TRACE("addr of _heap = 0x%08X", _heap); // addr of _heap = 0x0585BD50 TRACE("addr of _area1 = 0x%08X", _area1); // addr of _area1 = 0x0585BE50 TRACE("addr of _area2 = 0x%08X", _area2); // addr of _area2 = 0x0585BF50 // HEAP: [ _heap, _heap + 0x200 ) // AREA_1: [ _area1, _area1 + 0x100 ) // AREA_2: [ _area2, _area2 + 0x100 ) // HEAP ∩ AREA_1 ≠ Φ // AREA_1 を保護する if ((protect = heap.Protect(_area1, 0x100)) != null) { // [ protect, protect + 0x100 ) の領域は HEAP 外に確保される TRACE("addr of protect = 0x%08X", protect); // addr of protect = 0x0585BF80 // 保護を解除する: Protect() が確保した [ protect, protect + 0x100 ) の領域を解放する heap.Unprotect(protect, _area1); } // HEAP ∩ AREA_2 = Φ // AREA_2 を保護する if ((protect = heap.Protect(_area2, 0x100)) != null) { // AREA_2 は HEAP と共通部分を持たないので、protect と_area2 は等しい TRACE("addr of protect = 0x%08X", protect); // addr of protect = 0x0585BF50 // 保護を解除する: Protect() は別の領域を確保しなかったので何も行わない heap.Unprotect(protect, _area2); }
この関数は、このヒープオブジェクトが管理するヒープ領域のサイズを変更します。
変更されるヒープ領域のサイズは、必ずしも引数に指定されたサイズではなく、 以下のように最小ヒープサイズとクラスタサイズによって決定されます。
size 引数の値が最小ヒープサイズよりも小さい場合、 ヒープ領域のサイズ(実際にメモリを割り当てられるサイズ)は最小ヒープサイズになります。
最小ヒープサイズよりも大きい場合は、 最小ヒープサイズを超える部分についてクラスタサイズ単位で割り当てられます。
最小ヒープサイズとクラスタサイズの設定 | |
---|---|
最小ヒープサイズは SFXClusterHeap::SFXClusterHeap コンストラクタの threshold 引数か SFXClusterHeap::SetThreshold 関数で、 クラスタサイズは SFXClusterHeap::SFXClusterHeap コンストラクタの cluster 引数か SFXClusterHeap::SetCluster 関数で設定します。 |
注意 | |
---|---|
サイズが変化する場合、 SFXClusterHeap::GetHeap 関数の戻り値であるヒープへのポインタも変化します。 サイズに変更がない場合は、何も起きません。 |
SFXClusterHeap<Byte> heap;
heap.Resize(0x200); // ヒープサイズを 0x200 バイトに設定する
SFXClusterHeap::SFXClusterHeap | SFXClusterHeap::SetCluster | SFXClusterHeap::SetThreshold | SFXClusterHeap::Attach | SFXClusterHeap::GetHeap | SFXClusterHeap::GetSize
この関数は、 このヒープオブジェクトが管理するヒープ領域のサイズの増減単位を設定します。[単位: バイト]
デフォルト値: 1、または SFXClusterHeap::SFXClusterHeap コンストラクタの cluster 引数で指定された値 [単位: バイト]
SFXClusterHeap<SInt16> heap; // ヒープ確保時のクラスタサイズを 10 バイトに設定する heap.SetCluster(10); TRACE("cluster size = %d", heap.GetCluster()); // cluster size = 10
この関数は、このヒープオブジェクトが管理するヒープ領域のサイズの最小値を設定します。[単位: バイト]
デフォルト値: 0、または SFXClusterHeap::SFXClusterHeap コンストラクタの引数で指定された値 [単位: バイト]
SFXClusterHeap<SInt16> heap; // ヒープサイズの最小値を 100 バイトに設定する heap.SetThreshold(100); TRACE("minimum heap size = %d", heap.GetThreshold()); // minimum heap size = 100
[ public, const ] Void Unprotect( VoidConstPtr protect // SFXClusterHeap::Protect() が返した保護された領域へのポインタ VoidConstPtr heap // SFXClusterHeap::Protect() の引数に指定された保護する領域へのポインタ );
SFXClusterHeap::Protect 関数で保護した領域を解除します。
保護する領域がこのヒープオブジェクトが管理するヒープ領域と共通部分を持っていた場合は、 SFXClusterHeap::Protect 関数が確保した別の領域を解放します。 共通部分を持たなかった場合、この関数は何も行いません。
注意 | |
---|---|
保護する領域がこのヒープオブジェクトが管理するヒープ領域と共通部分を持っていた場合は、 protect 引数で指定する値と、heap 引数で指定する値は異なります。 逆に、共通部分を持たなかった場合、この 2 つの引数は同じ値になります。 |
[ public, const ] operator T *(Void);
ヒープが割り当てられている場合はそのヒープへのポインタを、 割り当てられていない場合は空ポインタを返します。
このオペレーターは、このヒープを T * 型に変換してそのポインタを返します。
[ public, friend ] Bool operator==( SFXClusterHeap< T > const & left // 左側のヒープ SFXClusterHeap< M > const & right // 右側のヒープ );
[ public, friend ] Bool operator==( SFXClusterHeap< T > const & left // 左側のヒープ VoidConstPtr right // 右側のヒープ );
[ public, friend ] Bool operator==( VoidConstPtr left // 左側のヒープ SFXClusterHeap< T > const & right // 右側のヒープ );
このオペレーターは、左側のヒープの先頭アドレスが右側のヒープのものと等しいか判定します。
注意 | |
---|---|
このオペレーターは、 左側のヒープと右側のヒープについて、その先頭アドレスを比較します。 |
[ public, friend ] Bool operator>=( SFXClusterHeap< T > const & left // 左側のヒープ SFXClusterHeap< M > const & right // 右側のヒープ );
[ public, friend ] Bool operator>=( SFXClusterHeap< T > const & left // 左側のヒープ VoidConstPtr right // 右側のヒープ );
[ public, friend ] Bool operator>=( VoidConstPtr left // 左側のヒープ SFXClusterHeap< T > const & right // 右側のヒープ );
このオペレーターは、左側のヒープの先頭アドレスが右側のヒープのもの以上であるか判定します。
注意 | |
---|---|
このオペレーターは、 左側のヒープと右側のヒープについて、その先頭アドレスを比較します。 |
[ public, friend ] Bool operator>( SFXClusterHeap< T > const & left // 左側のヒープ SFXClusterHeap< M > const & right // 右側のヒープ );
[ public, friend ] Bool operator>( SFXClusterHeap< T > const & left // 左側のヒープ VoidConstPtr right // 右側のヒープ );
[ public, friend ] Bool operator>( VoidConstPtr left // 左側のヒープ SFXClusterHeap< T > const & right // 右側のヒープ );
このオペレーターは、左側のヒープの先頭アドレスが右側のヒープのものよりも大きいか判定します。
注意 | |
---|---|
このオペレーターは、 左側のヒープと右側のヒープについて、その先頭アドレスを比較します。 |
[ public, friend ] Bool operator<=( SFXClusterHeap< T > const & left // 左側のヒープ SFXClusterHeap< M > const & right // 右側のヒープ );
[ public, friend ] Bool operator<=( SFXClusterHeap< T > const & left // 左側のヒープ VoidConstPtr right // 右側のヒープ );
[ public, friend ] Bool operator<=( VoidConstPtr left // 左側のヒープ SFXClusterHeap< T > const & right // 右側のヒープ );
このオペレーターは、左側のヒープの先頭アドレスが右側のヒープのもの以下であるか判定します。
注意 | |
---|---|
このオペレーターは、 左側のヒープと右側のヒープについて、その先頭アドレスを比較します。 |
[ public, friend ] Bool operator<( SFXClusterHeap< T > const & left // 左側のヒープ SFXClusterHeap< M > const & right // 右側のヒープ );
[ public, friend ] Bool operator<( SFXClusterHeap< T > const & left // 左側のヒープ VoidConstPtr right // 右側のヒープ );
[ public, friend ] Bool operator<( VoidConstPtr left // 左側のヒープ SFXClusterHeap< T > const & right // 右側のヒープ );
このオペレーターは、左側のヒープの先頭アドレスが右側のヒープのものよりも小さいか判定します。
注意 | |
---|---|
このオペレーターは、 左側のヒープと右側のヒープについて、その先頭アドレスを比較します。 |
[ public, friend ] Bool operator!=( SFXClusterHeap< T > const & left // 左側のヒープ SFXClusterHeap< M > const & right // 右側のヒープ );
[ public, friend ] Bool operator!=( SFXClusterHeap< T > const & left // 左側のヒープ VoidConstPtr right // 右側のヒープ );
[ public, friend ] Bool operator!=( VoidConstPtr left // 左側のヒープ SFXClusterHeap< T > const & right // 右側のヒープ );
このオペレーターは、左側のヒープの先頭アドレスが右側のヒープのものと異なるか判定します。
注意 | |
---|---|
このオペレーターは、 左側のヒープと右側のヒープについて、その先頭アドレスを比較します。 |
Copyright(c) 2002 - 2024 Sophia Cradle Incorporated All Rights Reserved. |