[英]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。 但是,如果您正在尋找簡單的實現
看看這里: 創建一個非線程安全的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.