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;
};
}