zoukankan      html  css  js  c++  java
  • c++ intrusive

    引用如下博客:

            https://blog.csdn.net/sinat_31275315/article/details/108567562

    Boost.Intrusive 是一个很有意思的实现,里面实现了很多侵入式容器,在特定环境下,可以大大提升性能。

    首先我们得理解什么是侵入式,什么是非侵入式。普遍,我们认为std的容器,比如std::list都是非侵入式的。这是因为对于任何一个(支持复制或者移动的)类型T,我们都可以定义std::list<T>。当往std::list里插入一个元素时,它会分配一个节点,这个节点的结构类似于下面这个:

    1. struct Node {
    2. T data;
    3. Node* prev;
    4. Node* next;
    5. };

    std::list会将要插入的元素复制到节点里。

    如果T很大,那么std::list<T>将在复制时产生较大的代价。有没有一个方法可以避免复制元素呢?或者如果T是不可复制和移动的元素呢?一个直接的方法是std::list<T*>,链表里只保存元素指针,这样只复制一个指针就好了,像是解决了我们的问题。

    但 Boost.Intrusive 走得更远一些。原因是,std::list<T*>在插入元素时,还是会去分配一个节点(虽然这个节点很小只有三个指针),这产生了新的内存申请!而我们知道内存申请是很慢的,应该尽量避免。Boost.Intrusive 提供的类似容器boost::intrusive::list可以做到完全不用分配节点。

    听上去很神奇,但说穿了并不神秘。 回到上面的节点,事实上,我们只需要原始数据类型T里面含有这两个节点指针就可以了!

    思考:标准C++的容器在设计时主要遵循的设计理念是解耦合,因此标准容器都是intrusive的,与此类似,shared_ptr也是intrusive的,shared_ptr不要求被管理的内存侵入特殊数据,是很通用的实现,而android的sp则是侵入式的智能指针,要求被管理的对象继承自RefBase,相当于干净的对象侵入了RefBase,这样以提升运行性能。

  • 相关阅读:
    Asp.net Core Kestrel 免费实现https
    sqlserver空间数据 + c# 实现查询附近的设备
    abp.vNext mvc版中的js和css
    asp.net core 3.x Identity
    asp.net core 3.x 授权默认流程
    Asp.Net WebApi 上传文件方法(原生js上传和JQ ajax上传)
    一个简单的.NET轻量级的ORM——Dikeko.ORM
    Mysql常见安装问题梳理(以5.6版本为例)
    Asp.netCore RESTful WebApi 小结
    初识Asp.netCore RESTful WebApi
  • 原文地址:https://www.cnblogs.com/fogwizard/p/15102932.html
Copyright © 2011-2022 走看看