メモリ割り当てしたい(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クラスの中で、

  1. G4Allocatorの定義

  2. new演算子の再定義

  3. 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で、割り当てられたメモリの合計サイズを確認できます。

リファレンス