C 指针的大小取决于什么?是数据总线的宽度,地址总线的宽度,还是CPU的字长?
我相信它应该取决于地址总线的宽度,因为指针必须寻址那么多位置。我对吗?
(我正在寻找依赖的原因,如果有的话)
C 指针的大小取决于什么?是数据总线的宽度,地址总线的宽度,还是CPU的字长?
我相信它应该取决于地址总线的宽度,因为指针必须寻址那么多位置。我对吗?
(我正在寻找依赖的原因,如果有的话)
指针的大小取决于您的编译器实现。在实践中,它几乎总是您正在构建的架构的原生字长。
值得注意的是,C 语言标准允许指向不同类型的指针可能具有不同的大小,以便更好地支持具有不同大小的程序和数据存储器等的哈佛架构。
这取决于所讨论的 CPU 架构。intptr_t
您可以使用(仅限 C99)编写考虑到这一点的可移植代码。
有点循环定义,但它取决于实现用来识别对象所在位置的地址空间的大小。这又可能取决于硬件、操作系统或 C 实现者的突发奇想。
因此,如果实现希望有 65535 个潜在位置来存储 a char
,那么它将(至少)使用 16 位指针char*
。对于 40 亿左右(或者可能是一半,某些实现不使用或不能使用指针的最高位),32 位。远远超过你的 RAM,64 位。
在实践中,该决定通常受实现期望程序在其上运行的操作系统的约束。如果操作系统的内存分配函数返回一个 64 位地址,那么实现使用较小的指针大小是相当不方便的,尽管在特定情况下可能会有一些技巧。
如果实现要在没有操作系统的情况下运行,那么它将使用适合其运行的硬件的内存映射大小的大小。如果它与操作系统一起运行,那么操作系统可能但不一定使用适合硬件的大小。我说不一定,因为现代 64 位操作系统有支持 32 位进程的习惯,因此在 64 位机器上运行的为 32 位环境编译的程序将使用 32 位指针。适用于硬件的指针大小可能与同一硬件上的字大小相同,也可能不同——通常是这样。
最后,由于某些类型大于 1 字节,原则上可以通过将较小的指针用于较大的类型来获得一些好处,并且标准允许这样做。想象一台具有 8 位字节、16 位整数和 128k 可寻址内存的机器,其int
对象具有 2 字节对齐。那么 achar*
至少需要 17 位(这将占用 3 个字节的存储空间),而原则上 anint*
只需 16 位(2 个字节的存储空间),因为任何 int 的地址的最低有效位总是0,因此不需要严格存储。如果实现可以安排始终正确使用地址,则允许将sizeof(int*) < sizeof(char*)
. 实际上,几乎没有人这样做过。
指针的大小取决于程序编译的 CPU 架构。
所有指针在内存中占用相同数量的空间,而指针在内存中的大小取决于编译代码的 CPU 架构。