最近我一直在分析一些旧代码的某些部分,其中某些情况下,函数返回的值被赋予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