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

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

例如给出以下结构:

typedef struct _myStruct_t {
  int number;
  struct _myStruct_t *next;
} myStruct_t;
myStruct_t* first = (myStruct_t*)mapViewHandle;
myStruct_t* next = first->next;

而不是这个:

typedef struct _myStruct_t {
  int number;
  int next;
} myStruct_t;
myStruct_t* first = (myStruct_t*)mappedFileHandle;
myStruct_t* next = (myStruct_t*)(mappedFileHandle+first->next);

我读到了’__based’关键字,但这是Microsoft特定的,因此受Windows限制.

寻找与GCC编译器一起工作的东西.

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

所以这听起来像是你自己的领域;虽然我愿意被告知.

我最后一次处理这样的事情是在掌上平台上,除非你锁定内存,否则它有可能被移动.你有来自分配的内存句柄,你在使用它之前必须使用MemHandleLock,并且在你完成使用之后MemPtrUnlock它,因此可以通过操作系统移动块(这似乎发生在基于ARM的掌上设备上).

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

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

点赞