簡體   English   中英

嵌入式環境中boost :: shared_ptr的替代方案

[英]Alternative to boost::shared_ptr in an embedded environment

我在嵌入式Linux環境中使用C ++,它具有GCC version 2.95

我只是無法用bcp提取boost::shared_ptr文件,它太重了。

我想要的是boost::shared_ptr一個簡單的智能指針實現,但沒有所有的boost開銷(如果可能......)。

我可以拿出我自己的版本閱讀提升源,但我擔心錯過一個或多個點,似乎很容易制作一個錯誤的智能指針,我不能承受錯誤的實施。

那么,我是否可以使用boost::shared_ptr (或任何引用計數等效智能指針)的“簡單”實現或實現示例,或者我可以將其作為靈感來源?

如果你不需要混合共享 ptr,並且不需要coustom deletors ,你可以使用快速和臟的my_shared_ptr:

template<class T>
class my_shared_ptr
{
    template<class U>
    friend class my_shared_ptr;
public:
    my_shared_ptr() :p(), c() {}
    explicit my_shared_ptr(T* s) :p(s), c(new unsigned(1)) {}

    my_shared_ptr(const my_shared_ptr& s) :p(s.p), c(s.c) { if(c) ++*c; }

    my_shared_ptr& operator=(const my_shared_ptr& s) 
    { if(this!=&s) { clear(); p=s.p; c=s.c; if(c) ++*c; } return *this; }

    template<class U>
    my_shared_ptr(const my_shared_ptr<U>& s) :p(s.p), c(s.c) { if(c) ++*c; }

    ~my_shared_ptr() { clear(); }

    void clear() 
    { 
        if(c)
        {
            if(*c==1) delete p; 
            if(!--*c) delete c; 
        } 
        c=0; p=0; 
    }

    T* get() const { return (c)? p: 0; }
    T* operator->() const { return get(); }
    T& operator*() const { return *get(); }

private:
    T* p;
    unsigned* c;
}

對於任何對make_my_shared<X>感興趣的人make_my_shared<X> ,它可以簡單地實現為

template<class T, class... U>
auto make_my_shared(U&&... u)
{ 
    return my_shared_ptr<T>(new T{std::forward<U>(u)...});
}

被稱為

auto pt = make_my_shared<T>( ... );

還有std :: tr1 :: shared_ptr,它只是C ++ 11標准的提升。 如果允許,您可以選擇它,或者通過引用計數編寫您自己的。

你擔心哪些“增加開銷”,以及shared_ptr以什么方式“太重”你的應用程序? 使用Boost沒有任何開銷(至少如果你只使用只有頭的庫,比如智能指針庫); 我能想到的關於shared_ptr的唯一開銷是:

  • 線程安全引用計數; 既然你使用的是古老的編譯器,我假設你還有一個古老的運行時庫和內核,所以這可能是非常低效的。 如果您的應用程序是單線程的,那么您可以通過BOOST_DISABLE_THREADS禁用它。
  • 引用計數結構與受管對象一起分配。 您可以使用make_shared()allocate_shared()創建對象來消除額外的分配。

在許多情況下,您可以通過不創建對象或復制共享指針來消除速度關鍵代碼的開銷 - 通過引用傳遞指針並僅在實際需要時復制它們。

如果你需要一些指針的線程安全,而不是其他指針,並且(在分析之后,刪除所有不必要的分配和指針復制)你發現使用共享指針仍然會導致很大的開銷,那么你可以考慮使用intrusive_ptr ,並管理您自己在對象內的引用計數。

如果可行的話,更新到現代GNU / Linux版本也可能有好處。 自Linux 2.6中引入futex以來,線程同步效率更高。 你也可以在其他方面找到這個幫助; 過去十年中有很多改進。 更現代的編譯器也會提供標准(TR1或C ++ 11)共享指針,因此您不需要Boost。

我建議您可以單獨使用shared_ptr。 但是,如果您正在尋找簡單的實現

  • 進行一些單元測試
  • 不是線程安全的
  • 多態分配的基本支持 < - 讓我知道你是否感興趣
  • 自定義deletors(即數組deletors,或特殊資源的自定義函數)

看看這里: 創建一個非線程安全的shared_ptr

您可以在沒有所有Boost開銷的情況下使用shared_ptr :它是一個僅限標頭的實現。 如果您不使用任何其他類,則只編譯shared_ptr

shared_ptr的實現已經相當精簡,但是如果你想避免中間引用計數塊和對刪除函數的(潛在)虛擬調用,你可以使用boost::intrusive_ptr ,它更適合嵌入式環境:它運行在嵌入在對象本身的引用計數器上,您只需提供幾個函數來遞增/遞減它。 缺點是你將無法使用weak_ptr

我無法評論gcc 2.95如何內聯/折疊模板實例化(這是一個非常古老的編譯器),更新版本的gcc處理得相當好,所以你在這里獨立。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM