让我们来看看这段代码。 我在想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;
}
答案 0 :(得分:2)
就寄存器而言,C ++标准没有规定哪些寄存器应包含该值,因为标准不依赖于体系结构。它只定义了语言的语法和语义
至于在函数中创建向量时会发生什么,向量的内容存储在堆上(像往常一样),向量本身(即指针和其他簿记)存储在堆栈框架中功能。
当你从函数中返回向量的值时,返回值被视为右值,并且该rvalue保证被移动到已分配的向量(即指针和其他簿记)中。主要。
请注意,有一些名为NRVO的东西,如果编译器能够应用的话。没有移动,只需从函数的堆栈中获取值,并将其放在需要的位置。
好的,从函数返回向量类型是否正确?
当然,它完全没问题
答案 1 :(得分:0)
看起来像x86_64
的gcc在调用者的堆栈上分配返回向量struct并在rax中返回指向它的指针。
movq -48(%rbp), %rax
...
ret