C++类内存模型和对齐

4 c++ memory arrays position alignment

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

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

编辑:谢谢你的所有答案.他们真的帮了很多忙.

In *_*ico 5

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

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

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

我不确定你的意思是"加载到内存中".但是,在对象内,不允许编译器重新排列变量.例如:

class Foo {
    int a;
    int b;
    int c;
};
Run Code Online (Sandbox Code Playgroud)

变量c必须位于后bb后必须位于a一个内Foo对象.它们也是在Foo创建a时按照类声明中显示的顺序构造(初始化),并在a Foo被销毁时以相反的顺序进行破坏.

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

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

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

一般来说,我保留所有内存对齐和位置相关的东西,如文件头和算法数据在结构中.我只是想知道这是否是类所固有的,因为它是结构,如果我选择使用这种方法,它是否会很好地转化为类.

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

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