CMemFile クラス
メモリ ファイルをサポートする CFile 派生クラス。
構文
class CMemFile : public CFile
メンバー
パブリック コンストラクター
名前 | 説明 |
---|---|
CMemFile::CMemFile | メモリ ファイル オブジェクトを構築します。 |
パブリック メソッド
名前 | 説明 |
---|---|
CMemFile::Attach | メモリのブロックを にアタッチします CMemFile 。 |
CMemFile::D etach | メモリ ブロックをデタッチし、デタッチされたメモリ CMemFile ブロックへのポインターを返します。 |
CMemFile::GetBufferPtr | メモリ ファイルをバックアップするメモリ バッファーを取得または書き込みます。 |
保護メソッド
名前 | 説明 |
---|---|
CMemFile::Alloc | メモリ割り当ての動作を変更するには、オーバーライドします。 |
CMemFile::Free | メモリの割り当て解除動作を変更するオーバーライド。 |
CMemFile::GrowFile | ファイルを拡大するときの動作を変更するには、オーバーライドします。 |
CMemFile::Memcpy | ファイルの読み取りと書き込み時のメモリ コピー動作を変更するには、オーバーライドします。 |
CMemFile::Realloc | メモリの再割り当て動作を変更するオーバーライド。 |
解説
これらのメモリ ファイルは、ファイルがディスクではなく RAM に格納されている点を除き、ディスク ファイルと同様に動作します。 メモリ ファイルは、次の場合に役立ちます。
- 高速一時ストレージ
- 独立したプロセス間で生バイトを転送する
- 独立プロセス間でのシリアル化オブジェクトの転送
CMemFile
オブジェクトは、独自のメモリを自動的に割り当てることができます。 または、Attach を呼び出して、独自のメモリ ブロックをオブジェクトにCMemFile
アタッチすることもできます。 どちらの場合も、メモリ ファイルを自動的に拡張するためのメモリは、0 でない場合nGrowBytes
は 、-size インクリメントでnGrowBytes
割り当てられます。
メモリ がオブジェクトによってCMemFile
最初に割り当てられた場合、メモリ ブロックはオブジェクトのCMemFile
破棄時に自動的に削除されます。それ以外の場合は、オブジェクトにアタッチしたメモリの割り当てを解除する必要があります。
Detach を呼び出すことによって、オブジェクトからデタッチするときに指定されたポインターを介してメモリ ブロックにCMemFile
アクセスできます。
最も一般的な用途CMemFile
は、オブジェクトをCMemFile
作成し、CFile メンバー関数を呼び出して使用することです。 自動的にCMemFile
作成すると開きます。CFile::Open は呼び出しません。これはディスク ファイルにのみ使用されます。 ディスク ファイルを使用しないため CMemFile
、データ メンバー CFile::m_hFile
は使用されません。
メンバー関数 Duplicate、LockRange、UnlockRange は実装されていませんCMemFile
。 CFile
オブジェクトでこれらの関数をCMemFile
呼び出すと、CNotSupportedException が取得されます。
CMemFile
では、ランタイム ライブラリ関数 malloc、realloc、Free を使用してメモリの割り当て、再割り当て、割り当て解除を行い、読み取りと書き込み時にコピー メモリをブロックする組み込み memcpy を使用します。 この動作またはファイルを拡張するときの CMemFile
動作を変更する場合は、適切な関数から CMemFile
独自のクラスを派生させ、オーバーライドします。
詳細については、「MFC およびメモリ管理 (MFC) のファイル」および「ランタイム ライブラリ リファレンス」の「ファイル処理」を参照してください。CMemFile
継承階層
CMemFile
必要条件
ヘッダー: afx.h
CMemFile::Alloc
この関数は、メンバー関数によって呼び出されます CMemFile
。
virtual BYTE* Alloc(SIZE_T nBytes);
パラメーター
nBytes
割り当てられるメモリのバイト数。
戻り値
割り当てられたメモリ ブロックへのポインター。割り当てが失敗した場合は NULL。
解説
カスタム メモリ割り当てを実装するには、この関数をオーバーライドします。 この関数をオーバーライドする場合は、Free と Realloc もオーバーライドする必要があります。
既定の実装では、ランタイム ライブラリ関数 malloc を使用してメモリを割り当てます。
CMemFile::Attach
この関数を呼び出して、メモリ CMemFile
ブロックを .
void Attach(
BYTE* lpBuffer,
UINT nBufferSize,
UINT nGrowBytes = 0);
パラメーター
lpBuffer
アタッチ CMemFile
するバッファーへのポインター。
nBufferSize
バッファーのサイズをバイト単位で指定する整数。
nGrowBytes
メモリ割り当ての増分 (バイト単位)。
解説
これにより、 CMemFile
メモリ ファイルとしてメモリ ブロックが使用されます。
nGrowBytes が 0 の場合、CMemFile
ファイルの長さを nBufferSize に設定します。 これは、アタッチ CMemFile
される前のメモリ ブロック内のデータがファイルとして使用されることを意味します。 この方法で作成されたメモリ ファイルを拡大することはできません。
ファイルを拡張できないため、ファイルの拡張を CMemFile
試みないように注意してください。 たとえば、CFile:Write のオーバーライドをCMemFile
呼び出して末尾を超えて書き込んだり、長さが nBufferSize より長い CFile:SetLength を呼び出したりしないでください。
nGrowBytes が 0 より大きい場合、CMemFile
アタッチしたメモリ ブロックの内容は無視されます。 のオーバーライドCFile::Write
を使用して、メモリ ファイルの内容をCMemFile
最初から書き込む必要があります。 ファイルの末尾を超えて書き込もうとしたり、オーバーライドを呼び出してファイルをCMemFile
拡張しようとすると、CMemFile
メモリ割り当てが nGrowBytes 単位で増加します。CFile::SetLength
渡Attach
すメモリ ブロックが Alloc と互換性のあるメソッドで割り当てられなかった場合、メモリ割り当ての増加は失敗します。 既定の Alloc
実装と互換性を持つには、ランタイム ライブラリ関数 malloc または calloc を使用してメモリを割り当てる必要があります。
CMemFile::CMemFile
最初のオーバーロードでは、空のメモリ ファイルが開きます。
CMemFile(UINT nGrowBytes = 1024);
CMemFile(
BYTE* lpBuffer,
UINT nBufferSize,
UINT nGrowBytes = 0);
パラメーター
nGrowBytes
メモリ割り当ての増分 (バイト単位)。
lpBuffer サイズ nBufferSize の情報を受け取るバッファーへのポインター。
nBufferSize
ファイル バッファーのサイズをバイト単位で指定する整数。
解説
ファイルはコンストラクターによって開かれます。 CFile::Open を呼び出さないでください。
2 番目のオーバーロードは、最初のコンストラクターを使用し、すぐに同じパラメーターで Attach を呼び出した場合と同じように動作します。 詳細については、Attach
を参照してください。
例
CMemFile f; // Ready to use - no Open necessary.
BYTE * pBuf = (BYTE *)new char [1024];
CMemFile g(pBuf, 1024, 256);
// same as CMemFile g; g.Attach(pBuf, 1024, 256);
CMemFile::D etach
この関数を呼び出して、使用されているメモリ ブロックへのポインターを取得します CMemFile
。
BYTE* Detach();
戻り値
メモリ ファイルの内容を格納しているメモリ ブロックへのポインター。
解説
この関数を呼び出すと、 CMemFile
. Attach を呼び出すことによって、メモリ ブロックをCMemFile
再アタッチできます。 ファイルを再アタッチし、その中のデータを使用する場合は、CFile::GetLength を呼び出して、呼び出すDetach
前にファイルの長さを取得する必要があります。 データ ( nGrowBytes
== 0) を使用できるようにメモリ ブロックCMemFile
をアタッチした場合、メモリ ファイルを拡張することはできません。
CMemFile::Free
この関数は、メンバー関数によって呼び出されます CMemFile
。
virtual void Free(BYTE* lpMem);
パラメーター
lpMem
割り当てを解除するメモリへのポインター。
解説
カスタム メモリの割り当て解除を実装するには、この関数をオーバーライドします。 この関数をオーバーライドする場合は、Alloc と Realloc もオーバーライドする必要があります。
CMemFile::GetBufferPtr
メモリ ファイルをバックアップするメモリ バッファーを取得または書き込みます。
virtual UINT GetBufferPtr(
UINT nCommand,
UINT nCount = 0,
void** ppBufStart = NULL,
void** ppBufMax = NULL
);
パラメーター
nCommand
実行する bufferCommand (bufferCheck
、、、bufferCommit
bufferRead
またはbufferWrite
)。
nCount
nCommand に応じて、読み取り、書き込み、またはコミットするバッファー内のバイト数。 バッファーから読み取る場合は、-1 を指定して、ファイルの現在位置から末尾までのバッファーを返します。
ppBufStart
[out]バッファーの先頭。 NULL
nCommand が bufferCommit
.
ppBufMax
[out]バッファーの末尾。 NULL
nCommand が bufferCommit
.
戻り値
コマンド 値 | 戻り値 |
---|---|
buffercheck |
ダイレクト バッファリングが サポートされている場合は bufferDirect を返し、それ以外の場合は 0 を返します。 |
bufferCommit |
0 を返します。 |
bufferRead または bufferWrite |
返されたバッファー領域のバイト数を返します。 ppBufStart と ppBufMax は、読み取り/書き込みバッファーの開始と終了を指します。 |
解説
メモリ バッファー (m_nPosition
) 内の現在の位置は、nCommand に応じて、次の方法で 進みます。
nCommand | バッファー位置 |
---|---|
bufferCommit |
現在の位置は、コミットされたバッファーのサイズによって進みます。 |
bufferRead |
現在の位置は、読み取りバッファーのサイズによって進みます。 |
CMemFile::GrowFile
この関数は、いくつかのメンバー関数によって呼び出されます CMemFile
。
virtual void GrowFile(SIZE_T dwNewLen);
パラメーター
dwNewLen
メモリ ファイルの新しいサイズ。
解説
ファイルの拡大方法 CMemFile
を変更する場合は、オーバーライドできます。 既定の実装では、Realloc を呼び出して既存のブロック (またはメモリ ブロックを作成する Alloc) を拡張し、コンストラクターまたは Attach 呼び出しで指定された値のnGrowBytes
倍数でメモリを割り当てます。
CMemFile::Memcpy
この関数は、メモリ ファイルとの間でデータを転送する CFile::Read および CFile::Write のオーバーライドによってCMemFile
呼び出されます。
virtual BYTE* Memcpy(
BYTE* lpMemTarget,
const BYTE* lpMemSource,
SIZE_T nBytes);
パラメーター
lpMemTarget
ソース メモリのコピー先となるメモリ ブロックへのポインター。
lpMemSource
ソース メモリ ブロックへのポインター。
nBytes
コピー対象のバイト数。
戻り値
lpMemTarget のコピー。
解説
これらのメモリ コピーの実行方法 CMemFile
を変更する場合は、この関数をオーバーライドします。
CMemFile::Realloc
この関数は、メンバー関数によって呼び出されます CMemFile
。
virtual BYTE* Realloc(
BYTE* lpMem,
SIZE_T nBytes);
パラメーター
lpMem
再割り当てするメモリ ブロックへのポインター。
nBytes
メモリ ブロックの新しいサイズ。
戻り値
再割り当て (および場合によっては移動) されたメモリ ブロックへのポインター。再割り当てが失敗した場合は NULL。
解説
カスタム メモリの再割り当てを実装するには、この関数をオーバーライドします。 この関数をオーバーライドする場合は、Alloc と Free もオーバーライドする必要があります。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示