2015-09-23 22 views
1

目前我有這回事:創建的std :: string與固定數據位置

struct HashItem { 
    uint32_t Value; 
    char Key; 

    uint32_t GetSize() { 
     return 4 + GetKey().size(); 
    } 

    void SetKey(std::string &Key) { 
     memcpy(&(this->Key), Key.c_str(), Key.size()); 
    } 
    std::string GetKey() { 
     return std::string(&Key); 
    } 

    static HashItem* Cast(void* p) { 
     return reinterpret_cast<HashItem*>(p); 
    } 
}; 

這結構,就是要在MMF指針位置的解釋。在開始的時候,我有一個散列表,緊接着是那些串聯的HashItems。我想知道,如果有可能創建一個std ::字符串與一個固定的char *(指向char Key當前所在的位置)爲它保存實際數據的位置?

無論如何都手動管理內存,並且使用字符串字段而不是字符字段會更方便。

+0

'std :: string'可以比常量字符串文字多得多 - 所以通常答案是否定的。爲什麼不在指針到期時使用指針?如果你需要在你的密鑰上真正做字符串(比如比較),你必須自己實現它們(即使用C字符串的標準庫),但是你也要避免分配開銷。 – BeyelerStudios

+0

是一個錯字,還是'Key'只是一個字符? –

+0

@SergeBallesta它是一個佔位符,僅用於檢索指針 – user81993

回答

1

...如果有可能創建一個std ::字符串與一個固定的char *(指向char Key當前所在的位置)爲它保存實際數據的位置?

不是真的 - std :: string顯式地,非常清晰地管理自己的內存。你也許可以用自定義的分配器來破解它,但我傾向於認爲它會很糟糕。

如果你只是想要的東西一個std::string(即具有相同的運營商和公共接口),但不擁有它自己的內存,只使用一個Boost.String_Ref,它做什麼,你(好像)想不黑客。

1

不,這是不可能的。
此外,當您在GetKey()中返回std::string時,您實際上是在複製字符串。 std::string總是管理自己的記憶。其中一個很好的理由是指針可以在沒有任何警告的情況下改變,並且你永遠不能依賴它的位置。
std::string的大部分實現都有一個「短字符串優化」,對於短於16個字符的字符串,內存實際上就是作爲一個數組存儲在字符串對象中的。對於任何事情來說,內存都是分配的。如果指針可能來自外部,則不能保持這種不變(如果len指針是A指針是B指針)。