C ++类内存模型和对齐

时间:2011-07-30 04:56:10

标签: c++ arrays memory position alignment

我有几个问题要问与C ++中的数据位置和对齐有关。类是否具有与结构相同的内存位置和内存对齐格式?

更具体地说,是否根据数据的声明顺序将数据加载到内存中?功能会影响内存对齐和数据位置还是分配到其他位置?一般来说,我保留所有内存对齐和位置相关的东西,如文件头和算法数据在结构中。我只是想知道这是否是类所固有的,因为它是结构,如果我选择使用这种方法,它是否会很好地转化为类。

编辑:感谢您的所有答案。他们真的帮了很多忙。

4 个答案:

答案 0 :(得分:5)

  

类是否具有相同的内存放置和内存对齐格式   作为结构?

对象的内存放置/对齐不取决于其类型是声明为class还是struct。 C ++中classstruct之间的唯一区别是,默认情况下,类具有private个成员,而默认情况下,结构具有public个成员。

  

更具体地说,是根据订单加载到内存中的数据   它被宣布了吗?

我不确定“加载到内存中”是什么意思。但是,在对象内,不允许编译器重新排列变量。例如:

class Foo {
    int a;
    int b;
    int c;
};

变量c必须位于b之后,而b必须位于a Foo对象之后。当创建Foo时,它们也按照类声明中显示的顺序构造(初始化),并且当Foo被销毁时以相反的顺序进行破坏。

由于继承和访问修饰符,它实际上比这更复杂,但这是基本的想法。

  

功能会影响内存对齐和数据位置吗?   分配到另一个地方?

函数不是数据,因此对齐不是它们的关注点。在一些可执行文件格式和/或体系结构中,函数二进制代码实际上确实占据了与数据变量不同的区域,但C ++语言与该事实无关。

  

一般来说,我保持所有内存对齐和位置   依赖的东西,如文件头和算法数据   结构。我只是想知道这是否是内在的   类的结构以及它是否能很好地转换   如果我选择使用这种方法,请加入课程。

内存对齐是编译器几乎自动为您完成的事情。它更像是一个实现细节而不是其他任何东西。我说“几乎是自动的”,因为有些情况可能很重要(序列化,ABI等),但在应用程序中它不应该是一个问题。

关于阅读文件(因为你提到文件头),听起来你正在将文件直接读到struct占用的内存中。我不能推荐这种方法,因为填充和对齐问题可能会使您的代码在一个平台而不是另一个平台上运行。相反,您应该从文件中一次读取几个原始字节,并通过简单的赋值将它们分配到struct中。

答案 1 :(得分:1)

  

类是否具有与结构相同的内存位置和内存对齐格式?

是。从技术上讲,类和结构之间没有区别。唯一的区别是默认的成员访问规范,否则它们是相同的。

  

更具体地说,是否根据数据的声明顺序将数据加载到内存中?

  

功能会影响内存对齐和数据位置,还是分配到其他位置?

没有。它们不会影响对齐。方法分开编译。该对象不包含对方法的任何引用(对于那些表示虚拟表确实影响成员的人,答案是肯定的,但是没有,但这是一个不影响成员之间相对差异的实现细节。允许编译器添加特定于实现的数据对象)。

  

一般来说,我将所有内存对齐和位置相关的内容保存在结构中,如文件头和算法数据。

行。不确定这会对任何事情产生影响。

  

我只是想知道这是否是类所固有的,因为它是结构

Class / Structs同名的不同名称。

  

如果我选择使用这种方法,它是否会很好地转化为课程。

选择什么方法?

答案 2 :(得分:0)

C ++类只需将所有实例变量转换为包含在结构中的数据的结构,而所有函数都与类分离,并被视为函数,接受这些结构作为参数。

存储实例变量的确切方式取决于所使用的编译器,但它们通常倾向于按顺序排列。

答案 3 :(得分:0)

C ++类不像二进制模式结构那样参与“持久性”,并且不应该将对齐附加到它们。保持课程简单。 与类对齐可能会带来负面的性能优势,也可能产生副作用。