boost::noncopyable以及空基类在编程中的应用

今天开始学习<muduo C++ 网络库>>,下载了书中在Github中的源代码,就好奇的开始阅读源代码,在/muduo/net/Socket.h中看到一个继承体系,class Socket : boost::noncopyable;看到boost::noncopyable后,首先想到Effective C++中曾经提到过,于是翻开书第6条款:若不想使用编译器自动生成的函数,就该明确拒绝。其中的一个实现方法就是通过私有继承一个copy构造函数和copy assignment操作符声明为private的基类就可以办到。

另一个与此相关的继承体系为

class InetAddress : public muduo::copyable{

...

private:
     struct sockaddr_in addr_;

}

InetAddress拥有一个私有数据成员,此处copyable是一个空基类,其定义为class copyalbe{};属于empty classes,即classes中没有non-static成员变量,买有virtual函数,也没有virtual base classes,这样的对象不会使用任何空间,因为没有任何隶属对象的数据需要存储。当这样的类作为基类,成为derived class对象内的base class成分时,编译器会进行空白基类最优化(empty base optimization,EBO),使得sizeof(InetAddress)==sizeof(struct sockaddr_in)。

与上面相对应的是当一个empty class,作为一个类的成员变量时,如

class InetAddress {

...

private:

    muduo::copyable c;

    int x;

}

此时你会发现sizeof(InetAddress) > sizeof(int)!这是因为对于一个大小为0的独立对象,此时编译器会安插一个char到空对象中。上面在继承层次中copyable是附属与InetAddress中的,不是独立对象,所以编译器会进行EBO。

通过阅读源代码加深对C++基础理论的理解,是学习C++的好途径。学编程应该是理论结合实践,效果会更好!

你可能感兴趣的:(C/C++)