c ++函数在哪里放置返回值

时间:2017-06-30 12:41:25

标签: c++

让我们来看看这段代码。 我在想c ++函数只返回eax中的int值。 那么它在哪里存储矢量结果?堆?堆叠?

由于

#include <iostream>
#include <vector>

using namespace std;


vector<int> fonction(int a)
{
        vector<int> vec;
        for (int i=0;i<a;i++)
        {
                vec.push_back(1);
        }
        return vec;
}

int main(int argc, char *argv[])
{
        cout << "test" << endl;
        auto res = fonction(10);
        cout << res.size() << endl;
        return 0;
}

2 个答案:

答案 0 :(得分:2)

就寄存器而言,C ++标准没有规定哪些寄存器应包含该值,因为标准不依赖于体系结构。它只定义了语言的语法和语义

至于在函数中创建向量时会发生什么,向量的内容存储在堆上(像往常一样),向量本身(即指针和其他簿记)存储在堆栈框架中功能。

当你从函数中返回向量的值时,返回值被视为右值,并且该rvalue保证被移动到已分配的向量(即指针和其他簿记)中。主要。

请注意,有一些名为NRVO的东西,如果编译器能够应用的话。没有移动,只需从函数的堆栈中获取值,并将其放在需要的位置。

  

好的,从函数返回向量类型是否正确?

当然,它完全没问题

答案 1 :(得分:0)

看起来像x86_64的gcc在调用者的堆栈上分配返回向量struct并在rax中返回指向它的指针。

movq    -48(%rbp), %rax
...
ret