zoukankan      html  css  js  c++  java
  • 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;
        };
    }
    
  • 相关阅读:
    pip install MySQL-python 失败
    E: Unable to correct problems, you have held broken packages
    git 提交顺序
    git 分支
    ubuntu 安装git
    ubuntu 有些软件中不能输入中文
    ubuntu 完全卸载mysql
    Linux中常用操作命令
    基于注解的Spring AOP的配置和使用
    log4j配置详解
  • 原文地址:https://www.cnblogs.com/xiaojianliu/p/14692796.html
Copyright © 2011-2022 走看看