根據需要,C風格字符串始終可以轉換爲std::string
。實際上,從分析中獲得的觀察結果很可能是由於數據碎片而非簡單的分配數量造成的,並且按需創建std::string
將會很有效。當然,不知道你的實際應用程序,這只是一個猜測,並且直到經過測試才真正知道這一點。我想象一類
class my_class {
std::string data() const { return self._data; }
const char* data_as_c_str() const // In case you really need it!
{ return self._data; }
private:
int _type;
char _data[1];
};
注意我用了一個巧妙的標準ç伎倆數據佈局:_data
是隻要你希望它是,只要你的工廠函數分配它的額外空間。 IIRC,C99甚至給了它一個特殊的語法:
struct my_struct {
int type;
char data[];
};
這與C++編譯器工作的好機會。 (這是在C++ 11標準嗎?)
當然,如果你這樣做,你真的需要使所有的構造函數私有和朋友你的工廠函數,以確保工廠函數是唯一的實際實例化my_class
的方式 - 如果沒有數組的額外內存,它將被破壞。您肯定也需要製作operator=
私密,否則請謹慎實施。
反思您的數據類型可能是一個好主意。
例如,您可以做的一件事是,而不是試圖將您的char
數組放入結構化數據類型中,而是使用智能參考。看起來像
class structured_data_reference {
public:
structured_data_reference(const char *data):_data(data) {}
std::string get_first_field() const {
// Do something interesting with _data to get the first field
}
private:
const char *_data;
};
你會想要做的與其他構造函數和賦值運算符正確的事情太(可能禁止分配,並實施一些合理的移動和複製)的類。您可能需要在整個代碼中使用參考計數指針(例如std::shared_ptr
)而不是裸指針。
另一種黑客工具,可能是隻使用std::string
,但類型信息存儲在第一項(或前幾個)。當然,無論何時訪問數據,這都需要進行覈算。
如果我理解正確,字符串不能在構建之後增長,並且內存將由管理整個對象的人來管理......因爲您要使用C方式,爲什麼不使用'char *'? C字符串中最糟糕的部分是需要管理內存,但在你的情況下似乎不是問題,是嗎? –
+1有**證明**需要優化之前,所有的半翹! –
如果你真的熱衷於使用'std :: string'而不是c-string,你可以看看使用自定義分配器來實現你想要做的一些事情。這可以讓你在一次分配中彙集你的字符串,但它仍然不會一次性分配一切(即你的結構),它可能最終成爲維護的噩夢。可能最好堅持c弦。 –