<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      std::string::resize() 對緩沖區一些用處

      如果需要一個緩沖區來暫存字符串會先定義一個char*的數組來實現

      存完后又給string賦值,感覺有點麻煩,尋思有什么方法可以更優雅點

      比如如下代碼

       1 void CVTString::StrToWStr(std::string& strString, std::wstring& wsString, unsigned int uCodePage)
       2 {
       3     int len = 0;
       4     wchar_t* buffer = nullptr;
       5 
       6     len = MultiByteToWideChar(uCodePage, NULL, strString.c_str(), static_cast<int>(strString.size()), NULL, NULL);
       7     buffer = new wchar_t[len + 1];
       8     MultiByteToWideChar(uCodePage, NULL, strString.c_str(), static_cast<int>(strString.size()), buffer, len);
       9     buffer[len] = L'\0';
      10     wsString = buffer;
      11 
      12     delete[] buffer;
      13 }

      這個new可不可以去掉呢?這樣的話buffer指針和delete也可以去掉了,性能應該有一丟丟提升

       

      std::string有一個resize方法可以改變string分配的緩沖區大小

      同時配合data方法來獲取緩沖區的指針,這樣可以實現一個char*數組效果的緩沖區。

       

      但是注意的是string內部默認是分配了一個較小的緩沖區,如果resize的大小比較小

      data方法的指針仍然不變,但是如果resize比較大,data返回的指針會變化

      也就是會釋放舊緩沖區,重新分配緩沖區。

      這個大小的界限在vc上是16,也就是大于等于16的resize會重新分配緩沖區。

      同時也就提醒我們,不要認為data和c_str返回的地址總是不變的。

      如果是resize小于當前字符串長度,會直接截斷字符串,也就是在目標長度的緩沖區補0,暫時沒發現會進行重新分配。

       

      resize還有一點,resize的長度默認是不包含字符串結束符號 \0 的,也就是resize(5),實際上會分配6的空間,最后一個字節補0

      對于wstring則是補充\0\0

      resize的第二個參數是填寫補充的字符,resize(10,'x'),如果比原始字符串長,則會補充x字符,往小resize不會,而且依然會在最后補充結束符。

       

      最終優化的代碼(僅演示,一些錯誤處理沒寫)

       1 void CVTString::StrToWStr(std::string& strString, std::wstring& wsString, unsigned int uCodePage)
       2 {
       3     int charCount = MultiByteToWideChar
       4     (
       5         uCodePage, NULL, strString.c_str(), static_cast<int>(strString.size()), NULL, NULL
       6     );
       7 
       8     if (charCount == 0) return;
       9 
      10     wsString.resize(charCount);
      11     MultiByteToWideChar
      12     (
      13         uCodePage, NULL, strString.c_str(), static_cast<int>(strString.size()), const_cast<wchar_t*>(wsString.data()), charCount
      14     );
      15 }

      2024年4月29日 :

      不過以上代碼還是有個性能問題的

      resize是會分配空間+初始化每個元素,有些地方可能并不需要直接初始化對象(或者里面就需要寫入數據,這時候初始化就成了不必要的操作),所以resize可能會造成一定的性能損失。

      reserve 其實相當于預分配空間,防止因為push_back的時候不斷重新分配空間造成性能下降(動態數組依據長度可能有1.5倍的擴容機制),當然這個只是單純的改變capacity也就是對象分配的空間的大小,而不會改變對象內元素的數量

      到C++23才有resize_and_overwrite來避免初始化操作。https://en.cppreference.com/w/cpp/string/basic_string/resize_and_overwrite

      posted @ 2023-01-21 06:42  Dir-A  閱讀(730)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 起碰免费公开97在线视频| 苍南县| 97色伦97色伦国产| 色道久久综合亚洲精品蜜桃| 夜夜添无码一区二区三区| 国产99在线 | 免费| 亚洲精品尤物av在线网站| 国产午夜福利不卡在线观看 | 国产美女久久久亚洲综合| 精品无码一区二区三区电影 | 羞羞影院午夜男女爽爽免费视频| 国产精品户外野外| 丁香五月婷激情综合第九色| 亚洲性图日本一区二区三区| 国产高清一区二区不卡| 色欲综合久久中文字幕网| 定远县| 亚洲精品区午夜亚洲精品区| 亚洲成人精品综合在线| 欧洲熟妇色xxxx欧美老妇多毛网站| 亚洲av伊人久久综合性色| 天天澡日日澡狠狠欧美老妇| 久久精品国产亚洲av麻豆长发| 国产揄拍国产精品| 天堂一区二区三区av| 蜜臀av一区二区国产精品| 国内少妇偷人精品视频| 国产69精品久久久久人妻| 国产啪视频免费观看视频| 忘忧草在线社区www中国中文| 最新精品国产自偷在自线| 国产在线观看免费观看| 亚洲偷自拍另类一区二区| 久久99精品九九九久久婷婷 | 色九月亚洲综合网| 国产成人av综合色| 国产喷水1区2区3区咪咪爱AV| 亚洲伊人情人综合网站| 无码国产偷倩在线播放| 亚洲综合伊人五月天中文| 无码成a毛片免费|