指针的大小可以不是
我知道有些硬件平台需要更多的信息来指向一个char
不是你需要指向一个int
(该平台具有不可寻址的字节,所以指向char
的指针需要存储指向一个字的指针,也是一个索引单词中的一个字节)。 所以在这样的平台上有可能sizeof(int*) < sizeof(char*)
。
指向非联合类的指针可能会发生类似情况吗? C ++允许虚函数上的协变返回类型。 假设我们有这样的课程:
struct Gadget
{
// some content
};
struct Widget
{
virtual Gadget* getGadget();
};
任何调用getGadget()
代码都必须在接收到Gadget*
时工作,但是当它接收到一个从Gadget
派生的类型的指针时也必须运行相同的代码(实际上是相同的编译后的二进制代码)在一个完全不同的库)。 我可以合理地看到这种情况发生的唯一方式是所有非联合类类型T
和U
sizeof(T*) == sizeof(U*)
。
所以我的问题是,给定一个特定的实际编译器(不包括假设的Hell ++)在一个特定的平台上,期望所有指向非联合类类型的指针将具有相同的大小是否合理? 还是有一个实际的原因,为什么编译器可能希望使用不同的大小,同时保持符合协变返回类型?
在存在不同“指针级别”的平台上(例如__near
和__far
),假定应用于两者的相同属性。
C很难要求所有结构类型的指针具有相同的表示和对齐方式。
6.2.5类型
27 [...]结构类型的所有指针应该具有相同的表示和对齐要求。 [...]
由于标准对extern "C"
的要求,C ++有效地需要与C实现的二进制兼容性,所以间接地,这需要所有指向C(POD类型,非常多)的结构类型的结构类型以具有相同的表示和对齐在C ++中也是如此。
对于非POD类型似乎没有这样的要求,所以在这种情况下允许实现使用不同的指针大小。 你建议这样做不行,但要按照你的例子,
struct G { };
struct H : G { };
struct W
{
virtual G* f() { ... }
};
struct X : W
{
virtual H* f() { ... }
};
可以翻译成(伪代码)
struct W
{
virtual G* f() { ... }
};
struct X : W
{
override G* f() { ... }
inline H* __X_f() { return static_cast<H *>(f()); }
};
这仍然符合语言的要求。
为什么指向结构类型的两个指针可能不完全相同的一个合理原因是,C ++编译器将移植到具有设计不良ABI的现有C编译器的平台上。 G
是POD类型,因此G *
需要与C中的完全相同H
不是POD类型,因此H *
不需要匹配任何C类型。
为了进行对齐,实际上可能发生:真正发生的事情是,典型的GNU / Linux系统上的x86-32 ABI需要64位整数类型为32位对齐,即使处理器的首选对齐实际上是64位。 现在又来了另一个实现者,他们决定他们确实想要64位对齐,但如果他们想要与现有实现保持兼容,他们就会陷入困境。
对于规模,我想不出一个合理的情况发生,但我不确定这可能是我缺乏想象力。
据我所知,C和C ++假定内存是线性字节可寻址的。 但某些平台(早期的ARM)坚持使用字对齐的加载和存储。 在这种情况下,编译器有责任将指针四舍五入到字边界,然后在提取字符时执行必要的位移操作。
但是,因为这只是在加载和存储上完成的,所有指针仍然看起来都一样。
链接地址: http://www.djcxy.com/p/81215.html上一篇: Can size of pointers to non
下一篇: c++