是否可以在内存映射文件中使用带有指向另一个结构的指针的结构,而不是将偏移量存储在某个整数类型中并计算指针?
例如给出以下结构:
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使事情变得更加混乱.