【发布时间】:2018-10-15 13:57:44
【问题描述】:
最近,我一直在阅读“c++ 对象模型内部”。它说基类中使用的填充也应该复制到派生类中,以防您要将基类分配给派生类。因此,我在 64 位计算机下运行测试:
class A {
public:
int valA;
char a;
};
class B : public A {
public:
char b;
};
class C : public B {
public:
char c;
};
int main(){
std::cout << sizeof(A) << " " << sizeof(B) << " " << sizeof(C)
<< std::endl;
C c;
printf("%p\n%p\n%p\n",&c,&c.b,&c.c);
}
结果如下:
8 12 12
0x7ffd22c5072c
0x7ffd22c50734
0x7ffd22c50735
那么为什么 C 的大小与 B 的大小相同?虽然看起来 B 使用了 A 中的 3 字节填充。
【问题讨论】:
-
显然,单个 char 类没有被填充(没有必要)。如果您在
C中的c字段是int,那么无疑会正确对齐。 -
将
c更改为int并再次运行您的程序。您的怀疑可能对您的工具链是正确的。 -
标准对此不做任何保证。在某些情况下,该类可能会得到
memcpyed,或者它可能会被成员复制。由于优化,复制可能不会发生,并使其看起来像复制了填充。很多事情都可能发生。
标签: c++