使用C的内存映射文件中的相对指针

Rap*_*elH 5 c pointers memory-mapped-files

是否可以使用带有指向内存映射文件中另一个结构的指针的结构,而不是将偏移量存储为某种整数类型并计算指针?

例如给出以下结构:

typedef struct _myStruct_t {
  int number;
  struct _myStruct_t *next;
} myStruct_t;
myStruct_t* first = (myStruct_t*)mapViewHandle;
myStruct_t* next = first->next;
Run Code Online (Sandbox Code Playgroud)

代替这个:

typedef struct _myStruct_t {
  int number;
  int next;
} myStruct_t;
myStruct_t* first = (myStruct_t*)mappedFileHandle;
myStruct_t* next = (myStruct_t*)(mappedFileHandle+first->next);
Run Code Online (Sandbox Code Playgroud)

我读过有关'__based'关键字的信息,但这是Microsoft特有的,因此与Windows绑定。

寻找使用GCC编译器的东西。

Pet*_*esh 2

我很确定 GCC 中没有类似于__basedVisual Studio 的指针。我唯一一次看到类似的内置东西是在一些非常奇怪的硬件上。Visual Studio 扩展为所有涉及指针的操作提供了一个地址转换层。

听起来你已经进入了自己的领域;尽管我愿意别人告诉我。

上次我处理类似的事情是在掌上平台上,除非你锁定内存,否则它有可能被移动。您从分配中获得内存句柄,并且在使用它之前必须这样做MemHandleLock,并且MemPtrUnlock在使用完它之后必须这样做,以便操作系统可以移动该块(这似乎发生在基于 ARM 的掌上设备上)。

如果您坚持在内存映射结构中存储指针式值,第一个建议是将值存储在 an 中intptr_t,这是一个可以包含指针值的 int 大小。虽然您的偏移量不太可能超过 4GB,但保持安全是值得的。

也就是说,这可能很容易在 C++ 中使用模板类实现,只是将问题标记为 C 会使事情变得更加混乱。