我想在 gcc 中定义一个不依赖于平台的大指针(64 位或 128 位)。我认为 MSDN 中有类似 __ptr128 或 __ptr64 的东西。
sizeof(__ptr128) is 16 bytes.
sizeof(__ptr64 ) is 8 bytes.
可能吗?
当您在需要 8 字节指针参数的 64 位操作系统中使用内核函数并且您有一个使用 32 位地址的 32 位应用程序并且您想要使用此内核函数时,它会很有用。
我想在 gcc 中定义一个不依赖于平台的大指针(64 位或 128 位)。我认为 MSDN 中有类似 __ptr128 或 __ptr64 的东西。
sizeof(__ptr128) is 16 bytes.
sizeof(__ptr64 ) is 8 bytes.
可能吗?
当您在需要 8 字节指针参数的 64 位操作系统中使用内核函数并且您有一个使用 32 位地址的 32 位应用程序并且您想要使用此内核函数时,它会很有用。
你的问题没有意义。根据定义,指针是指向某物的内存地址——大小必须取决于平台。您将如何在支持 64 位寻址的硬件平台上取消引用 128 位指针?!
您可以创建 64 位或 128 位值,但指针与底层硬件的内存寻址方案直接相关。
编辑
通过您的附加声明,我想我明白您要做什么。不幸的是,我怀疑这是可能的。如果您要使用的内核函数采用 64 位指针参数,那么它很可能是 64 位函数(除非您正在开发一些不寻常的硬件)。
尽管技术上可以将 64 位指令混合到 32 位可执行文件中,但实际上没有编译器允许您这样做。64 位 API 调用将使用 64 位代码、64 位寄存器和 64 位堆栈——编译器和操作系统管理从 32 位环境到 64 位环境的任意切换将非常尴尬环境。
您应该着眼于为 32 位环境寻找等效的 API。也许您可以发布您想要使用的内核函数原型(名称+参数),有人可以帮助您找到更好的解决方案。
就这样没有混淆,__ptr64
在 MSDN 中不是平台独立的:
在 32 位系统上,使用 __ptr64 声明的指针被截断为 32 位指针。
无法发表评论,但不能在“32 位可执行文件”中使用 64 位指令的说法具有误导性,因为“32 位可执行文件”的定义需要解释。如果您的意思是使用 32 位指针的可执行文件,那么根本没有任何内容可以说明您在使用 32 位指针时不能使用操作 64 位值的指令。处理器不知道区别。
Linux 甚至支持可以拥有 32 位用户空间和 64 位内核空间的模式。因此,每个应用程序都可以访问 4GB 的 RAM,但系统可以访问更多。这将指针的大小保持在 4 个字节,但不限制使用 64 位数据操作。
我迟到了,但这个问题在嵌入式平台上很有意义。
如果在同一个 SOC 中将 CPU 与一些额外的加速器结合起来,它们不一定需要具有相同的地址空间或地址空间大小。
对于加速器中的固件,您需要从 CPU 和加速器的角度覆盖其地址空间的指针。它们的大小不一定相同。
例如,对于 64 位 CPU 和 32 位加速器,固件指针可以覆盖 32 位长地址空间,而 CPU 指针可以覆盖 64 位地址空间。C 没有两个或多个 void * 类型,具体取决于您要与之交谈的地址空间。
人们通常通过将 void * 转换为 uintN_t 来解决这个问题,其中 N 尽可能大,并在系统的不同部分之间传递。
没有,因为 gcc 不是为嵌入式架构设计的。有些架构存在多个大小的指针,例如 m16c:ram 具有 16 位地址,而 rom(flash) 在同一地址空间中具有 20 位地址。对于较小的指针,性能和大小的使用更好。