面试题答案
一键面试sizeof(Derived)
没有成员变量时:- 在C++中,空类也会有非零的
sizeof
值,通常为1字节。这是为了确保每个对象在内存中有唯一的地址。当Derived
类从空类Base
公有继承时,sizeof(Derived)
的值通常和sizeof(Base)
相同,即1字节。 - 不同编译器下内存对齐规则的影响:
- 大多数编译器会保证对象的地址是对齐的,一般按照特定的字节数(如4字节、8字节等)对齐。但对于空类及其派生类,由于没有实际成员,编译器为了满足对象唯一性,会至少分配1字节空间,所以在这种简单情况下,内存对齐规则通常不会改变
sizeof(Derived)
的值,仍然为1字节。
- 大多数编译器会保证对象的地址是对齐的,一般按照特定的字节数(如4字节、8字节等)对齐。但对于空类及其派生类,由于没有实际成员,编译器为了满足对象唯一性,会至少分配1字节空间,所以在这种简单情况下,内存对齐规则通常不会改变
- 在C++中,空类也会有非零的
Derived
中添加一个char
类型成员变量时:char
类型本身占用1字节。此时sizeof(Derived)
的值至少为1字节(char
成员的大小)加上Base
类的大小(通常为1字节),所以sizeof(Derived)
至少为2字节。- 内存对齐规则的影响:
- 假设对齐模数为1:在这种情况下,
sizeof(Derived)
为2字节,因为不需要额外的填充,char
成员紧挨着Base
类对象部分存储。 - 假设对齐模数为2:由于
char
成员本身占用1字节,为了满足2字节对齐,编译器会在char
成员后填充1字节,此时sizeof(Derived)
为4字节(2字节的Base
类部分 + 1字节的char
成员 + 1字节填充)。 - 假设对齐模数为4:同样为了满足4字节对齐,
sizeof(Derived)
也为4字节(2字节的Base
类部分 + 1字节的char
成员 + 1字节填充)。因为整体需要以4字节对齐,即使char
成员加上Base
类部分不足4字节,也会填充到4字节。
- 假设对齐模数为1:在这种情况下,