一个类的内存布局是连续的吗?

Posted

技术标签:

【中文标题】一个类的内存布局是连续的吗?【英文标题】:Is Memory Layout for a class successive? 【发布时间】:2011-06-18 01:33:41 【问题描述】:

当我们声明一个类的对象时它的内存布局是否连续(一个接一个)?如果它的连续而不是 padding 出现在其中(如结构填充) ?请帮助我了解类内存布局的概念

提前致谢。

【问题讨论】:

你能改写你的标题和问题吗?而不是使用短语“内存分配”,如果你是这样想的话,使用“内存布局” 【参考方案1】:

当我们声明一个类的对象是 它的内存分配连续(一个 在另一个之后)?

标准不提供任何此类保证。对象内存布局由实现定义。

通常,数据成员的内存地址按照它们在类中定义的顺序增加。但是在遇到访问说明符(privateprotectedpublic)的任何地方都可能会中断此顺序。 Lippman 在Inside the C++ Object Model 中对此进行了详细讨论。

摘自C/C++ Users Journal,

编译器不允许这样做 但是,重新排列本身。这 标准要求所有数据 在 same public:, protected:, 或 私人:必须在那个 由编译器排序。 如果你 使用访问权限散布您的数据 说明符,但是,编译器是 允许重新排列 访问说明符分隔的块 数据来改进布局这是 为什么有些人喜欢设置访问权限 每个数据前面的说明符 成员

很有趣,不是吗?

【讨论】:

我觉得这很难相信。如果这是真的,来自两个编译器的代码将如何互操作? @David:没有。实际上,在编译器之间实现互操作性的唯一方法是坚持使用普通的旧 C。 @Tomek:几乎是正确的——尽管由于特定平台上的大多数开发人员使用相同的编译器(或相同的编译器,不同的版本),它通常没有实际意义。大多数 Windows 开发人员使用 VC++,大多数 *NIX 开发人员使用 GCC 等。 @Tomek 对我来说似乎很蹩脚。很难理解标准委员会为什么要允许非连续内存布局的一般性。 @David:实际上,如果两者都遵循相同的 ABI,它可以互操作,例如,Itanium ABI。但是还有很多优化的可能性,在实践中,即使使用相同的编译器,仅仅不同的标志(如打包)就可以防止兼容性。

以上是关于一个类的内存布局是连续的吗?的主要内容,如果未能解决你的问题,请参考以下文章

继承类的内存布局

2D区域的内存布局

数组向量的内存布局是啥?

Java对象的内存布局

虚函数表与多态内存布局

一个Objective-C对象如何进行内存布局?(考虑有父类的情况)