前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework UNIVERSE 5.0
SFXClusterHeap
ブロックアロケーションを行うヒープクラスです。
#include <SFXClusterHeap.h.hpp>
class SFXClusterHeap;
SFMTYPEDEFCLASS(SFXClusterHeap)

継承図

SFXClusterHeap クラスの継承図

協調図

SFXClusterHeap クラスの協調図

解説

SFXHeap クラスと SFXClusterHeap クラス

SFXClusterHeap クラスと SFXHeap クラスは、動的なヒープ管理を提供するクラスです。

SFXClusterHeap クラスはブロックアロケーションを行いますが、SFXHeap クラスはブロックアロケーションを行いません。

ヒープサイズを少量ずつ繰り返し変更するような場合、SFXClusterHeap クラスを使う方が処理速度が向上します。

Attach 関数 と Detach 関数

SFXClusterHeap::Attach 関数は、指定した型のデータの動作と管理権限を SFXClusterHeap クラスのインスタンスにデリゲート(委譲) します。 SFXClusterHeap::Detach 関数はその逆の操作を行います。

デリゲートとは : オブジェクト指向プログラミングにおいて、あるオブジェクトの振る舞いを別のオブジェクトに肩代わりして振る舞ってもらうことです。 日本語では、「委譲」と訳されます。

例 749. Attach 関数の使用方法

SFXClusterHeap<SInt16> heap;
VoidPtr swap;

// メモリを割り当てる
swap = MemoryAllocate(10240); 
...

// Void 型データ swap の動作と管理権限を SFXClusterHeap クラスのインスタンス heap にデリゲートする
heap.Attach(swap, 10240);
// 以降、Void 型データ swap を SFXClusterHeap クラスのインスタンス heap として操作できる

・・・

// 使用後、割り当てたメモリは自動的に解放される 

例 750. Detach 関数の使用方法

SFXClusterHeap heap;
VoidPtr swap;
UInt32 length;

...

// SFXClusterHeap クラスのインスタンス heap の動作と管理権限を Void 型データ swap にデリゲートする
swap = heap.Detach(&length);
// 以降、SFXClusterHeap クラスのインスタンス を Void 型データ swap として操作する

...

// 使用後、Void 型データ swap のメモリを解放する必要がある
MemoryFree(swap);

参照

SFXHeap | ヒープクラス

メンバ

コンストラクタ/デストラクタ
SFXClusterHeap( Void )
SFXClusterHeap( UInt16 threshold , UInt16 cluster )
SFXClusterHeap クラスのコンストラクタです。
パブリック関数
SFCError Attach( VoidPtr heap , UInt32 size )
指定したデータ型の動作と管理権限を SFXClusterHeap クラスのインスタンスにデリゲート (委譲) します。
Bool Contains( VoidConstPtr heap , UInt32 size )
指定したヒープと共通部分があるか判定します。
VoidPtr Detach( UInt32Ptr size = null )
SFXClusterHeap クラスのインスタンスの動作と管理権限を Void 型データにデリゲート(委譲) します。
static
SFXClusterHeap< T > const &
EmptyInstance( Void )
空のヒープを取得します。
Void Free( Void )
SFXClusterHeap クラスのインスタンスが管理しているヒープを解放します。
UInt16 GetCluster( Void )
ヒープサイズの増減単位を取得します。
VoidPtr GetHeap( Void )
SFXClusterHeap クラスのインスタンスが管理しているヒープへのポインタを取得します。
VoidConstPtr GetHeap( Void )
SFXClusterHeap クラスのインスタンスが管理しているヒープへのポインタを取得します。
UInt32 GetSize( Void )
ヒープサイズを取得します。
UInt16 GetThreshold( Void )
ヒープサイズの下限を取得します。
VoidConstPtr Protect( VoidConstPtr heap , UInt32 size )
指定したヒープを安全に割り当てます。( SFXClusterHeap オブジェクトが指定したヒープと共通部分を持つ場合は、指定したヒープの内容を別の場所に移動して割り当てます )
SFCError Resize( UInt32 size )
ヒープのサイズを設定します。
Void SetCluster( UInt16 cluster )
ヒープサイズの増減単位を設定します。
Void SetThreshold( UInt16 param )
ヒープサイズの下限を設定します。
Void Unprotect( VoidConstPtr protect , VoidConstPtr heap )
SFXClusterHeap::Protect 関数で割り当てた別のヒープを解放します。
Bool operator==( SFXClusterHeap< T > const & left , SFXClusterHeap< M > const & right )
operator==( VoidConstPtr left , SFXClusterHeap< T > const & right )
operator==( SFXClusterHeap< T > const & left , VoidConstPtr right )
== の関係を判定します。
Bool operator>=( SFXClusterHeap< T > const & left , SFXClusterHeap< M > const & right )
operator>=( VoidConstPtr left , SFXClusterHeap< T > const & right )
operator>=( SFXClusterHeap< T > const & left , VoidConstPtr right )
>= の関係を判定します。
Bool operator>( SFXClusterHeap< T > const & left , SFXClusterHeap< M > const & right )
operator>( VoidConstPtr left , SFXClusterHeap< T > const & right )
operator>( SFXClusterHeap< T > const & left , VoidConstPtr right )
> の関係を判定します。
Bool operator<=( SFXClusterHeap< T > const & left , SFXClusterHeap< M > const & right )
operator<=( VoidConstPtr left , SFXClusterHeap< T > const & right )
operator<=( SFXClusterHeap< T > const & left , VoidConstPtr right )
<= の関係を判定します。
Bool operator<( SFXClusterHeap< T > const & left , SFXClusterHeap< M > const & right )
operator<( VoidConstPtr left , SFXClusterHeap< T > const & right )
operator<( SFXClusterHeap< T > const & left , VoidConstPtr right )
< の関係を判定します。
Bool operator!=( SFXClusterHeap< T > const & left , SFXClusterHeap< M > const & right )
operator!=( VoidConstPtr left , SFXClusterHeap< T > const & right )
operator!=( SFXClusterHeap< T > const & left , VoidConstPtr right )
!= の関係を判定します。
Bool operator==( SFXClusterHeap< T > const & left , SFXClusterHeap< M > const & right )
operator==( VoidConstPtr left , SFXClusterHeap< T > const & right )
operator==( SFXClusterHeap< T > const & left , VoidConstPtr right )
== の関係を判定します。
グローバル関数
Bool operator>=( SFXClusterHeap< T > const & left , SFXClusterHeap< M > const & right )
operator>=( VoidConstPtr left , SFXClusterHeap< T > const & right )
operator>=( SFXClusterHeap< T > const & left , VoidConstPtr right )
>= の関係を判定します。
Bool operator>( SFXClusterHeap< T > const & left , SFXClusterHeap< M > const & right )
operator>( VoidConstPtr left , SFXClusterHeap< T > const & right )
operator>( SFXClusterHeap< T > const & left , VoidConstPtr right )
> の関係を判定します。
Bool operator<=( SFXClusterHeap< T > const & left , SFXClusterHeap< M > const & right )
operator<=( VoidConstPtr left , SFXClusterHeap< T > const & right )
operator<=( SFXClusterHeap< T > const & left , VoidConstPtr right )
<= の関係を判定します。
Bool operator<( SFXClusterHeap< T > const & left , SFXClusterHeap< M > const & right )
operator<( VoidConstPtr left , SFXClusterHeap< T > const & right )
operator<( SFXClusterHeap< T > const & left , VoidConstPtr right )
< の関係を判定します。
Bool operator!=( SFXClusterHeap< T > const & left , SFXClusterHeap< M > const & right )
operator!=( VoidConstPtr left , SFXClusterHeap< T > const & right )
operator!=( SFXClusterHeap< T > const & left , VoidConstPtr right )
!= の関係を判定します。

SFXClusterHeap::SFXClusterHeap
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::Attach | SFXClusterHeap::Resize


SFXClusterHeap::Attach
指定したデータ型の動作と管理権限を SFXClusterHeap クラスのインスタンスにデリゲート (委譲) します。
[ public ]
SFCError Attach(
    VoidPtr heap   // ヒープへのポインタ
    UInt32 size    // ヒープのサイズ
);

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • オブジェクト内部のヒープと指定したヒープの中に共通部分があるとき : SFERR_INVALID_PARAM

使用例

SFXClusterHeap<SInt16> heap;
VoidPtr swap;

// メモリを割り当てる
swap = MemoryAllocate(10240); 
...

// Void 型データ swap の動作と管理権限を SFXClusterHeap クラスのインスタンス heap にデリゲートする
heap.Attach(swap, 10240);
// 以降、Void 型データ swap を SFXClusterHeap クラスのインスタンス heap として操作できる

・・・

// 使用後、割り当てたメモリは自動的に解放される 

参照

SFXClusterHeap::Detach


SFXClusterHeap::Contains
指定したヒープと共通部分があるか判定します。
[ public, const ]
Bool Contains(
    VoidConstPtr heap   // 比較するヒープへのポインタ
    UInt32 size         // 比較するヒープのサイズ(バイト単位)
);

戻り値

  • 共通部分があるとき : true
  • 共通部分がないとき : false

使用例

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::Detach
SFXClusterHeap クラスのインスタンスの動作と管理権限を Void 型データにデリゲート(委譲) します。
[ public ]
VoidPtr Detach(
    UInt32Ptr size = null   // 持っていたヒープのサイズを格納する UInt32 型変数へのポインタ
);

戻り値

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);

参照

SFXClusterHeap::Attach


SFXClusterHeap::EmptyInstance
空のヒープを取得します。
[ public, static ]
SFXClusterHeap< T > const & EmptyInstance(Void);

解説

空のヒープを表すインスタンスを取得します。


SFXClusterHeap::Free
SFXClusterHeap クラスのインスタンスが管理しているヒープを解放します。
[ public ]
Void Free(Void);

使用例

SFXClusterHeap<SInt16> heap;

...

heap.Free();   // 明示的にヒープを解放する

SFXClusterHeap::GetCluster
ヒープサイズの増減単位を取得します。
[ public, const ]
UInt16 GetCluster(Void);

戻り値

ヒープサイズの増減単位(バイト単位)を返します。

使用例

SFXClusterHeap<SInt16> heap;

// ヒープ確保時のブロック サイズを 10 に設定する
heap.SetCluster(10);

TRACE("cluster = %d", heap.GetCluster());  // cluster = 10

参照

SFXClusterHeap::Resize SFXClusterHeap::SetCluster |


SFXClusterHeap::GetHeap
SFXClusterHeap クラスのインスタンスが管理しているヒープへのポインタを取得します。
[ 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
}

SFXClusterHeap::GetSize
ヒープサイズを取得します。
[ public, const ]
UInt32 GetSize(Void);

戻り値

ヒープサイズを返します。

使用例

SFXClusterHeap<SInt16> heap;

//ヒープサイズを設定する
if (heap.Resize(sizeof(SInt16) * 128) == SFERR_NO_ERROR) {
        TRACE("size = %d", heap.GetSize());  // size = 256
}

参照

SFXClusterHeap::Resize


SFXClusterHeap::GetThreshold
ヒープサイズの下限を取得します。
[ public, const ]
UInt16 GetThreshold(Void);

戻り値

ヒープサイズの下限(バイト単位)を返します。

使用例

SFXClusterHeap<SInt16> heap;

// ヒープ確保時のブロック サイズを 100 に設定
heap.SetThreshold(100);

TRACE("threshold = %d", heap.GetThreshold());  // threshold = 100

参照

SFXClusterHeap::Resize


SFXClusterHeap::Protect
指定したヒープを安全に割り当てます。( SFXClusterHeap オブジェクトが指定したヒープと共通部分を持つ場合は、指定したヒープの内容を別の場所に移動して割り当てます )
[ 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);
}

参照

SFXClusterHeap::Attach | SFXClusterHeap::Contains


SFXClusterHeap::Resize
ヒープのサイズを設定します。
[ public ]
SFCError Resize(
    UInt32 size   // 新しいヒープサイズ(バイト単位)
);

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • メモリ不足のとき : SFERR_NO_MEMORY

解説

ヒープサイズは、閾値とクラスタ サイズによって決まります。 閾値はコンストラクタの threshold か SetThreshold 関数で、クラスタ サイズはコンストラクタの cluster か SetCluster 関数で指定します。

size の値が閾値よりも小さい場合、実際に割り当てられるサイズは閾値になります。

閾値よりも大きい場合は、閾値を超える部分についてクラスタ サイズ単位で割り当てられます。

使用例

SFXClusterHeap<SInt16> heap;

heap.Resize(sizeof(UInt32) * 128);  // ヒープのサイズを 512 バイトに設定する

参照

SFXClusterHeap::SFXClusterHeap | SFXClusterHeap::SetCluster | SFXClusterHeap::SetThreshold


SFXClusterHeap::SetCluster
ヒープサイズの増減単位を設定します。
[ public ]
Void SetCluster(
    UInt16 cluster   // 新しいヒープサイズの増減単位(バイト単位)
);

使用例

SFXClusterHeap<SInt16> heap;

// ヒープ確保時のブロック サイズを 10 に設定する
heap.SetCluster(10);

TRACE("cluster = %d", heap.GetCluster());  // cluster = 10

参照

SFXClusterHeap::GetCluster | SFXClusterHeap::Resize


SFXClusterHeap::SetThreshold
ヒープサイズの下限を設定します。
[ public ]
Void SetThreshold(
    UInt16 param   // 新しいヒープサイズの下限(バイト単位)
);

使用例

SFXClusterHeap<SInt16> heap;

// 最低ヒープ量を 100 に設定する
heap.SetThreshold(100);

TRACE("threshold = %d", heap.GetThreshold());  // threshold = 100

参照

SFXClusterHeap::GetThreshold | SFXClusterHeap::Resize


SFXClusterHeap::Unprotect
SFXClusterHeap::Protect 関数で割り当てた別のヒープを解放します。
[ 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 引数と同じ値にする
}

参照

SFXClusterHeap::Protect


SFXClusterHeap::operator T *
T * 型に変換します。
[ public, const ]
operator T *(Void);

戻り値

ヒープが割り当てられている場合はそのヒープへのポインタを返します。 割り当てられていない場合は空ポインタを返します。


operator==
== の関係を判定します。
[ 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 型オブジェクト
);

戻り値

  • 先頭アドレスが等しいとき : true
  • 異なるとき : false

operator>=
>= の関係を判定します。
[ 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 型オブジェクト
);

戻り値

  • left のアドレスが right 以上のとき : true
  • それ以外のとき : false

解説

ヒープの先頭アドレスを比較します。


operator>
> の関係を判定します。
[ 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 型のオブジェクト
);

戻り値

  • left のアドレスが大きいとき : true
  • それ以外のとき : false

解説

ヒープの先頭アドレスを比較します。


operator<=
<= の関係を判定します。
[ 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   // 比較するヒープへのポインタ
);

戻り値

  • left のアドレスが right 以下のとき : true
  • それ以外のとき : false

解説

ヒープの先頭アドレスを比較します。


operator<
< の関係を判定します。
[ 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 型オブジェクト
);

戻り値

  • left のアドレスが小さいとき : true
  • それ以外のとき : false

解説

ヒープの先頭アドレスを比較します。


operator!=
!= の関係を判定します。
[ 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 型オブジェクト
);

戻り値

  • 先頭アドレスが異なるとき : true
  • 等しいとき : false