我试图mmap
一块内存,然后使用指针算法将其视为数组。应用程序将更改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);
}
有人建议采用更简洁的方式实现这一目标吗?
答案 0 :(得分:1)
剩下的还不多吗?
您唯一可以做的就是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';
}
管道隐藏在构造函数,析构函数,begin
和end
方法中。