【问题标题】:How to export a struct to a file, and then memory map the file?如何将结构导出到文件,然后对文件进行内存映射?
【发布时间】:2011-05-04 18:30:40
【问题描述】:

我有一个我想导出到文件的结构,然后 mmap() 那个文件。一个问题是该结构有一个成员变量,它是一个字符串,我不确定 mmap 将如何处理它。在这种情况下,所有这些字符串的大小都相同,均为 8 个字符。我在 Windows 上工作,虽然我使用的是我在网上找到的 mmap() 函数,它应该复制 Linux mmap() 函数。

结构体本身定义为:

struct testStruct
{
    string testString;
    unsigned int testInt;
    unsigned int tsetArr[9];
};

是否可以为对象定义sizeof()的返回值?

是否可以映射包含结构数据的文件?

我必须使用什么代码将结构导出到文件,然后对其进行映射?

【问题讨论】:

    标签: c++ struct mmap memory-mapped-files memory-mapping


    【解决方案1】:

    C++ 标准不保证std::string 的表示形式,因此这不起作用。 std::string 可能(并且通常会)在堆上的任何位置分配其内容,因此您将存储一个指针和一个大小成员,而不是字符串本身。

    不过,具有编译时常量大小的 char 数组(例如 tsetArr)应该可以工作。

    是否可以为对象定义sizeof()的返回值?

    没有。 sizeof 不是函数,所以你不能重载它(严格来说,它有一个,但没有一个返回值,因为它没有从任何地方返回;它被编译器扩展为常量)。

    是否可以映射包含struct 数据的文件?

    可能,是的,但我不建议这样做;您的代码将无法移植,甚至可能无法移植到同一平台上的不同编译器,并且您的 struct 是一成不变的。如果你仍然想这样做,只有 mmap POD(普通旧数据)没有指针成员,并在你的 struct 中放置一个 unsigned version 成员,每次更改其定义时都会增加它。

    【讨论】:

    • 谢谢。假设所有字符串具有相同数量的字符(8),那么是否可以内存映射字符串向量?
    • @Tristan: std::vectorstd::string 有相同的问题:它在堆上分配其内容(如果需要增长,可能会更改位置)。二维数组(char[N][8] 用于某些编译时常量 N)应该可以工作。
    • 再次感谢。在我将 8 个字符串的文件读取到二维数组的 mmap 之后,将这些 N 项中的每一项作为字符串访问的最快方法是什么?我将处理数十万件物品,所以速度很重要。
    • 你的意思是std::string?不;您必须进行数十万次构造,每个构造都涉及内存分配。将它们用作char*
    • 我有点困惑。你能举一个声明这个数组的例子吗?以及如何映射到二维数组?
    【解决方案2】:
    struct testStruct
    {
        char testString[9];
        unsigned int testInt;
        unsigned int tsetArr[9];
    };
    

    【讨论】:

      猜你喜欢
      • 2012-02-08
      • 2010-12-28
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      • 2018-05-18
      相关资源
      最近更新 更多