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编译器的东西。
我很确定 GCC 中没有类似于__basedVisual Studio 的指针。我唯一一次看到类似的内置东西是在一些非常奇怪的硬件上。Visual Studio 扩展为所有涉及指针的操作提供了一个地址转换层。
听起来你已经进入了自己的领域;尽管我愿意别人告诉我。
上次我处理类似的事情是在掌上平台上,除非你锁定内存,否则它有可能被移动。您从分配中获得内存句柄,并且在使用它之前必须这样做MemHandleLock,并且MemPtrUnlock在使用完它之后必须这样做,以便操作系统可以移动该块(这似乎发生在基于 ARM 的掌上设备上)。
如果您坚持在内存映射结构中存储指针式值,第一个建议是将值存储在 an 中intptr_t,这是一个可以包含指针值的 int 大小。虽然您的偏移量不太可能超过 4GB,但保持安全是值得的。
也就是说,这可能很容易在 C++ 中使用模板类实现,只是将问题标记为 C 会使事情变得更加混乱。