26.空类字节数及对应生成的成员函数-灵析社区

菜鸟码转

1.空类声明时编译器不会生成任何成员函数:

对于空类,声明编译器不会生成任何的成员函数,只会生成 1 个字节的占位符。由于在实际程序中,空类同样可以被实例化,而每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址,所以 sizeof(A) 的大小为 1。

C++

#include <iostream>
using namespace std;

class A
{
};

int main()
{
    A a;
    cout << "sizeof(A):" << sizeof(a) << endl; // sizeof(A):1
    return 0;
}

2.空类定义时编译器会生成 6 个成员函数:

当空类 A 定义对象时,sizeof(A) 仍是为 1,但编译器会在需要时生成 6 个成员函数:缺省的构造函数、拷贝构造函数、析构函数、赋值运算符、两个取址运算符。

C++

#include <iostream>
using namespace std;
/*
class A
{}; 该空类的等价写法如下:
*/
class A
{
public:
    A(){};                                       // 缺省构造函数
    A(const A &tmp){};                           // 拷贝构造函数
    ~A(){};                                      // 析构函数
    A &operator=(const A &tmp){};                // 赋值运算符
    A *operator&() { return this; };             // 取址运算符
    const A *operator&() const { return this; }; // 取址运算符(const 版本)
};

int main()
{
    A *p = new A(); 
    cout << "sizeof(A):" << sizeof(A) << endl; // sizeof(A):1
    delete p;       
    return 0;
}


阅读量:646

点赞量:0

收藏量:0