日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++ 減少臨時字符串對象的產生

作者:TheOldManAndTheSea 更新時間: 2022-05-13 編程語言

C++ 減少臨時字符串對象的產生

flyfish

以std::string字符串相連為例

產生臨時字符串對象的寫法

#include 
#include 
int main(int argc, char *argv[])
{
std::string s1 = "a";
std::string s2 = "b";
std::string s3;

s3 =  s1 + s2;
std::cout<<s3<<std::endl;
}

s3 = s1 + s2;的過程

1  operator+(const string&,const string&);

字符串連接運算。它由s1+s2觸發。

2  string::string(const char *);

構造函數。在operator+()中執行string result(buffer)會觸發此函數。

3  string::string(const string&);

我們需要一個臨時對象存儲operator+()的返回值。拷貝構造函數使用返回的result string時創建該臨時對象。

4  string::~string();

在operator+()函數退出之前,將銷毀生命期限于自己函數范圍內的result string對象。

5  string::operator=(const string&);

調用賦值運算符,將operator+()生成的臨時對象賦給左邊的對象s3。

6  string::~string();

銷毀返回值使用的臨時對象

避免產生臨時字符串對象寫法1

如果要減少內存使用,代碼就這樣寫,以三個字符串相連為例

#include 
#include 

int main(int argc, char *argv[])
{
std::string s1 = "a";
std::string s2 = "b";
std::string s3 = "c";
std::string s4  = s1 + s2 +s3;

std::cout<<s4<<std::endl;
}

編譯器使用s4而不是臨時對象來存儲。 s1 + s2 +s3的結果直接復制構造至s4對象中.所以沒有臨時對象。

避免產生臨時字符串對象寫法2

#include 
#include 

int main(int argc, char *argv[])
{
std::string s1 = "a";
std::string s2 = "b";
std::string s3 = "c";
std::string s4;

s4=s1;
s4+=s2;
s4+=s3;
std::cout<<s4<<std::endl;
}

參考《提高C++性能的編程技術》

原文鏈接:https://blog.csdn.net/flyfish1986/article/details/124511427

欄目分類
最近更新