指针可以有不同的大小吗?[复制]

Can pointers be of different sizes? [duplicate]

提问人:Luchian Grigore 提问时间:4/5/2013 最后编辑:CommunityLuchian Grigore 更新时间:4/5/2013 访问量:1589

问:

这个答案带有一个有趣的陈述——“在比 a 小的机器上”。(让我们排除指向函数的指针)int*char*

指向不同类型的指针是否有可能具有不同的大小?为什么这会有用?

C++ 指针 language-lawyer

评论

3赞 Kiril Kirov 4/5/2013
这可能很有用:stackoverflow.com/questions/12006854/...
2赞 Luchian Grigore 4/5/2013
@KirilKirov这很有趣(我想我立即从我的思路中排除了函数指针)。好信息!
1赞 4/5/2013
@KirilKirov我懒得不检查你的链接,但似乎毕竟我的答案是多余的-.-
0赞 Kiril Kirov 4/5/2013
如果我没记错的话,有非常具体的平台,其中和具有不同的大小。自从我读到这个以来已经有一段时间了,但如果我没记错的话 - 这是非常罕见的,并且与某些嵌入式系统更相关。char*int*
0赞 masoud 4/5/2013
所有提到的答案都不能保证大小。但是uintptr_t所有指针类型的大小都是固定的!?

答:

14赞 Mats Petersson 4/5/2013 #1

是的,这是完全可能的。在某些计算机上,指向字节的指针包含两个值:指向包含字节的内存字的 WORD 地址的指针,以及给出字节在字中位置的“字节索引”。例如,在 32 位机器上,“字节索引”为 0..3。

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

评论

0赞 Prof. Falken 4/5/2013
事实上。人们甚至可以想象某种奇怪的机器,其中不同的数据完全存储在不同的内存库中,每个数据都以自己的方式寻址。
0赞 Martin Vidner 4/5/2013
你能说出这样的机器吗,垫子?
9赞 Lightness Races in Orbit 4/5/2013
@MartinVidner:我只是在脑海中为你发明了一个。
0赞 Mats Petersson 4/5/2013
根据我的快速谷歌搜索,EV56 之前的 Alpha 处理器不支持“字节寻址”——每个内存读/写都必须是一个完整的机器字,并且字节通过某种移位操作“旋转”出它们的位置。
3赞 Martin James 4/5/2013
8086 分段内存模型。近指针 16 位,远指针 20/32 位。
4赞 user529758 4/5/2013 #2

是的,指针不能保证具有相同的大小,尽管在大多数现代体系结构上,它们实际上是一样的。

这非常有用的一点是,当涉及数据指针与函数指针时。从历史上看,函数指针(用于基本上跳转到可执行代码中的某些部分)需要比数据指针更宽的所谓“远指针”。

6赞 Bo Persson 4/5/2013 #3

在字寻址机器上,可能需要包含部分字信息,使其大于 .char*int*

该标准允许这样做,但不排除在此类硬件上的实现(尽管现在这种情况比 C89 设计时更罕见)。

评论

0赞 Shafik Yaghmour 3/13/2015
在这里链接您的答案,您是否知道其他大小不同的情况?char*int*
2赞 xtofl 4/5/2013 #4

我可以想象在一台机器上,假设数组的内存需求将远远小于数组的内存需求是有意义的。intchar

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

这是一个理论上的愿景。

评论

0赞 Prof. Falken 4/5/2013
超过 256 个动态分配的整数,即使一个字节就足够了。
0赞 xtofl 4/5/2013
我想提一下 4 位指针,但我认为这太过分了:)
5赞 Lightness Races in Orbit 4/5/2013 #5

标签意味着您询问的是 C++ 及其兼容实现,而不是某些特定的物理机器。

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

评论

0赞 Luchian Grigore 4/5/2013
我是。在没有其他东西的情况下,我想可以保证。only the size of char and unsigned char
0赞 Lightness Races in Orbit 4/5/2013
@LuchianGrigore:当然,只要你提到某些类型还有其他禁忌。
1赞 PlasmaHH 10/7/2013
“cv void* 类型的对象应具有与 cv char* 相同的表示和对齐要求”
0赞 Lightness Races in Orbit 10/7/2013
@PlasmaHH 好找:)
0赞 M.M 11/6/2015
另一个保证是“指向布局兼容类型的 cv 限定和 cv 非限定版本的指针应具有相同的值表示和对齐要求”。在 C 中,所有指向结构类型的指针都必须具有相同的 r&a,但 C++ 似乎没有该规则。