• C++奇淫巧技 可继承单例


    引流

            提升c++效率、继承单例、单例继承、智能指针、c++提高效率、c++效率提升、多继承效率、提升多继承效率、父类单例、基类单例、公用父类、父类对象唯一、c++效率提升、c++提升速度、c++优化

    背景

            在平时的使用中我们可能想要继承一个类,从而方便自己使用。但如果在业务系统中我们可能需要频繁地 new  delete对象,比如在完成端口模型中我们将大量工作队列投递到作业队列,但此时对象的构造是释放开销将变得十分庞大。

    技术要点

            c++中类的初始化

                    1、内存分配(包含多继承时为多个对象大小之和)

                    2、类初始化,即构造函数。

            耗时分析

                    内存分配几乎不占时间,分配30字节和分配50字节其时间几乎不变。

                    类初始化占用时间,尤其是在高频度的构造和释放类时

    实现

            因此我们可以理解为,c++对象仅仅是一段被构造函数设置过数据的内存。
            我们将大量可复用的初始化操作分离,使用仅调用一次的操作进行初始化,而将原对象作为装饰对象,接口调用时使用单例对象即可。这能尽最大努力减少重复操作的代码。

    普通被继承类

    1. class MyClassTest
    2. {
    3. public:
    4. MyClassTest()
    5. {
    6. //假如这是实际的初始化操作
    7. Sleep(1);
    8. }
    9. ~MyClassTest()
    10. {
    11. }
    12. //假装的方法
    13. void test()
    14. {
    15. }
    16. private:
    17. };
    18. int main()
    19. {
    20. for (size_t i = 0; i < 10000; i++)
    21. {
    22. auto s = new MyClassTest;
    23. s->test();
    24. delete s;
    25. }
    26. system("pause");
    27. }

    效率情况

    修改为装饰自身的单例模式

            装饰自身

    1. class MyClassTest
    2. {
    3. public:
    4. MyClassTest()
    5. {
    6. //空构造,或少量数据
    7. }
    8. MyClassTest(int forstatic)
    9. {
    10. //假如这是实际的初始化操作
    11. Sleep(1);
    12. }
    13. ~MyClassTest()
    14. {
    15. }
    16. //假装的方法
    17. void test()
    18. {
    19. }
    20. MyClassTest* operator ->() const
    21. {
    22. return &StaticInstance();
    23. }
    24. private:
    25. static MyClassTest& StaticInstance()
    26. {
    27. static MyClassTest ins(1);
    28. return ins;
    29. }
    30. };
    31. int main()
    32. {
    33. for (size_t i = 0; i < 10000; i++)
    34. {
    35. auto s = new MyClassTest;
    36. (*s)->test();
    37. delete s;
    38. }
    39. system("pause");
    40. }

    单例装饰自身

     结论

            在某些特定的场景下

                            如高并发IO、线程池等情况

            恰当的使用单例与装饰可使其性能得到数倍提升。

  • 相关阅读:
    ubuntu主机之间移植python环境并修改pip指向
    华为OD七日集训第4期 - 按算法分类,由易到难,循序渐进,玩转OD
    HPE Aruba Networking连续六年蝉联Gartner SD-WAN魔力象限领导者
    头歌答案HTML——基础
    Linux环境基础开发工具使用
    全面吃透JAVA Stream流操作,让代码更加的优雅
    【Hive SQL 每日一题】统计用户连续下单的日期区间
    Spring Cloud Gateway实现数字签名与URL动态加密
    关于volatile与指令重排序的探讨
    你是否想知道如何应对高并发?Go语言为你提供了答案!
  • 原文地址:https://blog.csdn.net/qq_31314583/article/details/126105250