1

我想在 gcc 中定义一个不依赖于平台的大指针(64 位或 128 位)。我认为 MSDN 中有类似 __ptr128 或 __ptr64 的东西。

sizeof(__ptr128) is 16 bytes.
sizeof(__ptr64 ) is 8  bytes.

可能吗?

当您在需要 8 字节指针参数的 64 位操作系统中使用内核函数并且您有一个使用 32 位地址的 32 位应用程序并且您想要使用此内核函数时,它会很有用。

4

4 回答 4

7

你的问题没有意义。根据定义,指针是指向某物的内存地址——大小必须取决于平台。您将如何在支持 64 位寻址的硬件平台上取消引用 128 位指针?!

您可以创建 64 位或 128 位,但指针与底层硬件的内存寻址方案直接相关。

编辑

通过您的附加声明,我想我明白您要做什么。不幸的是,我怀疑这是可能的。如果您要使用的内核函数采用 64 位指针参数,那么它很可能是 64 位函数(除非您正在开发一些不寻常的硬件)。

尽管技术上可以将 64 位指令混合到 32 位可执行文件中,但实际上没有编译器允许您这样做。64 位 API 调用将使用 64 位代码、64 位寄存器和 64 位堆栈——编译器和操作系统管理从 32 位环境到 64 位环境的任意切换将非常尴尬环境。

您应该着眼于为 32 位环境寻找等效的 API。也许您可以发布您想要使用的内核函数原型(名称+参数),有人可以帮助您找到更好的解决方案。

就这样没有混淆,__ptr64在 MSDN 中不是平台独立的:

在 32 位系统上,使用 __ptr64 声明的指针被截断为 32 位指针。

于 2012-02-13T14:51:59.833 回答
0

无法发表评论,但不能在“32 位可执行文件”中使用 64 位指令的说法具有误导性,因为“32 位可执行文件”的定义需要解释。如果您的意思是使用 32 位指针的可执行文件,那么根本没有任何内容可以说明您在使用 32 位指针时不能使用操作 64 位值的指令。处理器不知道区别。

Linux 甚至支持可以拥有 32 位用户空间和 64 位内核空间的模式。因此,每个应用程序都可以访问 4GB 的 RAM,但系统可以访问更多。这将指针的大小保持在 4 个字节,但不限制使用 64 位数据操作。

于 2015-07-10T06:08:55.543 回答
0

我迟到了,但这个问题在嵌入式平台上很有意义。

如果在同一个 SOC 中将 CPU 与一些额外的加速器结合起来,它们不一定需要具有相同的地址空间或地址空间大小

对于加速器中的固件,您需要从 CPU 和加速器的角度覆盖其地址空间的指针。它们的大小不一定相同。

例如,对于 64 位 CPU 和 32 位加速器,固件指针可以覆盖 32 位长地址空间,而 CPU 指针可以覆盖 64 位地址空间。C 没有两个或多个 void * 类型,具体取决于您要与之交谈的地址空间。

人们通常通过将 void * 转换为 uintN_t 来解决这个问题,其中 N 尽可能大,并在系统的不同部分之间传递。

于 2018-03-15T08:57:37.980 回答
-1

没有,因为 gcc 不是为嵌入式架构设计的。有些架构存在多个大小的指针,例如 m16c:ram 具有 16 位地址,而 rom(flash) 在同一地址空间中具有 20 位地址。对于较小的指针,性能和大小的使用更好。

于 2018-06-07T07:51:14.317 回答