Windows 移植-共享内存x32&;x64工艺

Windows 移植-共享内存x32&;x64工艺,windows,winapi,porting,Windows,Winapi,Porting,32位主机Windows应用程序设置共享内存(使用内存映射文件/CreateFileMapping()API),然后其他32位客户端进程使用此共享内存相互通信 我计划将主机应用程序移植到64位平台,一旦准备就绪,我希望32位和64位客户端进程都能够使用主64位主机应用程序的共享内存设置 为主机x32应用程序编写的原始代码几乎在所有地方都使用“size_t”,因为从x32移动到x64时,大小从4字节到8字节不等,所以我正在寻找替换它的方法 我打算将“size_t”替换为“unsigned long

32位主机Windows应用程序设置共享内存(使用内存映射文件/CreateFileMapping()API),然后其他32位客户端进程使用此共享内存相互通信

我计划将主机应用程序移植到64位平台,一旦准备就绪,我希望32位和64位客户端进程都能够使用主64位主机应用程序的共享内存设置

为主机x32应用程序编写的原始代码几乎在所有地方都使用“size_t”,因为从x32移动到x64时,大小从4字节到8字节不等,所以我正在寻找替换它的方法

我打算将“size_t”替换为“unsigned long long”,以便其大小在32位和64位上相同

你能给我推荐更好的选择吗? 此外,“unsigned long long”的使用是否会对x32应用程序的性能产生影响。。我想是吧


已完成的研究- 发现非常有用的文章- a) 20从32位到64位的移植问题(www.viva64.com)
b) 无法使用编译器标志或任何钩子/钩将x64平台上的“size_t”限制/更改为4字节,因为它是typedef

使用64位变量通常会降低32位应用程序的速度

但是:由于通常不可能在所有进程中将共享内存定位在同一虚拟地址,因此您可能使用的是相对于共享内存块开头的地址;此外,由于您的应用程序将支持32位进程,共享内存块的大小可能会小于4GB。那么为什么不使用无符号整数呢


无论您选择哪种类型,使用typedef给它一个有意义的名称(例如,shared_memory_address)是明智的,并一致地使用该名称。这样,如果需要,您可以稍后更改基础类型。

这没有任何意义。32位进程仅限于将不超过4G的字节映射到其地址空间。适合大小,没有问题。@HansPassant:如果我理解正确,他希望在32位和64位版本中使用相同的代码,并且它们必须是二进制兼容的,因此他不能在两种平台上使用任何不相同的类型定义。