结构中的内存布局差异

Ili*_*eit 5 c++ memory struct

我在C++中有以下结构

struct A {
  int a;
  double b;
  float c;
}
Run Code Online (Sandbox Code Playgroud)

这个结构与添加了一个函数的结构之间的内存布局有区别吗?

struct B {
  int a;
  double b;
  float c;
  void foo();
}
B::foo() { //do stuff }
Run Code Online (Sandbox Code Playgroud)

Ben*_*ois 8

C++标准保证C结构和C++类(或结构 - 相同的东西)的内存布局是相同的,前提是C++类/结构符合POD标准("普通旧数据").那么POD是什么意思呢?

在以下情况下,类或结构是POD:

所有数据成员都是公共的,它们本身就是POD或基本类型(但不是引用或指向成员类型的指针),或者是这样的数组

  • 它没有用户定义的构造函数,赋值运算符或析构函数
  • 它没有虚拟功能
  • 它没有基类

所以在您的情况下,内存布局是相同的.

来源:内存中C++对象的结构与结构

  • 这个概念被命名为StandardLayoutType,参见[`std::is_standard_layout`](http://en.cppreference.com/w/cpp/types/is_standard_layout) (2认同)

YSC*_*YSC 6

这个结构与添加了一个函数的结构之间的内存布局有区别吗?

它可能.

由于AB是标准布局1,并且它们的公共初始序列由每个非静态数据成员2组成,因此它们是布局兼容的.

标准只描述一个抽象机的语义,所以没有保证类型的对象A将在内存中表示为类型的对象B,但布局兼容的类型往往是.


1) [class]/7

标准布局类是一个类:

  • 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
  • 没有虚函数(10.3),也没有虚基类(10.1),
  • 对所有非静态数据成员具有相同的访问控制(第11条),
  • 没有非标准布局基类,在大多数派生类中没有非静态数据成员,最多只有一个具有非静态数据成员的基类,或者没有带有非静态数据成员的基类,并且
  • 没有与第一个非静态数据成员相同类型的基类.

2) [class.mem]/21&[class.mem]/22

如果两个标准布局结构(第9类)类型具有相同数量的非静态数据成员并且相应的非静态数据成员(按声明顺序)具有布局兼容类型(3.9),则它们是布局兼容的.