最近我一直在分析一些舊代碼的某些部分,其中某些情況下,函數返回的值被賦予const
變量,有時變爲const&
。出於好奇心,我已經轉向解決問題以瞭解差異。但要到前點讓我得出一個簡單的例子,有一些代碼來引用:返回值const&和const賦值 - dissassembly
struct Data
{
int chunk[1024];
};
Data getData()
{
return Data();
}
int main()
{
const std::string varInit{ "abc" }; // 1
const std::string varVal = "abc"; // 2
const std::string& varRef = "abc"; // 3
const Data dataVal = getData(); // 4
const Data& dataRef = getData(); // 5
return 0;
}
上面的代碼下面的拆解與禁用優化VS2015收購。
我沒有ASM專家,但乍一看我會說,對於(1)
和(2)
有進行類似的操作。儘管如此,令我感到驚訝的是(3)
進行了兩項額外的操作(lea
和mov
),與以前的版本相比,const&
在變量賦值過程中未被使用。
通過值從函數返回數據時可以觀察到相同情況。 (5)
承擔了與(4)
有關的更多操作。
的問題是相當窄:
- 在哪裏,這些額外的操作都來自這裏什麼是他們的目的是什麼?一般來說不像這裏:What's the purpose of the LEA instruction,但在上下文中。
- 這是否會影響性能,至少對於其底層數據大小可忽略不計的對象? (與本例中使用的
Data
結構相反) - 開啓優化時會有什麼影響嗎? (發佈版本)
順便說一句,我已經閱讀Why not always assign return values to const reference?有關分配可有點關係,但不是問題的一部分值時,使用常量和const &的利弊。
你的編譯器實現'varRef'引用作爲一個普通的「變相指針」。 'lea'指令計算該指針的初始值('ecx = ebp-84h'),而'mov'指令將該值保存到'varRef'指針中。 – AnT