对象/结构的C ++内存布局是什么?

时间:2012-10-14 17:57:47

标签: c++ compiler-construction

在C ++中,我认为C ++标准与内存布局方面的数据成员在类中的排列方式无关?我是否正确地认为这取决于有问题的编译器?

我非常有兴趣了解对象和其他C ++实体(结构等)如何在物理内存中表示(我知道列表是节点到节点,数组是连续内存 - 但语言的所有其他方面)

编辑:学习x86汇编程序会对此有所帮助并更好地理解C ++吗?

3 个答案:

答案 0 :(得分:6)

C ++标准确实指明了一些事情,但远非一切。

主要规则如下:

  • 数组中的对象是连续布局的,它们之间没有填充。
  • 由访问说明符public: / private: / protected:分隔的
  • 类成员对象按照它们的顺序在内存中排列重新声明,但成员对象之间可能存在未指定数量的填充。
  • 对于某些类型(标准布局结构,在标准术语中),第一个基类,或者如果不存在,则第一个成员布置在与类本身相同的地址。

标准规定了更多的部分,但总的来说,剩下的细节实际上归功于编译器。

答案 1 :(得分:2)

是的,该标准没有说明如何在内存中表示对象。要了解如何表示规范的C ++对象,请阅读本书:inside C++ object model.

答案 2 :(得分:1)

检查这些链接以了解C ++类的布局(“PCASM”一书中有关于它们如何表示的完整章节)

http://forums.codeguru.com/archive/index.php/t-428671.html http://www.drpaulcarter.com/pcasm/pcasm-book-pdf.zip