0%

一个C++类继承下的对齐问题

有同学分享了一道面试题,解释下面代码的结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>

class A {
int a;
char c;
};

class AA : A {
char cc;
};

class B {
public:
int a;
char c;
};

class BB : B {
char cc;
};

int main(void)
{
std::cout << sizeof(A) << std::endl; // 8
std::cout << sizeof(AA) << std::endl; // 8
std::cout << sizeof(B) << std::endl; // 8
std::cout << sizeof(BB) << std::endl; // 12
}

第一眼看好像确实有点奇怪,public 还会改变类的对齐方式吗?在知乎上搜到了一个类似的问题,其中一个回答解释了基类是 POD(Plain Old Data)会使子类中的相应位置的 tail padding 不生效。但在我的记忆中,上面的 AB 似乎都是 POD。查了 cppreference也没发现问题。于是又进入了垃圾时间。检查了很多其他的类的特性都没发现 AB 有区别。

最后发现 GCC 用的 abi 规范使用的 2003 版的 ISO C++ 标准,而这个版本里确实只有全非静态成员变量都是 public 的 B 是 POD,而 A 不是。