【发布时间】:2010-10-29 07:11:08
【问题描述】:
C 标准允许指向不同类型的指针具有不同的大小,例如sizeof(char*) != sizeof(int*) 是允许的。但是,它确实要求如果指针转换为void*,然后再转换回其原始类型,则它必须与原始值进行比较。因此,从逻辑上讲,sizeof(void*) >= sizeof(T*) 适用于所有类型T,对吗?
在当今使用的大多数常见平台(x86、PPC、ARM 和 64 位变体等)上,所有指针的大小都等于本机寄存器大小(4 或 8 字节),而与指向的对象无关类型。是否有任何深奥或嵌入式平台,其中指向不同类型的指针可能具有不同的大小?我特意询问的是 data 指针,尽管我也想知道是否有平台的 function 指针具有不寻常的大小。
我绝对不询问 C++ 的指向成员指针和指向成员函数的指针。它们在常见平台上具有不同寻常的大小,甚至可以在一个平台内变化,具体取决于指向类的属性(非多态、单继承、多继承、虚拟继承或不完整类型)。
【问题讨论】:
-
很好奇,标准的哪个部分允许不同的指针大小?你介意发布那个部分吗
-
Nit-pick:C 中的“本机整数类型”必须是 int,即使在 64 位平台上也很少是 64 位,AFAIK。换句话说,LP64 比 ILP64 更常见。
-
@JaredPar:我不确定它在标准中的什么地方,但是这个页面lysator.liu.se/c/rat/d9.html#4-9-6-1 提到了它,关于 %p fprintf 格式说明符。 @unwind: s/本机整数大小/本机寄存器大小/
-
我想知道是否有 N 满足以下条件:sizeof(anypointer)
-
小观察:所有
struct X *指针的大小都是一样的。原因是您可以转发声明一个结构,例如struct X;,然后将指向它的指针放在另一个结构中,struct Y { struct X *x; };,编译器仍然可以知道struct Y需要多少空间,而不知道struct X。