空类与类对象的大小
空类
1) C++空类的大小不为0,不同编译器设置不一样,vs设置为1;
2) C++标准指出,不允许一个对象(当然包括类对象)的大小为 0,不同的对象不能具有相同的地址;
3) 带有虚函数的C++类大小不为1,因为每一个对象会有一个vptr指向虚函数表,具体大小根据指针大小确定;
4) C++中要求对于类的每个实例都必须有独一无二的地址,那么编译器自动为空类分配一个字节大小,这样便保证了每个实例均有独一无二的内存地址。
自动附加:
class Empty { public: Empty(); // 缺省构造函数 Empty(const Empty& rhs); // 拷贝构造函数 ~Empty(); // 析构函数 Empty& operator=(const Empty& rhs); // 赋值运算符 Empty* operator&(); // 取址运算符 const Empty* operator&() const; //取址运算符 const };
只有当实际使用这些函数的时候,编译器才会去定义它们。
C++编译器对这些函数的实现
inline Empty::Empty() //缺省构造函数 { } inline Empty::~Empty() //析构函数 { } inline Empty *Empty::operator&() //取址运算符(非const) { return this; } inline const Empty *Empty::operator&() const //取址运算符(const) { return this; } inline Empty::Empty(const Empty &rhs) //拷贝构造函数 { //对类的非静态数据成员进行以"成员为单位"逐一拷贝构造 //固定类型的对象拷贝构造是从源对象到目标对象的"逐位"拷贝 } inline Empty& Empty::operator=(const Empty &rhs) //赋值运算符 { //对类的非静态数据成员进行以"成员为单位"逐一赋值 //固定类型的对象赋值是从源对象到目标对象的"逐位"赋值。 }
参考C++中空类详解_ox0080的博客-CSDN博客_c++ 空类
类对象的大小
1) 类的非静态成员变量大小,静态成员不占据类的空间,成员函数也不占据类的空间大小;
2) 内存对齐另外分配的空间大小,类内的数据也是需要进行内存对齐操作的;
3) 虚函数的话,会在类对象插入vptr指针,加上指针大小;
4) 当该类是某类的派生类,那么派生类继承的基类部分的数据成员也会存在在派生类中的空间中,也会对派生类进行扩展。