Skip to content

Louis-J/RTGC

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Sep 17, 2020
4afc294 · Sep 17, 2020

History

24 Commits
May 15, 2020
Sep 17, 2020
Sep 17, 2020
Sep 17, 2020
May 15, 2020
Mar 27, 2020
Feb 9, 2020
Sep 17, 2020
Sep 17, 2020

Repository files navigation

RTGC - Realtime Tracing Garrbage Collection

一个用于C++的无环形引用问题的智能指针,可以安全的、高效的保证资源的及时回收及确定性析构

简单示例

// requires: C++17
#include<iostream>
#include<memory>
#include<string>
#include<RTGC/RTGC.hpp>

class T1 {//use RTGC
    RTGC_AutoChainLink(T1, 2)
private:
    std::string str;
public:
    RTGC::SnapPtr<T1> next;
    T1(std::string &&str):str(str){}
    ~T1() {
        std::cout << str << " destructor\n";
    }
};

class T2 {//use shared_ptr
private:
    std::string str;
public:
    std::shared_ptr<T2> next;
    T2(std::string &&str):str(str){}
    ~T2() {
        std::cout << str << " destructor\n";
    }
};

int main() {
    std::cout << "RTGC:" << std::endl;
    {
        RTGC::RootPtr<T1> t1(new RTGC::ChainCore<T1>("t1"));
        RTGC::RootPtr<T1> t2(new RTGC::ChainCore<T1>("t2"));
        t1->next = t2;
        t2->next = t1;
    }
    std::cout << "shared_ptr:" << std::endl;
    {
        std::shared_ptr<T2> t1(new T2("t1"));
        std::shared_ptr<T2> t2(new T2("t2"));
        t1->next = t2;
        t2->next = t1;
    }
    return 0;
}

条件及依赖

  • 支持structured bindings(C++17, 用于实现编译期反射)、SFINAE的编译器(用于自动生成保证无循环引用问题操作的代码)
  • 已测试通过:GCC 9.2.1 libstdc++, Clang 10 libc++

特点及限制

特点

  • ChainPtr智能指针通过引用链管理算法,保证无循环引用问题; CountPtr智能指针通过引用计数算法,不保证循环引用问题,但性能较高
  • 编译期自动判断每个类型是否会出现循环引用,针对性的使用对应的智能指针,且最大程度保证性能
  • 仅需对类使用较少的宏,即可自动生成保证无循环引用问题操作的代码
  • 指针本身分为线程不安全与线程安全版本。线程不安全版本不保证多线程的安全;线程安全版本保证与shared_ptr相同的安全性(用户应保证:同一MTChainPtr/MTCountPtr不能被多个线程持有; 指针指向的对象也不能被多个线程同时操作)

限制

  • 由于使用紧凑式的设计,无法支持多继承下的多态(C++多继承下,多态可能会改变指针地址),因此需要用户保证多态的安全(支持单继承的多态、不改变指针地址的多继承多态,也可用户手动实现多态。跳转至WIKI)
  • 所有可能出现在堆的对象,均需按规范改写(暂未适配STL,因此暂不支持大部分STL容器及算法;仅支持std::string等无引用关系的类)

原理介绍

见WIKI

开发现状

实现的结构

  • 线程不安全的引用计数智能指针
  • 线程不安全的引用链智能指针
  • 线程安全的无锁引用计数智能指针
  • 线程安全的粗粒度自旋锁引用链智能指针

未实现的结构

  • 线程安全的细粒度自旋锁引用链智能指针
  • 线程安全的非阻塞引用链智能指针

实现的辅助功能

  • 对象的编译期反射并序列化为元组结构对象
  • 类的编译期反射并序列化为元组结构类型
  • 编译期自动生成引用链操作相关代码
  • 编译期判断类型是否有循环引用的可能性
  • 编译期自动生成判断循环引用的可能性的代码
  • 自动选择智能指针类型(引用计数/引用链)

未实现的辅助功能

  • 编译期判断多继承并阻止使指针偏移的多态
  • 以单个虚表的方式, 提供侵入式指针对多继承多态的支持

许可证

使用MS-RL半开源发布

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published