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数组的情况下从映射内存中访问字符?

编辑代码是指using namespace boost:interprocess;

4

1 回答 1

0

data数组”实际上并不是作为昂贵的分配或复制创建的——它只是指向操作系统用来表示内存中文件内容的虚拟内存空间的指针。所以这是一些簿记,但没有实际的重要工作。

当您第一次访问它时(即 data[0]),第一个文件块中的 OS 页面使用优化的例程比 C++ 流或 C 的 (f) 读取更有效。好的操作系统还会预加载第二个和后续块并静默丢弃旧的使用块,因此有效地管理物理内存,同时比您预期的要快。只需确保您的文件适合您的可用虚拟内存空间 - 通常只有 1+ GB 的 32 位代码文件才有问题。

所以不,没有其他方式 - 想要或知道 - 访问内容。(我不赞成使用标准 I/O 例程重新打开文件!)

于 2013-02-20T23:47:08.117 回答