小编use*_*145的帖子

RVO是否适用于这种情况?

假设我们有这种情况

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的情况,因为函数的返回类型不同于返回对象的类型(在他的示例中为元组与对).我认为同样的原则适用于此.

c++ rvo nrvo c++11

7
推荐指数
1
解决办法
350
查看次数

在这个编译器输出中,为什么func(int)使用它的第一个arg作为指针,将24个字节的指向内存归零?arg不是指针

我在理解这个汇编代码的作用时遇到了问题(这是一个较大的汇编代码,这是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不包含任何地址,只是函数的参数!)

有些事我错了,但我无法弄明白为什么.

assembly x86-64 calling-convention

2
推荐指数
1
解决办法
82
查看次数

标签 统计

assembly ×1

c++ ×1

c++11 ×1

calling-convention ×1

nrvo ×1

rvo ×1

x86-64 ×1