簡體   English   中英

從內聯函數返回字符串時,會創建多少個臨時對象?

[英]How many temporary objects are created when I return a string from an inline function?

考慮以下代碼:

QSqlQuery *queryQt; // represents a row in a database table

inline std::string getCString(size_t col) {
     return queryQt->value(col).toString().toStdString();
}

其中queryQt->value(col).toString()表示數據庫中行的特定列的字符串值。

讓我們假設編譯器具有所有優化功能。

問題:以下代碼:

std::string a = T.getCString(0);

等價於

std::string a = queryQt->value(col).toString().toStdString();

或者

std::string temp = queryQt->value(col).toString().toStdString();
std::string a = temp;

問題更新:

如果我在返回類型中添加const,會有所不同嗎?

由於以下代碼正在初始化 a而不是分配給它

std::string a = T.getCString(0);

相當於

std::string a(T.getCString(0)); // Construct "a" with return value of function.

要么

std::string a(std::string(queryQt->value(0).toString().toStdString()));

這意味着從函數返回時將有std::string副本構造,而從返回值構造a時將有另一個副本構造。 所以2份。

但是,在C ++ 11編譯器上, 構造返回值時將使用move構造,a std::string對象都是is臨時的。 這意味着將只有2步而不是2步。

而由於最后復制省略優化的編譯器將最有可能的的Elid復印件一起,簡單地構造std::string直接在a ,導致無份的。

內聯功能與正在制作的份數無關。 將返回類型更改為const將阻止移動構造,因為您無法從const對象中移動。

用我的嘈雜課看這個現場例子

相當於

std::string temp = queryQt->value(col).toString().toStdString();
std::string a = temp;

從理論上講,至少。 根據實際的編譯器及其設置,即使使用inline關鍵字,該函數也可能不會內inline 大多數現代的編譯器(在發行設置上)也將代碼優化為

std::string a = queryQt->value(col).toString().toStdString();

暫無
暫無

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

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