欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++17 使用 std::string_view避免字符串拷貝優(yōu)化程序性能

 更新時間:2020年10月24日 11:12:00   作者:半杯茶的小酒杯  
這篇文章主要介紹了C++17 使用 std::string_view避免字符串拷貝優(yōu)化程序性能,幫助大家提高程序運(yùn)行速度,感興趣的朋友可以了解下

C++中std::string是日常Coding中經(jīng)常使用的一個類,使用起來非常方便,但是也存在一些弊端。

如下代碼,參數(shù)傳遞的過程發(fā)生了內(nèi)存分配(Memory Allocation)和內(nèi)存拷貝。

void fun(const std::string& s) {
  std::cout << s << std::endl;
}

const char* ch = "hello world";

// bad way, expensive if the string is long
fun(ch); 

再看下面的常用的字符串截取實(shí)現(xiàn):

// very long string
std::string str = "lllloooonnnngggg sssstttrrriiinnnggg"; 

// bad way, expensive if the string is long
std::cout << str.substr(15, 10) << '\n';

為了進(jìn)一步的壓榨程序的性能,需要移除掉這些昂貴的字符串內(nèi)存分配和拷貝操作。C++17中提供了std::string_view可以幫助我們實(shí)現(xiàn)這一功能,該類并不持有字符串的拷貝,而是與源字符串共享其內(nèi)存空間。

string_view構(gòu)造函數(shù)

constexpr basic_string_view() noexcept; (since C++17)
constexpr basic_string_view(const basic_string_view& other) noexcept = default; (since C++17)
constexpr basic_string_view(const CharT* s, size_type count);(since C++17)
constexpr basic_string_view(const CharT* s); (since C++17)
template<class It, class End>

雖然沒有定義參數(shù)為std::string的std::string_view函數(shù),下面的代碼仍然可以通過編譯。

std::string str("hello string view!");
std::string_view sview(str);

因?yàn)閟td::string類重載了std::string到std::string_view的轉(zhuǎn)換操作符。

operator basic_string_view<charT, traits>() const noexcept;

std::string_view避免內(nèi)存拷貝

有了string_view,我們就可以很好的解決文章開頭提到的問題。

void fun(const std::string_view& s) {
  std::cout << s << std::endl;
}

const char* ch = "hello world, char";
fun(ch); 

const std::string str = "hello world, string";
fun(str);

fun({ch, 5});

有了std::string_view,函數(shù)參數(shù)不管是字符串?dāng)?shù)組指針,還是std::string,都不需要拷貝內(nèi)存源字符串。

// very long string
std::string str = "lllloooonnnngggg sssstttrrriiinnnggg";

//Good way - No copies are created!
std::string_view view = str;

// string_view::substr returns a new string_view
std::cout << view.substr(15, 10) << '\n';

同理,字符串的substr()函數(shù)也不需要再進(jìn)行拷貝了,這對于非常長的字符串,可以有效的提升程序的性能表現(xiàn)。

std::string_view注意事項(xiàng)

由于std::string_view并不持有字符串的內(nèi)存,所以它的生命周期一定要比源字符串的生命周期長。一些典型的生命周期管理錯誤的例子:

std::string_view sv = std::string("hello world");

std::string_view fun() {
 std::string str("hello world");
 return std::string_view(str);
}

std::string_view的結(jié)尾并沒有\(zhòng)0結(jié)束符,所以在輸出std::string_view的時候要注意邊界,如下代碼:

#include <iostream>
#include <vector>
#include <string>
#include <string_view>

int main() {
  const char* ch = "hello world";
  
  std::string_view sv(ch, 2);
  
  std::cout << sv << std::endl;
  
  std::cout << sv.data() << std::endl;
  
  return 0;
}

程序輸出:

he
hello world

std::cout << sv.data() << std::endl; 這行代碼輸出了hello world,這是因?yàn)閟v仍然指向源字符串內(nèi)存,調(diào)用sv.data()打印時,仍然沿用了C++對于字符串的約定,直到遇到結(jié)束符\0時,打印才結(jié)束,這時候就輸出了完整的源字符串內(nèi)容。當(dāng)然這里明顯是不符合預(yù)期的,尤其是std::string_view指向的字符串沒有\(zhòng)0結(jié)束符的時候,程序很容易出現(xiàn)潛在的內(nèi)存問題。所以此處一定要小心。

參考材料

https://riptutorial.com/cplusplus/example/6571/using-the-std–string-view-class

https://en.cppreference.com/w/cpp/string/basic_string_view

https://segmentfault.com/a/1190000018387368

以上就是C++17 使用 std::string_view避免字符串拷貝優(yōu)化程序性能的詳細(xì)內(nèi)容,更多關(guān)于c++17 std::string_view的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:

相關(guān)文章

  • C語言連續(xù)生成多個隨機(jī)數(shù)實(shí)現(xiàn)可限制范圍

    C語言連續(xù)生成多個隨機(jī)數(shù)實(shí)現(xiàn)可限制范圍

    這篇文章主要介紹了C語言連續(xù)生成多個隨機(jī)數(shù)實(shí)現(xiàn)可限制范圍,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • __stdcall 和 __cdecl 的區(qū)別淺析

    __stdcall 和 __cdecl 的區(qū)別淺析

    __stdcall 和 __cdecl 的區(qū)別淺析,需要的朋友可以參考一下
    2013-03-03
  • C++?用紅黑樹模擬實(shí)現(xiàn)set、map的示例代碼

    C++?用紅黑樹模擬實(shí)現(xiàn)set、map的示例代碼

    set、map的底層結(jié)構(gòu)是紅黑樹,它們的函數(shù)通過調(diào)用紅黑樹的接口來實(shí)現(xiàn),本文主要介紹了C++?用紅黑樹模擬實(shí)現(xiàn)set、map,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • 你不知道的C++中namespace和using的用法實(shí)例

    你不知道的C++中namespace和using的用法實(shí)例

    在C++語言編寫的程序中,變量和函數(shù)等的作用范圍是有一定限制的,下面這篇文章主要給大家介紹了一些你不知道的C++中namespace和using的用法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • VSCode保存代碼自動格式化無效的解決方法

    VSCode保存代碼自動格式化無效的解決方法

    最近一直使用vscode,VSCode中各種配置后,自動保存格式化仍然無效,本文就來介紹一下解決方法,感興趣的可以了解一下
    2023-08-08
  • 必須知道的C語言八大排序算法(收藏)

    必須知道的C語言八大排序算法(收藏)

    這篇文章主要介紹了C語言八大排序算法的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-10-10
  • C++制作DLL文件的方法詳解

    C++制作DLL文件的方法詳解

    本文主要介紹如何制作DLL,將代碼類中的方法以接口的形式暴露出來給exe程序使用。會涉及類廠創(chuàng)建方法實(shí)例、聲明DLL接口、.def文件的使用等,感興趣的可以了解一下
    2023-04-04
  • C/C++ Qt QChart繪圖組件的具體使用

    C/C++ Qt QChart繪圖組件的具體使用

    QtCharts 組件是QT中提供圖表繪制的模塊,用來繪制常規(guī)圖形,本文就詳細(xì)的介紹了QChart的使用,以及柱狀圖,折線圖等常用的圖形的實(shí)現(xiàn),感興趣的可以了解一下
    2021-11-11
  • 用c++實(shí)現(xiàn)x的y次冪的代碼

    用c++實(shí)現(xiàn)x的y次冪的代碼

    以下實(shí)例是對使用c++實(shí)現(xiàn)x的y次冪的解決方法進(jìn)行了介紹。需要的朋友參考下
    2013-05-05
  • C++深入分析數(shù)據(jù)在內(nèi)存中的存儲形態(tài)

    C++深入分析數(shù)據(jù)在內(nèi)存中的存儲形態(tài)

    使用編程語言進(jìn)行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么
    2023-01-01

最新評論