我在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)
C++标准保证C结构和C++类(或结构 - 相同的东西)的内存布局是相同的,前提是C++类/结构符合POD标准("普通旧数据").那么POD是什么意思呢?
在以下情况下,类或结构是POD:
所有数据成员都是公共的,它们本身就是POD或基本类型(但不是引用或指向成员类型的指针),或者是这样的数组
所以在您的情况下,内存布局是相同的.
这个结构与添加了一个函数的结构之间的内存布局有区别吗?
由于A和B是标准布局1,并且它们的公共初始序列由每个非静态数据成员2组成,因此它们是布局兼容的.
标准只描述一个抽象机的语义,所以没有保证类型的对象A将在内存中表示为类型的对象B,但布局兼容的类型往往是.
1) [class]/7
标准布局类是一个类:
- 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
- 没有虚函数(10.3),也没有虚基类(10.1),
- 对所有非静态数据成员具有相同的访问控制(第11条),
- 没有非标准布局基类,在大多数派生类中没有非静态数据成员,最多只有一个具有非静态数据成员的基类,或者没有带有非静态数据成员的基类,并且
- 没有与第一个非静态数据成员相同类型的基类.
2) [class.mem]/21&[class.mem]/22
如果两个标准布局结构(第9类)类型具有相同数量的非静态数据成员并且相应的非静态数据成员(按声明顺序)具有布局兼容类型(3.9),则它们是布局兼容的.