【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();
}
posted @ 2025-06-27 15:06  仰望星河Leon  阅读(36)  评论(0)    收藏  举报