簡體   English   中英

GCC優化返回值

[英]GCC optimize return value

這個問題與函數返回值與引用傳遞的修改值有關 我想知道gcc是否會以相同的方式優化以下內容。 想象這兩個函數做同樣的事情:

返回:

vector<int> f(...)
{
    vector<int> r;
    ...
    return r;
}

通過參考傳遞:

void f(vector<int> &r, ...)
{
    ...
}

vector<int> r;
f(r, ...)

在性能至關重要的GMP功能中,按引用傳遞經常發生。

通常,即使滿足某些條件,編譯器也沒有義務進行NRVO(命名返回值優化)或復制省略。 程序也不必依賴於此類優化,因為它實際上使其不可移植。

現在,就第一種情況而言,答案是肯定的,編譯器可以優化去除向量的副本。 特別是這種情況屬於標准12.8 / p31.1復制和移動類對象[class.copy]的以下措辭:

...在以下情況下允許復制/移動操作省略,稱為復制刪除(可以合並以消除多份副本):

(31.1)—在具有類返回類型的函數中的return語句中,當表達式是具有以下內容的非易失性自動對象(函數參數或由處理程序的異常聲明(15.3)引入的變量除外)的名稱時:與函數返回類型相同(忽略cv限定)的類型,可以通過將自動對象直接構造為函數的返回值來省略復制/移動操作。

同樣,從C ++ 11開始, std::vector具有移動工具,實際上vector將被移動。

至於第二種情況,答案是否定的。 畢竟沒有必要了,因為您傳遞了對向量的引用。 也就是說,您傳遞矢量的別名(即對象本身)。

暫無
暫無

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

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