メモリ割り当てしたい(G4Allocator
)
1#include "G4VHit.hh"
2#include "G4Allocator.hh"
3
4class SensorHit : public G4VHit
5{
6 inline void* operator new(size_t);
7 inline void operator delete(void*);
8};
9
10//////////////////////////////////////////////////
11// (スレッドローカルな)グローバル変数を定義
12// 1. スレッドごとにSensorHit型に必要なメモリを確保する
13// 2. そのメモリ領域を SensorHitAllocator と名付ける
14extern G4ThreadLocal G4Allocator<SensorHit>* SensorHitAllocator;
15
16//////////////////////////////////////////////////
17inline void* SensorHit::operator new(size_t)
18{
19 // new演算子でメモリを割り当てるとき
20 // {
21 // SensorHit *hit = new SensorHit();
22 // }
23 // 1. SensorHitAllocatorに割り当てられたメモリのポインターを取得する
24 // 2. 初期化されてない場合は、新しくG4Allocator<TrackerHit>オブジェクトを作成
25 if(!SensorHitAllocator) {
26 SensorHitAllocator = new G4Allocator<SensorHit>;
27 }
28 return (void *) SensorHitAllocator->MallocSingle();
29};
30
31//////////////////////////////////////////////////
32inline void SensorHit::operator delete(void *hit)
33{
34 // delete演算子でメモリを解放するとき
35 //
36 // {
37 // SensorHit *hit = new SensorHit();
38 // delete hit
39 // }
40 //
41 // 1. SensorHitAllocatorに割り当てられたメモリのポインターを解放する
42 SensorHitAllocator->FreeSingle((SensorHit*)hit);
43};
ユーザーが定義したSensorHitクラスの中で、
G4Allocator
の定義new
演算子の再定義delete
演算子の再定 のメモリ割り当てに関係する箇所を抜粋しました。
G4Allocator
クラスはGeant4に用意されている高速なメモリアロケーターです。
C++のメモリ管理に詳しくないひとは、とりあえず使っておけばよいと思います。
G4ThreadLocal
はGeant4に用意されたスレッドローカル処理の関数です。
マルチスレッド処理に詳しくないひとは、とりあえず使っておけばよいと思います。
new
演算子は、コンストラクターの前に実行される特殊関数です。
ここでSensorHitAllocatorを使って、
SensorHit``クラスに必要なメモリ領域を割り当てています。
delete
演算子は、デストラクターの後に実行される特殊関数です。
前述したnew
演算子で割り当てたメモリ領域を解放します。
アロケーターしたい
1extern G4ThreadLocal G4Allocator<SensorHit>* SensorHitAllocator;
SensorHit
型のアロケーターを、
スレッドごと(G4ThreadLocal
)に、
SensorHitAllocator
という変数名で定義しています。
メモリを割り当てたい(MallocSingle
)
1SensorHitAllocator->MallocSingle();
new
演算子をoverloadする場合は
MallocSingle
を使います。
メモリを解放したい(FreeSingle
)
1SensorHitAllocator->FreeSingle(型名)
delete
演算子をoverloadする場合はFreeSingle
を使います。
引数にはnew
演算子で割り当てた型名を設定します。
割り当てサイズをしりたい(GetAllocatedSize
)
1// 割り当てられた合計サイズ
2G4int size = SensorHitAllocator->GetAllocatedSize();
3
4// 現在のページのサイズ
5G4int page_size = SensorHitAllocator->GetPageSize();
6
7// 割り当てられたページ数
8G4int n_pages = SensorHitAllocator->GetNoPages();
GetAllocatedSize
で、割り当てられたメモリの合計サイズを確認できます。