簡體   English   中英

一個const字符串構造函數,不分配任何char內存?

[英]A const string constructor that doesn't allocate any char memory?

我正在嘗試優化我編寫的一些代碼來處理應用程序協議的多個層。 我自由地使用了std::string類,並且為了簡單而不是過早優化而努力。 應用程序太慢了, valgrindgprof顯示我正在花費大量時間復制構造字符串,因為緩沖區向上移動到我的堆棧中。

在我看來,在將chars從系統緩沖區復制到我的最低應用程序緩沖區之后,我應該能夠避免再次復制數據了:畢竟,它在向上移動堆棧時不會發生變異。

我的協議格式是一個“傳輸”,由一個或多個換行符終止的記錄組成,每個記錄由幾個以制表符分隔的字段組成 ,並以特殊標記終止。 例如

RECORD 1\tHAS\tTHESE\tFIELDS\nRECORD 2\tLOOKS\tLIKE\tTHIS\nEND-OF-TRANSMISSION\n

這將被組裝在一個名為input_buffer的std::string

傳輸的處理涉及從緩沖區中提取記錄並將其傳遞給下一層; 從記錄中提取字段向量並將其傳遞給下一層; 將字段存儲到地圖中。 在每個階段,在分配新的std :: strings時復制數據。

是否有可能將索引中的const字符串分配到input_buffer,並且長度...沒有進行任何復制? 例如,RECORD 2從偏移量26開始,長度為24個字符:

const std:string record (substr(input_buffer, 26), 24 );

我不熟悉字符串對象的內部,但它的性能保證似乎暗示某處有一個簡單的char序列,而且幾乎無疑是指向那些字符內存的指針。 該指針可以初始化為屬於另一個字符串的內存嗎?

(我的編譯器是g ++ 4.7,但如果這需要4.8,我也很高興知道這一點。)

根據我的理解,這聽起來像是boost :: string_ref的一個很好的候選者。 你只需要做boost::string_ref input(input_buffer); 然后將string_ref s傳遞給堆棧。 您唯一需要擔心的是保持原始緩沖區始終存在。

暫無
暫無

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

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