对内存映射文件中的对象进行排序

时间:2017-07-06 11:46:14

标签: c++ memory-management dynamic-memory-allocation memory-mapped-files solaris-10

我的结构如下:

struct XX
{
   int x;
   char szT[200];
   int y;
} ;

我有一个文件存储了几个XX个对象,通过fwrite调用写入。现在,当我使用mmap将文件读作内存mmaped文件时,我使用as:

// sz = size of the file in bytes
// fd = file descriptor of the file opened through fopen in O_RDWR mode
char *p = (char *) mmap(0,sz,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
unsigned int N = (sz / sizeof(XX)); // number of objects

因此,如果我有N XX类型的对象,我可以访问第一个对象:

XX *px = (XX*) p;

并且i-th对象我可以px + i访问i <= N。 我可以使用std::sort对正在访问的内存映射文件的内容进行排序,因为px是第一条记录的指针,而px+i指向i-th条记录。 我不想将px, px+1, px+2等存储在XX指针的向量vector<XX*>中,因为我可以直接从内存映射文件中访问记录。 请建议。

1 个答案:

答案 0 :(得分:3)

阅读documentation of std::sort

以下编译干净利落。它使用特殊的lambda(比较数字的平方)对原始数组进行排序

 #include <algorithm>
 #include <functional>

 void sort_array(int *p, size_t n) {
   std::sort(p, p+n, [=](int x, int y) { return x*x < y*y; });
 }    

你应该能够适应你的情况:

 void sort_xx (XX*p, size_t n) {
   std::sort(p, p+n, [=](const XX& x, const XX& y) 
    { return strcmp(x.szT, y.szT)<0; });
 }

详细了解lambda expressions in C++[=]是按值(实际上是通过副本)表示的捕获列表(对于所有已关闭的变量,理论上这是编译器可能优化的唯一一个strcmp - 因此不会关闭天真地;可能lambda抽象及其应用程序将由优化编译器内联。)