c++ - mmap的简明指针算法

标签 c++ pointers mmap pointer-arithmetic

我正在尝试mmap 一 block 内存,然后使用指针算法将其视为一个数组。 mmaped 区域的大小将由应用程序更改,因为可能会传递不同的大小和数据类型。到目前为止,这是我所做的工作,但是,我认为可能有更好的方法。

#include <iostream>
#include <sys/mman.h>

int main(int argc, char** argv) {
    int num_ints = 10;
    int num_bytes = num_ints * sizeof(int);
    void *base =  mmap(0, num_bytes, PROT_READ | PROT_WRITE,
                       MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);

    // Ugly way
    for(int i = 0; i < num_ints; i++)
    {
        *((int *) base + i) = i;
        std::cout << *((int *) base + i) << " " << ((int *) base + i) << std::endl; 
    }
    std::cout << std::endl; 

    // A better way
    int *ptr = (int *) base;
    for(int i = 0; i < num_ints; i++)
    {
        *(ptr + i) += i;
        std::cout << *(ptr + i) << " " << (ptr + i) << std::endl; 
    }

    // What I'm looking is base[i] = i; which leads to
    // warning: pointer of type 'void *' used in arithmetic [-Wpointer-arith]
    // error: 'void*' is not a pointer-to-object type

    munmap(base, num_bytes);
    return(0);
}

对于更简洁的实现方法有什么建议吗?

最佳答案

真的没有多少了,是吗?

关于缩短它的唯一方法是 std::iota(ptr, ptr+num_ints, 0) .在这里对你帮助不大,因为你仍然有用于打印目的的循环。

一种更工业化的方法是将逻辑包装在类模板中,类似于 std::array<T, n> .这可能会将您的程序变成

int main(int argc, char** argv)
{
  mmarray<int,10> ints;
  std::iota(begin(ints), end(ints), 0);
  for(int i: ints) std::cout << i << '\n';
}

管道隐藏在构造函数、析构函数中,beginend方法。

关于c++ - mmap的简明指针算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51727202/

相关文章:

c++ - 请用指针解释数组

c - 在 POSIX unix 系统中,是否可以以永远不会换出磁盘以支持其他文件的方式对文件进行 mmap()?

c - mmap on/proc/pid/mem

linux - 将 DMA 缓冲区写入内存映射文件

c++ - 通过使用 WIN32OLE 的 Ruby 的 C++ dll 的代码覆盖率

c++ - 在 try catch block 中返回 catch 是不是很糟糕?这是一个好习惯

c++ - 将结构指针复制到指针

c - 指针 (x2) 的地址是什么?

c++ - 防止 C++(或 C++0x)中的 header 爆炸

c++ - 非静态成员 C++98 的无效使用