指针的大小可以不是

我知道有些硬件平台需要更多的信息来指向一个char不是你需要指向一个int (该平台具有不可寻址的字节,所以指向char的指针需要存储指向一个字的指针,也是一个索引单词中的一个字节)。 所以在这样的平台上有可能sizeof(int*) < sizeof(char*)

指向非联合类的指针可能会发生类似情况吗? C ++允许虚函数上的协变返回类型。 假设我们有这样的课程:

struct Gadget
{
  // some content
};


struct Widget
{
  virtual Gadget* getGadget();
};

任何调用getGadget()代码都必须在接收到Gadget*时工作,但是当它接收到一个从Gadget派生的类型的指针时也必须运行相同的代码(实际上是相同的编译后的二进制代码)在一个完全不同的库)。 我可以合理地看到这种情况发生的唯一方式是所有非联合类类型TU 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++