指针可以有不同的大小吗?

16

这个答案提出了一个有趣的观点:“在int*char*小的机器上”。(不考虑指向函数的指针)

指向不同类型的指针可能具有不同的大小吗?这有什么用处?


3
这个可能会有用:https://dev59.com/72ct5IYBdhLWcg3wjuAj这是一个指针大小的问题,函数指针和其他类型的指针在内存中所占的大小是不同的。这个问题在 C 和 C++ 中都存在,并且很多程序员可能会对此感到困惑。以上链接提供了一些关于这个问题的讨论和解释。 - Kiril Kirov
2
@KirilKirov 那很有趣(我想我立刻从我的思路中排除了函数指针)。好信息! - Luchian Grigore
1
@KirilKirov 我太懒了,没有检查你的链接,但看起来我的回答是多余的 -.- - user529758
如果我没记错的话,有些非常特殊的平台中char*int*有不同的大小。已经有一段时间了,自从我读到这个问题以来,但是如果我没记错的话,这种情况非常罕见,更多地是与一些嵌入式系统相关。 - Kiril Kirov
所有答案都提到了大小不能保证。但是uintptr_t 对于所有指针类型来说都是固定大小的! - masoud
就像我在其他地方所说的那样,uintptr_t被保证足够大以容纳所有指针类型,类似于void * - Mats Petersson
5个回答

14

是的,这完全有可能。在一些机器上,指向字节的指针包含两个值:一个指向包含该字节的内存单元的字地址的指针,和一个“字节索引”,该索引给出字节在单词内的位置。例如,在32位机器上,“字节索引”为0..3。

这将需要比“int *”更多的存储空间,因为“int *”只是指向相关单词的指针。


请问可以告诉我这些机器的名称吗,Mats? - Martin Vidner
9
@MartinVidner:我刚在脑海中为你发明了一个。 - Lightness Races in Orbit
您是想要支持吗? - Prof. Falken
3
8086分段内存模型。近指针为16位,远指针为20/32位。 - Martin James
我相信在遥远的过去可能有其他(IBM?)机器采用了这种架构,但我不确定。 - Mats Petersson
显示剩余5条评论

6
在字地址机器上,char*可能需要包含部分字信息,使其比int*更大。标准允许这样做,不是为了排除在这种硬件上的实现(即使在设计C89时这种情况更加罕见)。

你能否提供其他char*int*大小不同的情况?请在此处链接您的答案:https://dev59.com/3V4b5IYBdhLWcg3wfx1J#29035972 - Shafik Yaghmour

5

标签意味着您正在询问关于C++及其符合实现的问题,而不是特定的物理机器。

为了证明这一点,我必须引用整个标准,但简单的事实是它不保证对于任何T,sizeof(T*) 的结果,并且(作为推论),没有保证对于任何 T1T2sizeof(T1*) == sizeof(T2*)


我认为,在没有其他东西的情况下,只有 char 和 unsigned char 的大小是可以保证的。 - Luchian Grigore
@LuchianGrigore:当然,只要提到某些类型上确实存在其他限制。 - Lightness Races in Orbit
1
类型为 cv void* 的对象应具有与 cv char* 相同的表示和对齐要求。 - PlasmaHH
@PlasmaHH 不错的发现 :) - Lightness Races in Orbit
另一个保证是,“指向具有cv限定和非cv限定版本的布局兼容类型的指针应具有相同的值表示和对齐要求”。在C中,所有指向结构体类型的指针必须具有相同的表示和对齐要求,但在C++中似乎没有这个规则。 - M.M

4

是的,指针的大小不能保证相同,虽然在大多数现代架构中,它们在实践中是相同的。

其中一个有用的点是涉及到数据和函数指针的区别。历史上,函数指针(用于基本上跳转到可执行代码中的某些部分)需要所谓的“far 指针”,这比数据指针宽。


2

我可以想象一种机器,假设 int 数组的内存需求远小于 char 数组的内存需求。

例如,有人可能会规定一个实现不会使用超过 10 个动态分配的整数,但是可以自由地分配许多 char 数组。在这种情况下,一个字节就足够了用来表示一个 int*,而一个 char* 则需要四个或更多字节。

这只是一个理论上的想法。


超过256个动态分配的整数,即使一个字节就足够了。 - Prof. Falken
我想提一下4位指针,但我觉得那有点过头了 :) - xtofl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接