假设我们有这种情况
std::string v_1()
{
return "name";
}
std::string test = v_1();
Run Code Online (Sandbox Code Playgroud)
RVO是否适用于此?我认为答案是否定的,因为应用RVO的规则是:" 如果函数按值返回类类型,则return语句的表达式是具有自动存储持续时间的非易失性对象的名称,这不是'函数参数或catch子句参数,并且具有与函数的返回类型相同的类型(忽略顶级cv资格),然后省略复制/移动 "并且在这种情况下返回的对象不具有相同类型的函数的返回类型,但我不是100%在这里不应用RVO.
非常感谢你.
PS.在这个演讲中https://www.youtube.com/watch?v=AKtHxKJRwp4(40分钟,第18分钟)来自微软的Stephan谈到了无法应用RVO的情况,因为函数的返回类型不同于返回对象的类型(在他的示例中为元组与对).我认为同样的原则适用于此.
我在理解这个汇编代码的作用时遇到了问题(这是一个较大的汇编代码,这是Intel语法):
vector<int> func(int i) { ...} // C++ source
Run Code Online (Sandbox Code Playgroud)
来自Godbolt编译器资源管理器的 clang输出:
func(int): # @func(int)
push rbp
push rbx
push rax
mov ebp, esi
mov rbx, rdi
xorps xmm0, xmm0
movups xmmword ptr [rbx], xmm0
mov qword ptr [rbx + 16], 0
Run Code Online (Sandbox Code Playgroud)
这是在Linux上编译的,遵循官方的System V AMD64 ABI.根据此链接,rdi寄存器用于将第一个参数传递给函数.所以在这条线上
mov rbx, rdi
Run Code Online (Sandbox Code Playgroud)
我们将参数的值(在本例中为int)移动到rbx.不久之后,我们做到:
movups xmmword ptr [rbx], xmm0
Run Code Online (Sandbox Code Playgroud)
这是我不明白的.rbx包含参数的值,它是一个int,这里我们将xmm0的内容复制到rbx指向的地址(但是rbx不包含任何地址,只是函数的参数!)
有些事我错了,但我无法弄明白为什么.