2011-02-16 16 views
20

剛纔我發現我注意到std::stringsubstr操作對於rvalues來說可能更有效率,因爲它可以從*this盜取分配的內存。可以std ::字符串重載「substr」爲rvalue * this並竊取資源?

N3225的標準庫中包含的std::string

basic_string substr(size_type pos = 0, size_type n = npos) const; 

下面的成員函數聲明,可以實現對右值的優化substr重載和實現可以提供兩個版本,其中一個可以重用的緩衝區右值字符串?

basic_string substr(size_type pos = 0) &&; 
basic_string substr(size_type pos, size_type n) const; 

我想象右值版本可以實現如下的*this一個設置*this存儲器重用到移動-從狀態。

basic_string substr(size_type pos = 0) && { 
    basic_string __r; 
    __r.__internal_share_buf(pos, __start + pos, __size - pos); 
    __start = 0; // or whatever the 'empty' state is 
    return __r; 
} 

這是否以一種有效的方式在常用字符串實現上工作,還是會花費太多內務管理?

+0

不會泄漏內存嗎?畢竟,我們只是在竊取內存的一部分,而不是整塊...... – 2011-02-16 21:43:09

+0

@Konrad我們需要記住我們在竊取內存,釋放內存時我們需要將它抵消到原點。 – 2011-02-16 21:44:51

回答

4

首先,實現不能添加搶斷源的過載,因爲這將是檢測:

std::string s="some random string"; 
std::string s2=std::move(s).substr(5,5); 
assert(s=="some random string"); 
assert(s2=="rando"); 

的第一個斷言會如果實現偷走了失敗來自s的數據,以及C++ 0x的措辭本質上是非法拷貝寫入。

其次,這不一定是一個優化:無論如何,你必須在std::string中添加額外的內務處理,以處理它是一個較大字符串的子字符串,這意味着當有不再有任何字符串引用大字符串,只是它的一些子字符串。

0

是的,也許它應該提交給標準委員會,或者可能在圖書館實施。我不知道優化會有多寶貴。這將是一個有趣的研究。

當gcc增加對r值this的支持時,有人應該嘗試它並報告它是多麼有用。