gcc中的大小指针

时间:2012-02-13 14:36:25

标签: linux pointers gcc 32bit-64bit gcc4

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

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

有可能吗?

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

4 个答案:

答案 0 :(得分:7)

你的问题毫无意义。根据定义,指针是一个内存地址 - 大小必须取决于平台。如何在支持64位寻址的硬件平台上取消引用128位指针?!

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

修改

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

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

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

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

  

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

答案 1 :(得分:0)

无法发表评论,但由于“32位可执行文件”的定义需要解释,因此您无法在“32位可执行文件”中使用64位指令的说法具有误导性。如果你的意思是一个使用32位指针的可执行文件,那么就没有任何东西可以说你在使用32位指针时不能使用操作64位值的指令。处理器不知道差异。

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

答案 2 :(得分:0)

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

如果您将CPU与一些其他加速器合并在同一个SOC中,则他们不一定需要具有相同的地址空间或地址空间 size

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

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

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

答案 3 :(得分:-1)

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