【C++】mio库
#include "mio.hpp"
mio 是一个跨平台的 C++11 头文件库,用于内存映射文件 IO。
跨平台 :可在 Linux、macOS 和 Windows 等多个操作系统上运行。
主要用途:
高效文件处理 :适用于需要高效文件读写操作的场景,如高速日志记录与回放、大数据处理(地图渲染、科学计算等)、数据存储和检索服务(如数据库实现)、实时数据分析等,通过内存映射直接处理大文件,可节省反复读取的时间,减少磁盘 I/O 次数,提高数据存取速度。
内存映射文件 IO :提供了基本的内存映射功能,允许开发者直接将文件内容加载到进程地址空间,从而以极高的效率进行读写操作。
mio::mmap_sink
#include "mio/mmap.hpp"
#include <iostream>
#include <string>
int main() {
try {
// 创建一个 mmap_sink 对象,映射一个文件用于写入
std::error_code err;
mio::mmap_sink sink("output.txt", err);
//mio 库中用于创建 mio::mmap_sink 对象的一个工厂函数
//要映射的文件路径
//偏移量为 0,表示从文件的起始位置开始映射
//映射的文件长度(字节)
//错误码
mmap_sink make_mmap_sink(const MappingToken& token, mmap_sink::size_type offset, mmap_sink::size_type length, std::error_code& error);
//使用工厂函数创建一个 mmap_sink 对象,映射一个文件用于写入,从文件0字节处开始映射,映射 1000 字节
mio::mmap_sink sink("output.txt", 0, 1000, err);
//使用工厂函数创建一个 mmap_sink 对象,映射一个文件用于写入,映射整个文件
auto sink = mio::make_mmap_sink(filePath.string(), 0, mio::map_entire_file, denMMErr);
//检查文件是否已被成功映射到内存中
bool mio::mmap_sink::is_mapped();
// 获取映射内存的指针
char* data = sink.data();
// 写入数据到映射内存
std::string content = "Hello, World!";
std::memcpy(data, content.c_str(), content.size() + 1);
//将内存映射区域的更改同步到磁盘,确保所有在内存中的修改都被保存到文件中。参数 denMMErr 用于接收同步操作过程中可能发生的错误码。
sink.sync(denMMErr);
//取消对内存映射区域的映射,释放与映射相关的系统资源。取消映射后,程序不能再通过内存指针访问该映射区域。
sink.unmap();
std::cout << "Data written to file successfully." << std::endl;
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl;
return 1;
}
return 0;
}
优势
高性能:通过直接操作内存,减少磁盘 I/O 次数,提高数据写入速度。
零拷贝:避免数据在用户空间和内核空间之间不必要的拷贝。
灵活性:支持从已打开的文件描述符创建映射,并处理任意偏移和长度。
std::error_code类
//
std::error_code::message();//是一个成员函数,用于返回与当前错误代码相关的描述性信息。这个描述性信息是一个字符串,通常包含了错误的详细说明,
std::error_code::value();//一个成员函数,用于获取错误码的原始值(underlying value)。这个值是一个整数,表示具体的错误代码
int handle_denMMErr(const std::error_code& error)
{
const auto& errmsg = error.message();
std::printf("error mapping file: %s, exiting...\n", errmsg.c_str());
return error.value();
}

浙公网安备 33010602011771号