提问人:Luchian Grigore 提问时间:4/5/2013 最后编辑:CommunityLuchian Grigore 更新时间:4/5/2013 访问量:1589
指针可以有不同的大小吗?[复制]
Can pointers be of different sizes? [duplicate]
答:
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 设计时更罕见)。
评论
2赞
xtofl
4/5/2013
#4
我可以想象在一台机器上,假设数组的内存需求将远远小于数组的内存需求是有意义的。int
char
例如,可以指定一个实现不会使用超过 10 个动态分配的整数,但可以自由地分配许多数组。在这种情况下,一个字节可能就足够了,而 a 需要是四个字节或更多。char
int*
char*
这是一个理论上的愿景。
评论
0赞
Prof. Falken
4/5/2013
超过 256 个动态分配的整数,即使一个字节就足够了。
0赞
xtofl
4/5/2013
我想提一下 4 位指针,但我认为这太过分了:)
5赞
Lightness Races in Orbit
4/5/2013
#5
language-lawyer 标签意味着您询问的是 C++ 及其兼容实现,而不是某些特定的物理机器。
为了证明这一点,我必须引用整个标准,但一个简单的事实是,它不保证任何结果,并且(作为推论)不保证任何和的结果。sizeof(T*)
T
sizeof(T1*) == sizeof(T2*)
T1
T2
评论
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++ 似乎没有该规则。
评论
char*
int*
uintptr_t
所有指针类型的大小都是固定的!?