3

以下のコードでは:

file_mapping fm(FilePath, read_only); 
mapped_region region(fm,read_only);
char* const data = static_cast<char *>(region.get_address());
for(size_t n=0; n<region.get_size(); ++n){
    cout << data[n];
}

data配列を作成せずに、マップされたメモリから文字にアクセスする方法はありますか?

EDITコードが参照するusing namespace boost:interprocess;

4

1 に答える 1

0

data配列」は、実際には高価な割り当てまたはコピーとして作成されるのではなく、OS がメモリ内のファイルの内容を表すために使用する仮想メモリ空​​間への単なるポインタです。これはちょっとした簿記ですが、実際に重要な作業はありません。

最初にアクセスすると (つまり、data[0])、C++ ストリームまたは C の (f)read よりも効率的な最適化されたルーチンを使用して、OS がファイルの最初のブロックにページングします。優れた OS は、2 番目以降のブロックをプリロードし、古い使用済みブロックを静かにドロップするため、物理メモリを効率的に管理しながら、予想よりも高速になります。ファイルが空き仮想メモリ スペースに収まるようにしてください。通常は、32 ビット コードの 1 GB 以上のファイルで問題が発生するだけです。

いいえ、コンテンツにアクセスする他の方法はありません。(標準の I/O ルーチンを使用してファイルを再度開くことを割引します!)

于 2013-02-20T23:47:08.117 に答える