muduo 库解析之一:Copyable 和 NonCopyable

Copyable

  • 是一个标记类。
  • 以此为基类的子类可以拷贝,并且其本身必须是值类型。
  • EBO(Empty Base Class Optimization) 空基类优化。

源码

#pragma once

namespace muduo
{
    //@ tag class,标记类型可拷贝
    //@ EBO (空基类优化)
    //@ 以此为基类的子类必须是值类型的
    class Copyable
    {
    protected:
        Copyable() = default;
        ~Copyable() = default;
    };
}

EBO

class Empty
{};

class A{
	Empty e;
	int i;
};

class B :public Empty{
	int i;
};

int main()
{
	std::cout << "sizeof(Empty) is: " << sizeof(Empty) << std::endl;  //@ 1
	std::cout << "sizeof(A) is: " << sizeof(A) << std::endl; //@ 8
	std::cout << "sizeof(B) is: " << sizeof(B) << std::endl; //@ 4
	return 0;
}
  • sizeof(Empty) == 1:编译器会给这个空类默默的安插一个 char,用来标识这个类。
  • sizeof(A) == 8:按字节对齐。
  • sizeof(B) == 4:空基类优化。

空基类只是不包含 non-static 成员变量,但是里面往往还包含有enums、typedefs、static、non-virtual 函数。

NonCopyable

  • 禁用复制构造函数和赋值运算符,以此为父类的子类,因为父类对象不可拷贝和赋值,则本身也不能拷贝和赋值。

源码

#pragma once

namespace muduo
{
    class NonCopyable
    {
    public:
        NonCopyable(const NonCopyable &) = delete;
        void operator=(const NonCopyable &) = delete;

    protected:
        NonCopyable() = default;
        ~NonCopyable() = default;
    };
}
原文地址:https://www.cnblogs.com/xiaojianliu/p/14692796.html