SophiaFramework UNIVERSE 5.3 |
SFXHeap クラスと SFXClusterHeap クラス
SFXHeap クラスと SFXClusterHeap クラスは、動的なヒープ管理を提供するクラスです。
SFXClusterHeap クラスはブロックアロケーションを行いますが、SFXHeap クラスはブロックアロケーションを行いません。
ヒープサイズの変更頻度が少ない場合、SFXHeap クラスを使う方がメモリ効率が良くなります。
Attach 関数 と Detach 関数
SFXHeap::Attach 関数は、 指定された領域を SFXHeap オブジェクトに結び付けます。 SFXHeap::Detach 関数はその逆の操作を行います。
コンストラクタ/デストラクタ |
---|
SFXHeap( Void ) SFXHeap クラスのコンストラクタです。
|
パブリック関数 | |
---|---|
SFCError |
Attach(
VoidPtr heap
, UInt32 size
) 指定された領域をこのヒープオブジェクトが管理するヒープ領域として結び付けます。
|
Bool |
Contains(
VoidConstPtr heap
, UInt32 size
) このヒープオブジェクトが管理するヒープ領域と指定された領域に共通部分があるか判定します。
|
VoidPtr |
Detach(
UInt32Ptr size = null
) このヒープオブジェクトが管理しているヒープ領域を切り離します。
|
static SFXHeap< T > const & |
EmptyInstance( Void ) 空のヒープオブジェクトを取得します。
|
Void |
Free( Void ) このヒープオブジェクトが管理するヒープ領域を解放します。
|
VoidPtr |
GetHeap( Void ) このヒープオブジェクトが管理しているヒープ領域のポインタを取得します。
|
VoidConstPtr |
GetHeap( Void ) このヒープオブジェクトが管理しているヒープ領域のポインタを取得します。
|
UInt32 |
GetSize( Void ) このヒープオブジェクトが管理するヒープ領域のサイズを取得します。
|
VoidConstPtr |
Protect(
VoidConstPtr heap
, UInt32 size
) 指定された範囲の領域を保護します。
|
SFCError |
Resize(
UInt32 size
) このヒープオブジェクトが管理するヒープ領域のサイズを指定されたサイズに変更します。[単位: バイト]
|
Void |
Unprotect(
VoidConstPtr protect
, VoidConstPtr heap
) 保護した領域を解除します。
|
operator T *( Void ) このヒープを T * 型に変換してそのポインタを返します。
|
|
Bool |
operator==(
SFXHeap< T > const & left
, SFXHeap< M > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものと等しいか判定します。
|
Bool |
operator==(
SFXHeap< T > const & left
, VoidConstPtr right
) 左側のヒープの先頭アドレスが右側のヒープのものと等しいか判定します。
|
Bool |
operator==(
VoidConstPtr left
, SFXHeap< T > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものと等しいか判定します。
|
Bool |
operator>=(
SFXHeap< T > const & left
, SFXHeap< M > const & right
) 左側のヒープの先頭アドレスが右側のヒープのもの以上であるか判定します。
|
Bool |
operator>=(
SFXHeap< T > const & left
, VoidConstPtr right
) 左側のヒープの先頭アドレスが右側のヒープのもの以上であるか判定します。
|
Bool |
operator>=(
VoidConstPtr left
, SFXHeap< T > const & right
) 左側のヒープの先頭アドレスが右側のヒープのもの以上であるか判定します。
|
Bool |
operator>(
SFXHeap< T > const & left
, SFXHeap< M > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものよりも大きいか判定します。
|
Bool |
operator>(
SFXHeap< T > const & left
, VoidConstPtr right
) 左側のヒープの先頭アドレスが右側のヒープのものよりも大きいか判定します。
|
Bool |
operator>(
VoidConstPtr left
, SFXHeap< T > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものよりも大きいか判定します。
|
Bool |
operator<=(
SFXHeap< T > const & left
, SFXHeap< M > const & right
) 左側のヒープの先頭アドレスが右側のヒープのもの以下であるか判定します。
|
Bool |
operator<=(
SFXHeap< T > const & left
, VoidConstPtr right
) 左側のヒープの先頭アドレスが右側のヒープのもの以下であるか判定します。
|
Bool |
operator<=(
VoidConstPtr left
, SFXHeap< T > const & right
) 左側のヒープの先頭アドレスが右側のヒープのもの以下であるか判定します。
|
Bool |
operator<(
SFXHeap< T > const & left
, SFXHeap< M > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものよりも小さいか判定します。
|
Bool |
operator<(
SFXHeap< T > const & left
, VoidConstPtr right
) 左側のヒープの先頭アドレスが右側のヒープのものよりも小さいか判定します。
|
Bool |
operator<(
VoidConstPtr left
, SFXHeap< T > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものよりも小さいか判定します。
|
Bool |
operator!=(
SFXHeap< T > const & left
, SFXHeap< M > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものと異なるか判定します。
|
Bool |
operator!=(
SFXHeap< T > const & left
, VoidConstPtr right
) 左側のヒープの先頭アドレスが右側のヒープのものと異なるか判定します。
|
Bool |
operator!=(
VoidConstPtr left
, SFXHeap< T > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものと異なるか判定します。
|
グローバル関数 | |
---|---|
Bool |
operator==(
SFXHeap< T > const & left
, SFXHeap< M > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものと等しいか判定します。
|
Bool |
operator==(
SFXHeap< T > const & left
, VoidConstPtr right
) 左側のヒープの先頭アドレスが右側のヒープのものと等しいか判定します。
|
Bool |
operator==(
VoidConstPtr left
, SFXHeap< T > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものと等しいか判定します。
|
Bool |
operator>=(
SFXHeap< T > const & left
, SFXHeap< M > const & right
) 左側のヒープの先頭アドレスが右側のヒープのもの以上であるか判定します。
|
Bool |
operator>=(
SFXHeap< T > const & left
, VoidConstPtr right
) 左側のヒープの先頭アドレスが右側のヒープのもの以上であるか判定します。
|
Bool |
operator>=(
VoidConstPtr left
, SFXHeap< T > const & right
) 左側のヒープの先頭アドレスが右側のヒープのもの以上であるか判定します。
|
Bool |
operator>(
SFXHeap< T > const & left
, SFXHeap< M > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものよりも大きいか判定します。
|
Bool |
operator>(
SFXHeap< T > const & left
, VoidConstPtr right
) 左側のヒープの先頭アドレスが右側のヒープのものよりも大きいか判定します。
|
Bool |
operator>(
VoidConstPtr left
, SFXHeap< T > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものよりも大きいか判定します。
|
Bool |
operator<=(
SFXHeap< T > const & left
, SFXHeap< M > const & right
) 左側のヒープの先頭アドレスが右側のヒープのもの以下であるか判定します。
|
Bool |
operator<=(
SFXHeap< T > const & left
, VoidConstPtr right
) 左側のヒープの先頭アドレスが右側のヒープのもの以下であるか判定します。
|
Bool |
operator<=(
VoidConstPtr left
, SFXHeap< T > const & right
) 左側のヒープの先頭アドレスが右側のヒープのもの以下であるか判定します。
|
Bool |
operator<(
SFXHeap< T > const & left
, SFXHeap< M > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものよりも小さいか判定します。
|
Bool |
operator<(
SFXHeap< T > const & left
, VoidConstPtr right
) 左側のヒープの先頭アドレスが右側のヒープのものよりも小さいか判定します。
|
Bool |
operator<(
VoidConstPtr left
, SFXHeap< T > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものよりも小さいか判定します。
|
Bool |
operator!=(
SFXHeap< T > const & left
, SFXHeap< M > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものと異なるか判定します。
|
Bool |
operator!=(
SFXHeap< T > const & left
, VoidConstPtr right
) 左側のヒープの先頭アドレスが右側のヒープのものと異なるか判定します。
|
Bool |
operator!=(
VoidConstPtr left
, SFXHeap< T > const & right
) 左側のヒープの先頭アドレスが右側のヒープのものと異なるか判定します。
|
[ public, explicit ] SFXHeap(Void);
この関数は、指定された領域をこのヒープオブジェクトが管理するヒープ領域として結び付けます。 この関数を実行した後、指定された領域はこのヒープオブジェクトが管理するヒープ領域(SFXHeap オブジェクト)として操作できます。
注意 | |
---|---|
引数に指定された領域に割り当てられていたメモリは、 このヒープオブジェクトが解放されるときに自動的に解放されます。 |
SFXHeap<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 // 比較する領域のサイズ[単位: バイト] );
この関数は、このヒープオブジェクトが管理するヒープ領域と指定された領域に共通部分があるか判定します。
SFXHeap<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 引数には、ヒープ領域のサイズが返されます。
注意 | |
---|---|
このヒープオブジェクトが管理するヒープ領域はコピーされません。 |
SFXHeap<Byte> heap; VoidPtr swap; UInt32 length; ... // heap オブジェクトが管理するヒープ領域を切り離し、その領域のポインタを swap に設定する // 領域のサイズは length に格納される swap = heap.Detach(&length); // 以降、heap オブジェクトのヒープ領域は swap に割り当てられた領域として操作する ... // 使用後、swap に割り当てられた領域は解放する必要がある MemoryFree(swap);
[ public, static ] SFXHeap< T > const & EmptyInstance(Void);
空のヒープオブジェクト
空のヒープオブジェクトを取得します。
[ public ] Void Free(Void);
この関数は、このヒープオブジェクトが管理するヒープ領域を解放します。
SFXHeap<Byte> heap;
...
heap.Free(); // heap オブジェクトが管理するヒープ領域を解放する
[ public ] VoidPtr GetHeap(Void);
[ public, const ] VoidConstPtr GetHeap(Void);
このヒープオブジェクトが管理しているヒープ領域のポインタ
この関数は、このヒープオブジェクトが管理しているヒープ領域のポインタを取得します。
SFXHeap<SInt16> heap; // ヒープのサイズ設定する if (heap.Resize(sizeof(SInt16) * 128) == SFERR_NO_ERROR) { TRACE("addr = 0x%08X", heap.GetHeap()); // addr = 0x0686FF80 }
[ public, const ] UInt32 GetSize(Void);
このヒープオブジェクトが管理するヒープ領域のサイズ
この関数は、このヒープオブジェクトが管理するヒープ領域のサイズを取得します。
SFXHeap<Byte> heap; // ヒープのサイズを設定する if (heap.Resize(0x200) == SFERR_NO_ERROR) { // ヒープのサイズを取得する TRACE("size = 0x%x", heap.GetSize()); // size = 0x200 }
[ public, const ] VoidConstPtr Protect( VoidConstPtr heap // 保護する領域へのポインタ UInt32 size // 保護する領域のサイズ );
保護された領域へのポインタ。
この関数は、指定された範囲の領域を保護します。
このヒープオブジェクトが管理するヒープ領域と指定された範囲の領域との間に共通部分がある場合、 このヒープオブジェクトが管理するヒープ領域と共通部分を持たない別の領域を確保し、 指定された範囲の領域の内容をそこにコピーし、そのアドレスを返します。 共通部分がない場合は、引数に指定された領域のアドレスを返す処理だけを行います。
SFXHeap::Protect 関数で保護した領域についての処理を終えた後は、 SFXHeap::Unprotect 関数を呼び出す必要があります。
注意 | |
---|---|
SFXHeap::Unprotect 関数は、 SFXHeap::Protect 関数が確保した別の領域を解放します。 SFXHeap::Protect 関数が別の領域を確保しなかった場合は何も行いません。 |
SFXHeap<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); }
この関数は、このヒープオブジェクトが管理するヒープ領域のサイズを指定されたサイズに変更します。
指定されたサイズのメモリがこのヒープに割り当てられます。
注意 | |
---|---|
サイズが変化する場合、 SFXHeap::GetHeap 関数の戻り値であるヒープへのポインタも変化します。 |
SFXHeap<Byte> heap;
heap.Resize(0x200); // ヒープのサイズを 0x200 バイトに設定する
[ public, const ] Void Unprotect( VoidConstPtr protect // SFXHeap::Protect() が返した保護された領域へのポインタ VoidConstPtr heap // SFXHeap::Protect() の引数に指定された保護する領域へのポインタ );
SFXHeap::Protect 関数で保護した領域を解除します。
保護する領域がこのヒープオブジェクトが管理するヒープ領域と共通部分を持っていた場合は、 SFXHeap::Protect 関数が確保した別の領域を解放します。 共通部分を持たなかった場合、この関数は何も行いません。
注意 | |
---|---|
保護する領域がこのヒープオブジェクトが管理するヒープ領域と共通部分を持っていた場合は、 protect 引数で指定する値と、heap 引数で指定する値は異なります。 逆に、共通部分を持たなかった場合、この 2 つの引数は同じ値になります。 |
[ public, const ] operator T *(Void);
ヒープが割り当てられている場合はそのヒープへのポインタを、 割り当てられていない場合は空ポインタを返します。
このオペレーターは、このヒープを T * 型に変換してそのポインタを返します。
[ public, friend ] Bool operator==( SFXHeap< T > const & left // 左側のヒープ SFXHeap< M > const & right // 右側のヒープ );
[ public, friend ] Bool operator==( SFXHeap< T > const & left // 左側のヒープ VoidConstPtr right // 右側のヒープ );
[ public, friend ] Bool operator==( VoidConstPtr left // 左側のヒープ SFXHeap< T > const & right // 右側のヒープ );
このオペレーターは、左側のヒープの先頭アドレスが右側のヒープのものと等しいか判定します。
注意 | |
---|---|
このオペレーターは、 左側のヒープと右側のヒープについて、その先頭アドレスを比較します。 |
[ public, friend ] Bool operator>=( SFXHeap< T > const & left // 左側のヒープ SFXHeap< M > const & right // 右側のヒープ );
[ public, friend ] Bool operator>=( SFXHeap< T > const & left // 左側のヒープ VoidConstPtr right // 右側のヒープ );
[ public, friend ] Bool operator>=( VoidConstPtr left // 左側のヒープ SFXHeap< T > const & right // 右側のヒープ );
このオペレーターは、左側のヒープの先頭アドレスが右側のヒープのもの以上であるか判定します。
注意 | |
---|---|
このオペレーターは、 左側のヒープと右側のヒープについて、その先頭アドレスを比較します。 |
[ public, friend ] Bool operator>( SFXHeap< T > const & left // 左側のヒープ SFXHeap< M > const & right // 右側のヒープ );
[ public, friend ] Bool operator>( SFXHeap< T > const & left // 左側のヒープ VoidConstPtr right // 右側のヒープ );
[ public, friend ] Bool operator>( VoidConstPtr left // 左側のヒープ SFXHeap< T > const & right // 右側のヒープ );
このオペレーターは、左側のヒープの先頭アドレスが右側のヒープのものよりも大きいか判定します。
注意 | |
---|---|
このオペレーターは、 左側のヒープと右側のヒープについて、その先頭アドレスを比較します。 |
[ public, friend ] Bool operator<=( SFXHeap< T > const & left // 左側のヒープ SFXHeap< M > const & right // 右側のヒープ );
[ public, friend ] Bool operator<=( SFXHeap< T > const & left // 左側のヒープ VoidConstPtr right // 右側のヒープ );
[ public, friend ] Bool operator<=( VoidConstPtr left // 左側のヒープ SFXHeap< T > const & right // 右側のヒープ );
このオペレーターは、左側のヒープの先頭アドレスが右側のヒープのもの以下であるか判定します。
注意 | |
---|---|
このオペレーターは、 左側のヒープと右側のヒープについて、その先頭アドレスを比較します。 |
[ public, friend ] Bool operator<( SFXHeap< T > const & left // 左側のヒープ SFXHeap< M > const & right // 右側のヒープ );
[ public, friend ] Bool operator<( SFXHeap< T > const & left // 左側のヒープ VoidConstPtr right // 右側のヒープ );
[ public, friend ] Bool operator<( VoidConstPtr left // 左側のヒープ SFXHeap< T > const & right // 右側のヒープ );
このオペレーターは、左側のヒープの先頭アドレスが右側のヒープのものよりも小さいか判定します。
注意 | |
---|---|
このオペレーターは、 左側のヒープと右側のヒープについて、その先頭アドレスを比較します。 |
[ public, friend ] Bool operator!=( SFXHeap< T > const & left // 左側のヒープ SFXHeap< M > const & right // 右側のヒープ );
[ public, friend ] Bool operator!=( SFXHeap< T > const & left // 左側のヒープ VoidConstPtr right // 右側のヒープ );
[ public, friend ] Bool operator!=( VoidConstPtr left // 左側のヒープ SFXHeap< T > const & right // 右側のヒープ );
このオペレーターは、左側のヒープの先頭アドレスが右側のヒープのものと異なるか判定します。
注意 | |
---|---|
このオペレーターは、 左側のヒープと右側のヒープについて、その先頭アドレスを比較します。 |
Copyright(c) 2002 - 2024 Sophia Cradle Incorporated All Rights Reserved. |